Skip to content

Commit fea5966

Browse files
committed
constrains bug
1 parent bbb3310 commit fea5966

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,18 +141,17 @@ def change_column(table_name, column_name, type, options = {})
141141
sql_commands = []
142142
indexes = []
143143
column_object = schema_cache.columns(table_name).find { |c| c.name.to_s == column_name.to_s }
144-
if options_include_default?(options) || (column_object && column_object.type != type.to_sym)
144+
if without_constraints?(options) || (column_object && column_object.type != type.to_sym)
145145
remove_default_constraint(table_name, column_name)
146146
indexes = indexes(table_name).select { |index| index.columns.include?(column_name.to_s) }
147147
remove_indexes(table_name, column_name)
148148
end
149149
sql_commands << "UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote_default_expression(options[:default], column_object)} WHERE #{quote_column_name(column_name)} IS NULL" if !options[:null].nil? && options[:null] == false && !options[:default].nil?
150150
sql_commands << "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} #{type_to_sql(type, limit: options[:limit], precision: options[:precision], scale: options[:scale])}"
151151
sql_commands.last << ' NOT NULL' if !options[:null].nil? && options[:null] == false
152-
if options.key?(:default) && default_constraint_name(table_name, column_name).present?
153-
change_column_default(table_name, column_name, options[:default])
154-
elsif options_include_default?(options)
155-
sql_commands << "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{default_constraint_name(table_name, column_name)} DEFAULT #{quote_default_expression(options[:default], column_object)} FOR #{quote_column_name(column_name)}"
152+
if without_constraints?(options)
153+
default = quote_default_expression(options[:default], column_object || column_for(table_name, column_name))
154+
sql_commands << "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{default_constraint_name(table_name, column_name)} DEFAULT #{default} FOR #{quote_column_name(column_name)}"
156155
end
157156
# Add any removed indexes back
158157
indexes.each do |index|
@@ -492,6 +491,10 @@ def default_constraint_name(table_name, column_name)
492491
"DF_#{table_name}_#{column_name}"
493492
end
494493

494+
def without_constraints?(options)
495+
options.key?(:default) || (options.key?(:limit) && options.key?(:default))
496+
end
497+
495498
def lowercase_schema_reflection_sql(node)
496499
lowercase_schema_reflection ? "LOWER(#{node})" : node
497500
end

test/cases/migration_test_sqlserver.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ class MigrationTestSQLServer < ActiveRecord::TestCase
5757
assert default_after
5858
assert_equal default_before['constraint_keys'], default_after['constraint_keys']
5959
end
60+
61+
it 'change limit' do
62+
assert_nothing_raised { connection.change_column :people, :lock_version, :integer, limit: 8 }
63+
end
64+
65+
it 'change null and default' do
66+
assert_nothing_raised { connection.change_column :people, :first_name, :text, null: true, default: nil }
67+
end
6068

6169
end
6270

0 commit comments

Comments
 (0)