Skip to content

Commit 4714126

Browse files
Don't store ddl on schema definitions
We'll ensure that any consumers that require ddl obtain it by visiting the schema definition. Consequently, we should also stop visiting the schema definition in the "schema definition builder" methods -- callers will need to both build a schema definition, and then visit it using a SchemaCreation object. This means schema definitions will not be populated with SQL type information, or any other information that is set when the definition is visited.
1 parent 0c9e406 commit 4714126

File tree

8 files changed

+23
-66
lines changed

8 files changed

+23
-66
lines changed

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ def visit_AlterTable(o)
2626
sql << o.foreign_key_drops.map { |fk| visit_DropForeignKey fk }.join(" ")
2727
sql << o.check_constraint_adds.map { |con| visit_AddCheckConstraint con }.join(" ")
2828
sql << o.check_constraint_drops.map { |con| visit_DropCheckConstraint con }.join(" ")
29-
o.ddl = sql
3029
end
3130

3231
def visit_ColumnDefinition(o)
@@ -67,7 +66,7 @@ def visit_TableDefinition(o)
6766
create_sql << "(#{statements.join(', ')})" if statements.present?
6867
add_table_options!(create_sql, o)
6968
create_sql << " AS #{to_sql(o.as)}" if o.as
70-
o.ddl = create_sql
69+
create_sql
7170
end
7271

7372
def visit_PrimaryKeyDefinition(o)
@@ -107,8 +106,7 @@ def visit_CreateIndexDefinition(o)
107106
sql << "(#{quoted_columns(index)})"
108107
sql << "WHERE #{index.where}" if supports_partial_index? && index.where
109108

110-
sql = sql.join(" ")
111-
o.ddl = sql
109+
sql.join(" ")
112110
end
113111

114112
def visit_CheckConstraintDefinition(o)

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,11 @@ def aliased_types(name, fallback)
9292

9393
AddColumnDefinition = Struct.new(:column) # :nodoc:
9494

95-
ChangeColumnDefinition = Struct.new(:column, :name, :ddl) # :nodoc:
95+
ChangeColumnDefinition = Struct.new(:column, :name) # :nodoc:
9696

97-
ChangeColumnDefaultDefinition = Struct.new(:column, :default, :ddl) # :nodoc:
97+
ChangeColumnDefaultDefinition = Struct.new(:column, :default) # :nodoc:
9898

99-
CreateIndexDefinition = Struct.new(:index, :algorithm, :if_not_exists, :ddl) # :nodoc:
99+
CreateIndexDefinition = Struct.new(:index, :algorithm, :if_not_exists) # :nodoc:
100100

101101
PrimaryKeyDefinition = Struct.new(:name) # :nodoc:
102102

@@ -335,7 +335,6 @@ class TableDefinition
335335
include ColumnMethods
336336

337337
attr_reader :name, :temporary, :if_not_exists, :options, :as, :comment, :indexes, :foreign_keys, :check_constraints
338-
attr_accessor :ddl
339338

