Skip to content

Commit 0c9e406

Browse files
authored
Merge pull request rails#45751 from adrianna-chang-shopify/ac-build-change-column-default-definition
Define #build_change_column_definition for MySQL and PG
2 parents a0c1d33 + 7455336 commit 0c9e406

File tree

4 files changed

+50
-5
lines changed

4 files changed

+50
-5
lines changed

activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,15 @@ def change_column_default(table_name, column_name, default_or_changes)
714714
raise NotImplementedError, "change_column_default is not implemented"
715715
end
716716

717+
# Builds a ChangeColumnDefaultDefinition object.
718+
#
719+
# This definition object contains information about the column change that would occur
720+
# if the same arguments were passed to #change_column_default. See #change_column_default for
721+
# information about passing a +table_name+, +column_name+, +type+ and other options that can be passed.
722+
def build_change_column_default_definition(table_name, column_name, default_or_changes) # :nodoc:
723+
raise NotImplementedError, "build_change_column_default_definition is not implemented"
724+
end
725+
717726
# Sets or removes a <tt>NOT NULL</tt> constraint on a column. The +null+ flag
718727
# indicates whether the value can be +NULL+. For example
719728
#
@@ -1705,11 +1714,8 @@ def add_column_for_alter(table_name, column_name, type, **options)
17051714
end
17061715

17071716
def change_column_default_for_alter(table_name, column_name, default_or_changes)
1708-
column = column_for(table_name, column_name)
1709-
return unless column
1710-
1711-
default = extract_new_default_value(default_or_changes)
1712-
schema_creation.accept(ChangeColumnDefaultDefinition.new(column, default))
1717+
cd = build_change_column_default_definition(table_name, column_name, default_or_changes)
1718+
cd.ddl
17131719
end
17141720

17151721
def rename_column_sql(table_name, column_name, new_column_name)

activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,17 @@ def change_column_default(table_name, column_name, default_or_changes) # :nodoc:
350350
execute "ALTER TABLE #{quote_table_name(table_name)} #{change_column_default_for_alter(table_name, column_name, default_or_changes)}"
351351
end
352352

353+
def build_change_column_default_definition(table_name, column_name, default_or_changes) # :nodoc:
354+
column = column_for(table_name, column_name)
355+
return unless column
356+
357+
default = extract_new_default_value(default_or_changes)
358+
change_column_default_definition = ChangeColumnDefaultDefinition.new(column, default)
359+
schema_creation.accept(change_column_default_definition)
360+
361+
change_column_default_definition
362+
end
363+
353364
def change_column_null(table_name, column_name, null, default = nil) # :nodoc:
354365
validate_change_column_null_argument!(null)
355366

activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,17 @@ def change_column_default(table_name, column_name, default_or_changes) # :nodoc:
428428
execute "ALTER TABLE #{quote_table_name(table_name)} #{change_column_default_for_alter(table_name, column_name, default_or_changes)}"
429429
end
430430

431+
def build_change_column_default_definition(table_name, column_name, default_or_changes) # :nodoc:
432+
column = column_for(table_name, column_name)
433+
return unless column
434+
435+
default = extract_new_default_value(default_or_changes)
436+
change_column_default_definition = ChangeColumnDefaultDefinition.new(column, default)
437+
schema_creation.accept(change_column_default_definition)
438+
439+
change_column_default_definition
440+
end
441+
431442
def change_column_null(table_name, column_name, null, default = nil) # :nodoc:
432443
validate_change_column_null_argument!(null)
433444

activerecord/test/cases/migration/schema_definitions_test.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,23 @@ def test_build_change_column_definition
100100
ensure
101101
connection.drop_table(:test) if connection.table_exists?(:test)
102102
end
103+
104+
def test_build_change_column_default_definition
105+
connection.create_table(:test) do |t|
106+
t.column :foo, :string
107+
end
108+
109+
change_default_cd = connection.build_change_column_default_definition(:test, :foo, "new")
110+
assert_match "SET DEFAULT 'new'", change_default_cd.ddl
111+
assert_equal "new", change_default_cd.default
112+
113+
change_col = change_default_cd.column
114+
assert_equal "foo", change_col.name.to_s
115+
assert change_col.type
116+
assert change_col.sql_type
117+
ensure
118+
connection.drop_table(:test) if connection.table_exists?(:test)
119+
end
103120
end
104121
end
105122
end

0 commit comments

Comments
 (0)