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.
This commit is contained in:
Adrianna Chang 2022-08-05 12:07:28 -04:00
parent 0c9e4069f7
commit 47141261c3
8 changed files with 23 additions and 66 deletions

@ -26,7 +26,6 @@ def visit_AlterTable(o)
sql << o.foreign_key_drops.map { |fk| visit_DropForeignKey fk }.join(" ")
sql << o.check_constraint_adds.map { |con| visit_AddCheckConstraint con }.join(" ")
sql << o.check_constraint_drops.map { |con| visit_DropCheckConstraint con }.join(" ")
o.ddl = sql
end
def visit_ColumnDefinition(o)
@ -67,7 +66,7 @@ def visit_TableDefinition(o)
create_sql << "(#{statements.join(', ')})" if statements.present?
add_table_options!(create_sql, o)
create_sql << " AS #{to_sql(o.as)}" if o.as
o.ddl = create_sql
create_sql
end
def visit_PrimaryKeyDefinition(o)
@ -107,8 +106,7 @@ def visit_CreateIndexDefinition(o)
sql << "(#{quoted_columns(index)})"
sql << "WHERE #{index.where}" if supports_partial_index? && index.where
sql = sql.join(" ")
o.ddl = sql
sql.join(" ")
end
def visit_CheckConstraintDefinition(o)

