Skip to content

Commit f6a46f6

Browse files
committed
constrains bug
1 parent bbb3310 commit f6a46f6

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,18 +141,18 @@ 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+
without_constraints = options.key?(:default) || options.key?(:limit) || (column_object && column_object.type != type.to_sym)
145+
if without_constraints
145146
remove_default_constraint(table_name, column_name)
146147
indexes = indexes(table_name).select { |index| index.columns.include?(column_name.to_s) }
147148
remove_indexes(table_name, column_name)
148149
end
149150
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?
150151
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])}"
151152
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)}"
153+
if without_constraints
154+
default = quote_default_expression(options[:default], column_object || column_for(table_name, column_name))
155+
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)}"
156156
end
157157
# Add any removed indexes back
158158
indexes.each do |index|

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)