340339
def initialize(
341340
conn,
@@ -582,7 +581,6 @@ class AlterTable # :nodoc:
582581
attr_reader :adds
583582
attr_reader :foreign_key_adds, :foreign_key_drops
584583
attr_reader :check_constraint_adds, :check_constraint_drops
585-
attr_accessor :ddl
586584

587585
def initialize(td)
588586
@td = td

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

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ def create_table(table_name, id: :primary_key, primary_key: nil, force: nil, **o
299299
schema_cache.clear_data_source_cache!(table_name.to_s)
300300
end
301301

302-
result = execute(td.ddl)
302+
result = execute schema_creation.accept(td)
303303

304304
unless supports_indexes_in_create?
305305
td.indexes.each do |column_name, index_options|
@@ -329,7 +329,6 @@ def build_create_table_definition(table_name, id: :primary_key, primary_key: nil
329329

330330
yield table_definition if block_given?
331331

332-
schema_creation.accept(table_definition)
333332
table_definition
334333
end
335334

@@ -620,7 +619,7 @@ def add_column(table_name, column_name, type, **options)
620619
add_column_def = build_add_column_definition(table_name, column_name, type, **options)
621620
return unless add_column_def
622621

623-
execute(add_column_def.ddl)
622+
execute schema_creation.accept(add_column_def)
624623
end
625624

626625
def add_columns(table_name, *column_names, type:, **options) # :nodoc:
@@ -645,7 +644,6 @@ def build_add_column_definition(table_name, column_name, type, **options) # :nod
645644

646645
alter_table = create_alter_table(table_name)
647646
alter_table.add_column(column_name, type, **options)
648-
schema_creation.accept(alter_table)
649647
alter_table
650648
end
651649

@@ -875,7 +873,7 @@ def rename_column(table_name, column_name, new_column_name)
875873
# For more information see the {"Transactional Migrations" section}[rdoc-ref:Migration].
876874
def add_index(table_name, column_name, **options)
877875
create_index = build_create_index_definition(table_name, column_name, **options)
878-
execute(create_index.ddl)
876+
execute schema_creation.accept(create_index)
879877
end
880878

881879
# Builds a CreateIndexDefinition object.
@@ -885,10 +883,7 @@ def add_index(table_name, column_name, **options)
885883
# passing a +table_name+, +column_name+, and other additional options that can be passed.
886884
def build_create_index_definition(table_name, column_name, **options) # :nodoc:
887885
index, algorithm, if_not_exists = add_index_options(table_name, column_name, **options)
888-
889-
create_index = CreateIndexDefinition.new(index, algorithm, if_not_exists)
890-
schema_creation.accept(create_index)
891-
create_index
886+
CreateIndexDefinition.new(index, algorithm, if_not_exists)
892887
end
893888

894889
# Removes the given index from the table.
@@ -1715,7 +1710,7 @@ def add_column_for_alter(table_name, column_name, type, **options)
17151710

17161711
def change_column_default_for_alter(table_name, column_name, default_or_changes)
17171712
cd = build_change_column_default_definition(table_name, column_name, default_or_changes)
1718-
cd.ddl
1713+
schema_creation.accept(cd)
17191714
end
17201715

17211716
def rename_column_sql(table_name, column_name, new_column_name)

activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -355,10 +355,7 @@ def build_change_column_default_definition(table_name, column_name, default_or_c
355355
return unless column
356356

357357
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
358+
ChangeColumnDefaultDefinition.new(column, default)
362359
end
363360

364361
def change_column_null(table_name, column_name, null, default = nil) # :nodoc:
@@ -411,10 +408,7 @@ def build_change_column_definition(table_name, column_name, type, **options) # :
411408

412409
td = create_table_definition(table_name)
413410
cd = td.new_column_definition(column.name, type, **options)
414-
change_column_def = ChangeColumnDefinition.new(cd, column.name)
415-
schema_creation.accept(change_column_def)
416-
417-
change_column_def
411+
ChangeColumnDefinition.new(cd, column.name)
418412
end
419413

420414
def rename_column(table_name, column_name, new_column_name) # :nodoc:
@@ -426,17 +420,15 @@ def add_index(table_name, column_name, **options) # :nodoc:
426420
create_index = build_create_index_definition(table_name, column_name, **options)
427421
return unless create_index
428422

429-
execute(create_index.ddl)
423+
execute schema_creation.accept(create_index)
430424
end
431425

432426
def build_create_index_definition(table_name, column_name, **options) # :nodoc:
433427
index, algorithm, if_not_exists = add_index_options(table_name, column_name, **options)
434428

435429
return if if_not_exists && index_exists?(table_name, column_name, name: index.name)
436430

437-
create_index = CreateIndexDefinition.new(index, algorithm)
438-
schema_creation.accept(create_index)
439-
create_index
431+
CreateIndexDefinition.new(index, algorithm)
440432
end
441433

442434
def add_sql_comment!(sql, comment) # :nodoc:
@@ -782,7 +774,7 @@ def translate_exception(exception, message:, sql:, binds:)
782774

783775
def change_column_for_alter(table_name, column_name, type, **options)
784776
cd = build_change_column_definition(table_name, column_name, type, **options)
785-
cd.ddl
777+
schema_creation.accept(cd)
786778
end
787779

788780
def rename_column_for_alter(table_name, column_name, new_column_name)

activerecord/lib/active_record/connection_adapters/mysql/schema_creation.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def visit_AddColumnDefinition(o)
2121

2222
def visit_ChangeColumnDefinition(o)
2323
change_column_sql = +"CHANGE #{quote_column_name(o.name)} #{accept(o.column)}"
24-
o.ddl = add_column_position!(change_column_sql, column_options(o.column))
24+
add_column_position!(change_column_sql, column_options(o.column))
2525
end
2626

2727
def visit_ChangeColumnDefaultDefinition(o)
@@ -31,13 +31,12 @@ def visit_ChangeColumnDefaultDefinition(o)
3131
else
3232
sql << quote_default_expression(o.default, o.column)
3333
end
34-
o.ddl = sql
3534
end
3635

3736
def visit_CreateIndexDefinition(o)
3837
sql = visit_IndexDefinition(o.index, true)
3938
sql << " #{o.algorithm}" if o.algorithm
40-
o.ddl = sql
39+
sql
4140
end
4241

4342
def visit_IndexDefinition(o, create = false)

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ def visit_AlterTable(o)
1010
sql << o.constraint_validations.map { |fk| visit_ValidateConstraint fk }.join(" ")
1111
sql << o.exclusion_constraint_adds.map { |con| visit_AddExclusionConstraint con }.join(" ")
1212
sql << o.exclusion_constraint_drops.map { |con| visit_DropExclusionConstraint con }.join(" ")
13-
o.ddl = sql
1413
end
1514

1615
def visit_AddForeignKey(o)
@@ -84,7 +83,7 @@ def visit_ChangeColumnDefinition(o)
8483
change_column_sql << ", ALTER COLUMN #{quoted_column_name} #{options[:null] ? 'DROP' : 'SET'} NOT NULL"
8584
end
8685

87-
o.ddl = change_column_sql
86+
change_column_sql
8887
end
8988

9089
def visit_ChangeColumnDefaultDefinition(o)
@@ -94,7 +93,6 @@ def visit_ChangeColumnDefaultDefinition(o)
9493
else
9594
sql << "SET DEFAULT #{quote_default_expression(o.default, o.column)}"
9695
end
97-
o.ddl = sql
9896
end
9997

10098
def add_column_options!(sql, options)

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

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -417,10 +417,7 @@ def change_column(table_name, column_name, type, **options) # :nodoc:
417417
def build_change_column_definition(table_name, column_name, type, **options) # :nodoc:
418418
td = create_table_definition(table_name)
419419
cd = td.new_column_definition(column_name, type, **options)
420-
change_column_def = ChangeColumnDefinition.new(cd, column_name)
421-
schema_creation.accept(change_column_def)
422-
423-
change_column_def
420+
ChangeColumnDefinition.new(cd, column_name)
424421
end
425422

426423
# Changes the default value of a table column.
@@ -433,10 +430,7 @@ def build_change_column_default_definition(table_name, column_name, default_or_c
433430
return unless column
434431

435432
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
433+
ChangeColumnDefaultDefinition.new(column, default)
440434
end
441435

442436
def change_column_null(table_name, column_name, null, default = nil) # :nodoc:
@@ -473,7 +467,7 @@ def rename_column(table_name, column_name, new_column_name) # :nodoc:
473467

474468
def add_index(table_name, column_name, **options) # :nodoc:
475469
create_index = build_create_index_definition(table_name, column_name, **options)
476-
result = execute(create_index.ddl)
470+
result = execute schema_creation.accept(create_index)
477471

478472
index = create_index.index
479473
execute "COMMENT ON INDEX #{quote_column_name(index.name)} IS #{quote(index.comment)}" if index.comment
@@ -482,10 +476,7 @@ def add_index(table_name, column_name, **options) # :nodoc:
482476

483477
def build_create_index_definition(table_name, column_name, **options) # :nodoc:
484478
index, algorithm, if_not_exists = add_index_options(table_name, column_name, **options)
485-
486-
create_index = CreateIndexDefinition.new(index, algorithm, if_not_exists)
487-
schema_creation.accept(create_index)
488-
create_index
479+
CreateIndexDefinition.new(index, algorithm, if_not_exists)
489480
end
490481

491482
def remove_index(table_name, column_name = nil, **options) # :nodoc:
@@ -861,7 +852,7 @@ def add_column_for_alter(table_name, column_name, type, **options)
861852

862853
def change_column_for_alter(table_name, column_name, type, **options)
863854
change_col_def = build_change_column_definition(table_name, column_name, type, **options)
864-
sqls = [change_col_def.ddl]
855+
sqls = [schema_creation.accept(change_col_def)]
865856
sqls << Proc.new { change_column_comment(table_name, column_name, options[:comment]) } if options.key?(:comment)
866857
sqls
867858
end

activerecord/test/cases/migration/schema_definitions_test.rb

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,16 @@ def test_build_create_table_definition_with_block
1818

1919
id_column = td.columns.find { |col| col.name == "id" }
2020
assert_predicate id_column, :present?
21-
assert id_column.type
22-
assert id_column.sql_type
2321

2422
foo_column = td.columns.find { |col| col.name == "foo" }
2523
assert_predicate foo_column, :present?
26-
assert foo_column.type
27-
assert foo_column.sql_type
2824
end
2925

3026
def test_build_create_table_definition_without_block
3127
td = connection.build_create_table_definition(:test)
3228

3329
id_column = td.columns.find { |col| col.name == "id" }
3430
assert_predicate id_column, :present?
35-
assert id_column.type
36-
assert id_column.sql_type
3731
end
3832

3933
def test_build_create_join_table_definition_with_block
@@ -64,7 +58,6 @@ def test_build_create_index_definition
6458
end
6559
create_index = connection.build_create_index_definition(:test, :foo)
6660

67-
assert_match "CREATE INDEX", create_index.ddl
6861
assert_equal "index_test_on_foo", create_index.index.name
6962
ensure
7063
connection.drop_table(:test) if connection.table_exists?(:test)
@@ -91,12 +84,8 @@ def test_build_change_column_definition
9184
end
9285

9386
change_cd = connection.build_change_column_definition(:test, :foo, :integer)
94-
assert change_cd.ddl
95-
9687
change_col = change_cd.column
9788
assert_equal "foo", change_col.name.to_s
98-
assert change_col.type
99-
assert change_col.sql_type
10089
ensure
10190
connection.drop_table(:test) if connection.table_exists?(:test)
10291
end
@@ -107,13 +96,10 @@ def test_build_change_column_default_definition
10796
end
10897

10998
change_default_cd = connection.build_change_column_default_definition(:test, :foo, "new")
110-
assert_match "SET DEFAULT 'new'", change_default_cd.ddl
11199
assert_equal "new", change_default_cd.default
112100

113101
change_col = change_default_cd.column
114102
assert_equal "foo", change_col.name.to_s
115-
assert change_col.type
116-
assert change_col.sql_type
117103
ensure
118104
connection.drop_table(:test) if connection.table_exists?(:test)
119105
end

0 commit comments

Comments
 (0)