@ -92,11 +92,11 @@ def aliased_types(name, fallback)
AddColumnDefinition = Struct.new(:column) # :nodoc:
ChangeColumnDefinition = Struct.new(:column, :name, :ddl) # :nodoc:
ChangeColumnDefinition = Struct.new(:column, :name) # :nodoc:
ChangeColumnDefaultDefinition = Struct.new(:column, :default, :ddl) # :nodoc:
ChangeColumnDefaultDefinition = Struct.new(:column, :default) # :nodoc:
CreateIndexDefinition = Struct.new(:index, :algorithm, :if_not_exists, :ddl) # :nodoc:
CreateIndexDefinition = Struct.new(:index, :algorithm, :if_not_exists) # :nodoc:
PrimaryKeyDefinition = Struct.new(:name) # :nodoc:
@ -335,7 +335,6 @@ class TableDefinition
include ColumnMethods
attr_reader :name, :temporary, :if_not_exists, :options, :as, :comment, :indexes, :foreign_keys, :check_constraints
attr_accessor :ddl
def initialize(
conn,
@ -582,7 +581,6 @@ class AlterTable # :nodoc:
attr_reader :adds
attr_reader :foreign_key_adds, :foreign_key_drops
attr_reader :check_constraint_adds, :check_constraint_drops
attr_accessor :ddl
def initialize(td)
@td = td

@ -299,7 +299,7 @@ def create_table(table_name, id: :primary_key, primary_key: nil, force: nil, **o
schema_cache.clear_data_source_cache!(table_name.to_s)
end
result = execute(td.ddl)
result = execute schema_creation.accept(td)
unless supports_indexes_in_create?
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
yield table_definition if block_given?
schema_creation.accept(table_definition)
table_definition
end
@ -620,7 +619,7 @@ def add_column(table_name, column_name, type, **options)
add_column_def = build_add_column_definition(table_name, column_name, type, **options)
return unless add_column_def
execute(add_column_def.ddl)
execute schema_creation.accept(add_column_def)
end
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
alter_table = create_alter_table(table_name)
alter_table.add_column(column_name, type, **options)
schema_creation.accept(alter_table)
alter_table
end
@ -875,7 +873,7 @@ def rename_column(table_name, column_name, new_column_name)
# For more information see the {"Transactional Migrations" section}[rdoc-ref:Migration].
def add_index(table_name, column_name, **options)
create_index = build_create_index_definition(table_name, column_name, **options)
execute(create_index.ddl)
execute schema_creation.accept(create_index)
end
# Builds a CreateIndexDefinition object.
@ -885,10 +883,7 @@ def add_index(table_name, column_name, **options)
# passing a +table_name+, +column_name+, and other additional options that can be passed.
def build_create_index_definition(table_name, column_name, **options) # :nodoc:
index, algorithm, if_not_exists = add_index_options(table_name, column_name, **options)
create_index = CreateIndexDefinition.new(index, algorithm, if_not_exists)
schema_creation.accept(create_index)
create_index
CreateIndexDefinition.new(index, algorithm, if_not_exists)
end
# Removes the given index from the table.
@ -1715,7 +1710,7 @@ def add_column_for_alter(table_name, column_name, type, **options)
def change_column_default_for_alter(table_name, column_name, default_or_changes)
cd = build_change_column_default_definition(table_name, column_name, default_or_changes)
cd.ddl
schema_creation.accept(cd)
end
def rename_column_sql(table_name, column_name, new_column_name)

@ -355,10 +355,7 @@ def build_change_column_default_definition(table_name, column_name, default_or_c
return unless column
default = extract_new_default_value(default_or_changes)
change_column_default_definition = ChangeColumnDefaultDefinition.new(column, default)
schema_creation.accept(change_column_default_definition)
change_column_default_definition
ChangeColumnDefaultDefinition.new(column, default)
end
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) # :
td = create_table_definition(table_name)
cd = td.new_column_definition(column.name, type, **options)
change_column_def = ChangeColumnDefinition.new(cd, column.name)
schema_creation.accept(change_column_def)
change_column_def
ChangeColumnDefinition.new(cd, column.name)
end
def rename_column(table_name, column_name, new_column_name) # :nodoc:
@ -426,7 +420,7 @@ def add_index(table_name, column_name, **options) # :nodoc:
create_index = build_create_index_definition(table_name, column_name, **options)
return unless create_index
execute(create_index.ddl)
execute schema_creation.accept(create_index)
end
def build_create_index_definition(table_name, column_name, **options) # :nodoc:
@ -434,9 +428,7 @@ def build_create_index_definition(table_name, column_name, **options) # :nodoc:
return if if_not_exists && index_exists?(table_name, column_name, name: index.name)
create_index = CreateIndexDefinition.new(index, algorithm)
schema_creation.accept(create_index)
create_index
CreateIndexDefinition.new(index, algorithm)
end
def add_sql_comment!(sql, comment) # :nodoc:
@ -782,7 +774,7 @@ def translate_exception(exception, message:, sql:, binds:)
def change_column_for_alter(table_name, column_name, type, **options)
cd = build_change_column_definition(table_name, column_name, type, **options)
cd.ddl
schema_creation.accept(cd)
end
def rename_column_for_alter(table_name, column_name, new_column_name)

@ -21,7 +21,7 @@ def visit_AddColumnDefinition(o)
def visit_ChangeColumnDefinition(o)
change_column_sql = +"CHANGE #{quote_column_name(o.name)} #{accept(o.column)}"
o.ddl = add_column_position!(change_column_sql, column_options(o.column))
add_column_position!(change_column_sql, column_options(o.column))
end
def visit_ChangeColumnDefaultDefinition(o)
@ -31,13 +31,12 @@ def visit_ChangeColumnDefaultDefinition(o)
else
sql << quote_default_expression(o.default, o.column)
end
o.ddl = sql
end
def visit_CreateIndexDefinition(o)
sql = visit_IndexDefinition(o.index, true)
sql << " #{o.algorithm}" if o.algorithm
o.ddl = sql
sql
end
def visit_IndexDefinition(o, create = false)

@ -10,7 +10,6 @@ def visit_AlterTable(o)
sql << o.constraint_validations.map { |fk| visit_ValidateConstraint fk }.join(" ")
sql << o.exclusion_constraint_adds.map { |con| visit_AddExclusionConstraint con }.join(" ")
sql << o.exclusion_constraint_drops.map { |con| visit_DropExclusionConstraint con }.join(" ")
o.ddl = sql
end
def visit_AddForeignKey(o)
@ -84,7 +83,7 @@ def visit_ChangeColumnDefinition(o)
change_column_sql << ", ALTER COLUMN #{quoted_column_name} #{options[:null] ? 'DROP' : 'SET'} NOT NULL"
end
o.ddl = change_column_sql
change_column_sql
end
def visit_ChangeColumnDefaultDefinition(o)
@ -94,7 +93,6 @@ def visit_ChangeColumnDefaultDefinition(o)
else
sql << "SET DEFAULT #{quote_default_expression(o.default, o.column)}"
end
o.ddl = sql
end
def add_column_options!(sql, options)

@ -417,10 +417,7 @@ def change_column(table_name, column_name, type, **options) # :nodoc:
def build_change_column_definition(table_name, column_name, type, **options) # :nodoc:
td = create_table_definition(table_name)
cd = td.new_column_definition(column_name, type, **options)
change_column_def = ChangeColumnDefinition.new(cd, column_name)
schema_creation.accept(change_column_def)
change_column_def
ChangeColumnDefinition.new(cd, column_name)
end
# 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
return unless column
default = extract_new_default_value(default_or_changes)
change_column_default_definition = ChangeColumnDefaultDefinition.new(column, default)
schema_creation.accept(change_column_default_definition)
change_column_default_definition
ChangeColumnDefaultDefinition.new(column, default)
end
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:
def add_index(table_name, column_name, **options) # :nodoc:
create_index = build_create_index_definition(table_name, column_name, **options)
result = execute(create_index.ddl)
result = execute schema_creation.accept(create_index)
index = create_index.index
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:
def build_create_index_definition(table_name, column_name, **options) # :nodoc:
index, algorithm, if_not_exists = add_index_options(table_name, column_name, **options)
create_index = CreateIndexDefinition.new(index, algorithm, if_not_exists)
schema_creation.accept(create_index)
create_index
CreateIndexDefinition.new(index, algorithm, if_not_exists)
end
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)
def change_column_for_alter(table_name, column_name, type, **options)
change_col_def = build_change_column_definition(table_name, column_name, type, **options)
sqls = [change_col_def.ddl]
sqls = [schema_creation.accept(change_col_def)]
sqls << Proc.new { change_column_comment(table_name, column_name, options[:comment]) } if options.key?(:comment)
sqls
end

@ -18,13 +18,9 @@ def test_build_create_table_definition_with_block
id_column = td.columns.find { |col| col.name == "id" }
assert_predicate id_column, :present?
assert id_column.type
assert id_column.sql_type
foo_column = td.columns.find { |col| col.name == "foo" }
assert_predicate foo_column, :present?
assert foo_column.type
assert foo_column.sql_type
end
def test_build_create_table_definition_without_block
@ -32,8 +28,6 @@ def test_build_create_table_definition_without_block
id_column = td.columns.find { |col| col.name == "id" }
assert_predicate id_column, :present?
assert id_column.type
assert id_column.sql_type
end
def test_build_create_join_table_definition_with_block
@ -64,7 +58,6 @@ def test_build_create_index_definition
end
create_index = connection.build_create_index_definition(:test, :foo)
assert_match "CREATE INDEX", create_index.ddl
assert_equal "index_test_on_foo", create_index.index.name
ensure
connection.drop_table(:test) if connection.table_exists?(:test)
@ -91,12 +84,8 @@ def test_build_change_column_definition
end
change_cd = connection.build_change_column_definition(:test, :foo, :integer)
assert change_cd.ddl
change_col = change_cd.column
assert_equal "foo", change_col.name.to_s
assert change_col.type
assert change_col.sql_type
ensure
connection.drop_table(:test) if connection.table_exists?(:test)
end
@ -107,13 +96,10 @@ def test_build_change_column_default_definition
end
change_default_cd = connection.build_change_column_default_definition(:test, :foo, "new")
assert_match "SET DEFAULT 'new'", change_default_cd.ddl
assert_equal "new", change_default_cd.default
change_col = change_default_cd.column
assert_equal "foo", change_col.name.to_s
assert change_col.type
assert change_col.sql_type
ensure
connection.drop_table(:test) if connection.table_exists?(:test)
end