public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
MySQL: rename_column preserves default values.  [#466 state:resolved]
Diego Algorta (author)
Sat Jun 21 16:18:30 -0700 2008
jeremy (committer)
Sun Jun 22 15:21:11 -0700 2008
commit  2e1b56c93745bf0513e449e95830edd390abfaf2
tree    52ca66c284130235b34b8728d30ef5563fe7cbc5
parent  a02d672cd7aead8a24e3b10a6b8e12dd91ee0a49
...
1
2
 
 
3
4
5
...
1
2
3
4
5
6
7
0
@@ -1,5 +1,7 @@
0
 *Edge*
0
 
0
+* MySQL: rename_column preserves column defaults.  #466 [Diego Algorta]
0
+
0
 * Add :from option to calculations.  #397 [Ben Munat]
0
 
0
 * Add :validate option to associations to enable/disable the automatic validation of associated models. Resolves #301. [Jan De Poorter]
...
450
451
452
 
 
 
 
 
 
453
454
 
 
 
455
456
457
...
450
451
452
453
454
455
456
457
458
459
 
460
461
462
463
464
465
0
@@ -450,8 +450,16 @@ module ActiveRecord
0
       end
0
 
0
       def rename_column(table_name, column_name, new_column_name) #:nodoc:
0
+        options = {}
0
+        if column = columns(table_name).find { |c| c.name == column_name.to_s }
0
+          options[:default] = column.default
0
+        else
0
+          raise ActiveRecordError, "No such column: #{table_name}.#{column_name}"
0
+        end
0
         current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'")["Type"]
0
-        execute "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
0
+        rename_column_sql = "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
0
+        add_column_options!(rename_column_sql, options)
0
+        execute(rename_column_sql)
0
       end
0
 
0
       # Maps logical Rails types to MySQL-specific data types.
...
483
484
485
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
486
487
488
...
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
0
@@ -483,6 +483,32 @@ if ActiveRecord::Base.connection.supports_migrations?
0
       end
0
     end
0
 
0
+    def test_rename_column_preserves_default_value_not_null
0
+      begin
0
+        default_before = Developer.connection.columns("developers").find { |c| c.name == "salary" }.default
0
+        assert_equal 70000, default_before
0
+        Developer.connection.rename_column "developers", "salary", "anual_salary"
0
+        Developer.reset_column_information
0
+        assert Developer.column_names.include?("anual_salary")
0
+        default_after = Developer.connection.columns("developers").find { |c| c.name == "anual_salary" }.default
0
+        assert_equal 70000, default_after
0
+      ensure
0
+        Developer.connection.rename_column "developers", "anual_salary", "salary"
0
+        Developer.reset_column_information
0
+      end
0
+    end
0
+
0
+    def test_rename_nonexistent_column
0
+      ActiveRecord::Base.connection.create_table(:hats) do |table|
0
+        table.column :hat_name, :string, :default => nil
0
+      end
0
+      assert_raises(ActiveRecord::ActiveRecordError) do
0
+        Person.connection.rename_column "hats", "nonexistent", "should_fail"
0
+      end
0
+    ensure
0
+      ActiveRecord::Base.connection.drop_table(:hats)
0
+    end
0
+
0
     def test_rename_column_with_sql_reserved_word
0
       begin
0
         assert_nothing_raised { Person.connection.rename_column "people", "first_name", "group" }

Comments