diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb index 56737c0ae4633..2d763aa06330f 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb @@ -71,6 +71,10 @@ def #{option_name}=(value) end CODE end + + def aliased_types(name, fallback) + "timestamp" == name ? :datetime : fallback + end end AddColumnDefinition = Struct.new(:column) # :nodoc: diff --git a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb index ad4390d42dfa9..6bba324cecc25 100644 --- a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb @@ -271,7 +271,7 @@ def change_column_null(table_name, column_name, null, default = nil) #:nodoc: def change_column(table_name, column_name, type, **options) #:nodoc: alter_table(table_name) do |definition| definition[column_name].instance_eval do - self.type = type + self.type = aliased_types(type.to_s, type) self.options.merge!(options) end end diff --git a/activerecord/test/cases/migration/change_schema_test.rb b/activerecord/test/cases/migration/change_schema_test.rb index e6e6951562861..6f6f5c8c47d10 100644 --- a/activerecord/test/cases/migration/change_schema_test.rb +++ b/activerecord/test/cases/migration/change_schema_test.rb @@ -290,6 +290,28 @@ def test_add_column_with_timestamp_type end end + def test_change_column_with_timestamp_type + connection.create_table :testings do |t| + t.column :foo, :datetime, null: false + end + + connection.change_column :testings, :foo, :timestamp + + column = connection.columns(:testings).find { |c| c.name == "foo" } + + assert_equal :datetime, column.type + + if current_adapter?(:PostgreSQLAdapter) + assert_equal "timestamp without time zone", column.sql_type + elsif current_adapter?(:Mysql2Adapter) + assert_equal "timestamp", column.sql_type + elsif current_adapter?(:OracleAdapter) + assert_equal "TIMESTAMP(6)", column.sql_type + else + assert_equal connection.type_to_sql("datetime"), column.sql_type + end + end + def test_change_column_quotes_column_names connection.create_table :testings do |t| t.column :select, :string