Skip to content

Commit

Permalink
Fix change_column to work with postgres 7.x and 8.x.
Browse files Browse the repository at this point in the history
Closes #3141


git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3327 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information
Scott Barron committed Dec 20, 2005
1 parent 581f12b commit 88bb279
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 11 deletions.
8 changes: 1 addition & 7 deletions activerecord/CHANGELOG
@@ -1,12 +1,6 @@
*SVN*

* removed :piggyback in favor of just allowing :select on :through associations. [Tobias Luetke]

* made method missing delegation to class methods on relation target work on :through associations. [Tobias Luetke]

* made .find() work on :through relations. [Tobias Luetke]

* added :piggyback option to has_many :through relationships to pick up values from the join table as needed [Tobias Luetke]
* Fix change_column to work with PostgreSQL 7.x and 8.x. #3141 [wejn@box.cz, Rick Olson, Scott Barron]

* Fix typo in association docs. #3296. [Blair Zajac]

Expand Down
Expand Up @@ -302,7 +302,17 @@ def add_column(table_name, column_name, type, options = {})
end

def change_column(table_name, column_name, type, options = {}) #:nodoc:
execute = "ALTER TABLE #{table_name} ALTER #{column_name} TYPE #{type}"
begin
execute "ALTER TABLE #{table_name} ALTER #{column_name} TYPE #{type_to_sql(type, options[:limit])}"
rescue ActiveRecord::StatementInvalid
# This is PG7, so we use a more arcane way of doing it.
begin_db_transaction
add_column(table_name, "#{column_name}_ar_tmp", type, options)
execute "UPDATE #{table_name} SET #{column_name}_ar_tmp = CAST(#{column_name} AS #{type_to_sql(type, options[:limit])})"
remove_column(table_name, column_name)
rename_column(table_name, "#{column_name}_ar_tmp", column_name)
commit_db_transaction
end
change_column_default(table_name, column_name, options[:default]) unless options[:default].nil?
end

Expand Down
13 changes: 10 additions & 3 deletions activerecord/test/migration_test.rb
Expand Up @@ -31,7 +31,7 @@ def teardown
Person.connection.remove_column("people", "administrator") rescue nil
Person.reset_column_information
end

def test_add_index
Person.connection.add_column "people", "last_name", :string
Person.connection.add_column "people", "administrator", :boolean
Expand Down Expand Up @@ -258,8 +258,15 @@ def test_rename_table
end

def test_change_column
Person.connection.add_column "people", "bio", :string
assert_nothing_raised { Person.connection.change_column "people", "bio", :text }
Person.connection.add_column 'people', 'age', :integer
old_columns = Person.connection.columns(Person.table_name, "#{name} Columns")
assert old_columns.find { |c| c.name == 'age' and c.type == :integer }

assert_nothing_raised { Person.connection.change_column "people", "age", :string }

new_columns = Person.connection.columns(Person.table_name, "#{name} Columns")
assert_nil new_columns.find { |c| c.name == 'age' and c.type == :integer }
assert new_columns.find { |c| c.name == 'age' and c.type == :string }
end

def test_change_column_with_new_default
Expand Down

0 comments on commit 88bb279

Please sign in to comment.