diff --git a/migrations/config/intermediate_db.yml b/migrations/config/intermediate_db.yml index b3300526e1e..004dbe54b86 100644 --- a/migrations/config/intermediate_db.yml +++ b/migrations/config/intermediate_db.yml @@ -41,6 +41,8 @@ schema: - name: "id" datatype: numeric rename_to: "original_id" + - name: "created_at" + nullable: true - name_regex: ".*upload.*_id$" datatype: text - name_regex: ".*_id$" diff --git a/migrations/config/json_schemas/db_schema.json b/migrations/config/json_schemas/db_schema.json index 7fecc9b887b..91f2dcf51b2 100644 --- a/migrations/config/json_schemas/db_schema.json +++ b/migrations/config/json_schemas/db_schema.json @@ -83,12 +83,26 @@ }, "datatype": { "$ref": "#/$defs/datatypes" + }, + "nullable": { + "type": "boolean" } }, "additionalProperties": false, "required": [ - "name", - "datatype" + "name" + ], + "anyOf": [ + { + "required": [ + "datatype" + ] + }, + { + "required": [ + "nullable" + ] + } ] } }, @@ -191,6 +205,9 @@ }, "rename_to": { "type": "string" + }, + "nullable": { + "type": "boolean" } }, "additionalProperties": false, @@ -204,6 +221,11 @@ "required": [ "rename_to" ] + }, + { + "required": [ + "nullable" + ] } ], "oneOf": [ diff --git a/migrations/db/intermediate_db_schema/100-base-schema.sql b/migrations/db/intermediate_db_schema/100-base-schema.sql index 01af108251a..7003e6c2770 100644 --- a/migrations/db/intermediate_db_schema/100-base-schema.sql +++ b/migrations/db/intermediate_db_schema/100-base-schema.sql @@ -5,7 +5,7 @@ CREATE TABLE user_emails ( email TEXT NOT NULL PRIMARY KEY, - created_at DATETIME NOT NULL, + created_at DATETIME, "primary" BOOLEAN, user_id NUMERIC NOT NULL ); @@ -80,7 +80,7 @@ CREATE TABLE users approved BOOLEAN, approved_at DATETIME, approved_by_id NUMERIC, - created_at DATETIME NOT NULL, + created_at DATETIME, date_of_birth DATE, first_seen_at DATETIME, flair_group_id NUMERIC, diff --git a/migrations/lib/database/intermediate_db/user.rb b/migrations/lib/database/intermediate_db/user.rb index 01a1c079d32..583b78646a1 100644 --- a/migrations/lib/database/intermediate_db/user.rb +++ b/migrations/lib/database/intermediate_db/user.rb @@ -48,7 +48,7 @@ module Migrations::Database::IntermediateDB approved: nil, approved_at: nil, approved_by_id: nil, - created_at:, + created_at: nil, date_of_birth: nil, first_seen_at: nil, flair_group_id: nil, diff --git a/migrations/lib/database/intermediate_db/user_email.rb b/migrations/lib/database/intermediate_db/user_email.rb index e8ec92938d8..eab72dcfd38 100644 --- a/migrations/lib/database/intermediate_db/user_email.rb +++ b/migrations/lib/database/intermediate_db/user_email.rb @@ -18,7 +18,7 @@ module Migrations::Database::IntermediateDB ) SQL - def self.create(email:, created_at:, primary: nil, user_id:) + def self.create(email:, created_at: nil, primary: nil, user_id:) ::Migrations::Database::IntermediateDB.insert( SQL, email, diff --git a/migrations/lib/database/schema/global_config.rb b/migrations/lib/database/schema/global_config.rb index a1d2f1c8d5d..9d8ef793e7c 100644 --- a/migrations/lib/database/schema/global_config.rb +++ b/migrations/lib/database/schema/global_config.rb @@ -27,6 +27,12 @@ module Migrations::Database::Schema end end + def modified_nullable(column_name) + if (modified_column = find_modified_column(column_name)) + modified_column[:nullable] + end + end + private def find_modified_column(column_name) diff --git a/migrations/lib/database/schema/loader.rb b/migrations/lib/database/schema/loader.rb index 765f6734d04..702d44f5d9a 100644 --- a/migrations/lib/database/schema/loader.rb +++ b/migrations/lib/database/schema/loader.rb @@ -45,7 +45,7 @@ module Migrations::Database::Schema Column.new( name: name_for(column), datatype: datatype_for(column), - nullable: column.null || column.default, + nullable: nullable_for(column, config), max_length: column.type == :text ? column.limit : nil, is_primary_key: primary_key_column_names.include?(column.name), ) @@ -102,6 +102,16 @@ module Migrations::Database::Schema end end + def nullable_for(column, config) + modified_column = config.dig(:columns, :modify)&.find { |col| col[:name] == column.name } + return modified_column[:nullable] if modified_column&.key?(:nullable) + + global_nullable = @global.modified_nullable(column.name) + return global_nullable unless global_nullable.nil? + + column.null || column.default.present? + end + def indexes(config) config[:indexes]&.map do |index| Index.new(