aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG8
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb12
-rw-r--r--activerecord/test/migration_test.rb13
3 files changed, 22 insertions, 11 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index 45ef990ddb..d5c7948009 100644
--- a/activerecord/CHANGELOG
+++ b/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]
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
index e3059ea010..fbb978e034 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
@@ -302,7 +302,17 @@ module ActiveRecord
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
diff --git a/activerecord/test/migration_test.rb b/activerecord/test/migration_test.rb
index 3fa680b94a..8d8deb8026 100644
--- a/activerecord/test/migration_test.rb
+++ b/activerecord/test/migration_test.rb
@@ -31,7 +31,7 @@ if ActiveRecord::Base.connection.supports_migrations?
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
@@ -258,8 +258,15 @@ if ActiveRecord::Base.connection.supports_migrations?
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