Changeset 6889
- Timestamp:
- 05/29/07 07:21:41 (1 year ago)
- Files:
-
- trunk/activerecord/CHANGELOG (modified) (1 diff)
- trunk/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb (modified) (3 diffs)
- trunk/activerecord/lib/active_record/connection_adapters/oracle_adapter.rb (modified) (2 diffs)
- trunk/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb (modified) (3 diffs)
- trunk/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb (modified) (1 diff)
- trunk/activerecord/test/migration_test.rb (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/activerecord/CHANGELOG
r6879 r6889 1 1 *SVN* 2 3 * SQLite, MySQL, PostgreSQL, Oracle: quote column names in column migration SQL statements. #8466 [marclove, lorenjohnson] 2 4 3 5 * Allow nil serialized attributes with a set class constraint. #7293 [sandofsky] trunk/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb
r6848 r6889 389 389 current_type = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Type"] 390 390 391 execute("ALTER TABLE #{table_name} CHANGE #{ column_name} #{column_name} #{current_type} DEFAULT #{quote(default)}")391 execute("ALTER TABLE #{table_name} CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{current_type} DEFAULT #{quote(default)}") 392 392 end 393 393 … … 397 397 end 398 398 399 change_column_sql = "ALTER TABLE #{table_name} CHANGE #{ column_name} #{column_name} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"399 change_column_sql = "ALTER TABLE #{table_name} CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" 400 400 add_column_options!(change_column_sql, options) 401 401 execute(change_column_sql) … … 404 404 def rename_column(table_name, column_name, new_column_name) #:nodoc: 405 405 current_type = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Type"] 406 execute "ALTER TABLE #{table_name} CHANGE #{ column_name} #{new_column_name} #{current_type}"406 execute "ALTER TABLE #{table_name} CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}" 407 407 end 408 408 trunk/activerecord/lib/active_record/connection_adapters/oracle_adapter.rb
r6859 r6889 388 388 389 389 def change_column_default(table_name, column_name, default) #:nodoc: 390 execute "ALTER TABLE #{table_name} MODIFY #{ column_name} DEFAULT #{quote(default)}"390 execute "ALTER TABLE #{table_name} MODIFY #{quote_column_name(column_name)} DEFAULT #{quote(default)}" 391 391 end 392 392 393 393 def change_column(table_name, column_name, type, options = {}) #:nodoc: 394 change_column_sql = "ALTER TABLE #{table_name} MODIFY #{ column_name} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"394 change_column_sql = "ALTER TABLE #{table_name} MODIFY #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" 395 395 add_column_options!(change_column_sql, options) 396 396 execute(change_column_sql) … … 398 398 399 399 def rename_column(table_name, column_name, new_column_name) #:nodoc: 400 execute "ALTER TABLE #{table_name} RENAME COLUMN #{ column_name} to #{new_column_name}"400 execute "ALTER TABLE #{table_name} RENAME COLUMN #{quote_column_name(column_name)} to #{new_column_name}" 401 401 end 402 402 403 403 def remove_column(table_name, column_name) #:nodoc: 404 execute "ALTER TABLE #{table_name} DROP COLUMN #{ column_name}"404 execute "ALTER TABLE #{table_name} DROP COLUMN #{quote_column_name(column_name)}" 405 405 end 406 406 trunk/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
r6433 r6889 326 326 notnull = options[:null] == false 327 327 328 quoted_column_name = quote_column_name(column_name) 329 328 330 # Add the column. 329 execute("ALTER TABLE #{table_name} ADD COLUMN #{ column_name} #{type_to_sql(type, options[:limit])}")331 execute("ALTER TABLE #{table_name} ADD COLUMN #{quoted_column_name} #{type_to_sql(type, options[:limit])}") 330 332 331 333 # Set optional default. If not null, update nulls to the new default. … … 333 335 change_column_default(table_name, column_name, default) 334 336 if notnull 335 execute("UPDATE #{table_name} SET #{ column_name}=#{quote(default, options[:column])} WHERE #{column_name} IS NULL")337 execute("UPDATE #{table_name} SET #{quoted_column_name}=#{quote(default, options[:column])} WHERE #{quoted_column_name} IS NULL") 336 338 end 337 339 end 338 340 339 341 if notnull 340 execute("ALTER TABLE #{table_name} ALTER #{ column_name} SET NOT NULL")342 execute("ALTER TABLE #{table_name} ALTER #{quoted_column_name} SET NOT NULL") 341 343 end 342 344 end … … 344 346 def change_column(table_name, column_name, type, options = {}) #:nodoc: 345 347 begin 346 execute "ALTER TABLE #{table_name} ALTER COLUMN #{ column_name} TYPE #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"348 execute "ALTER TABLE #{table_name} ALTER COLUMN #{quoted_column_name} TYPE #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" 347 349 rescue ActiveRecord::StatementInvalid 348 350 # This is PG7, so we use a more arcane way of doing it. 349 351 begin_db_transaction 350 add_column(table_name, "#{column_name}_ar_tmp", type, options) 351 execute "UPDATE #{table_name} SET #{column_name}_ar_tmp = CAST(#{column_name} AS #{type_to_sql(type, options[:limit], options[:precision], options[:scale])})" 352 tmp_column_name = "#{column_name}_ar_tmp" 353 add_column(table_name, tmp_column_name, type, options) 354 execute "UPDATE #{table_name} SET #{quote_column_name(tmp_column_name)} = CAST(#{quote_column_name(column_name)} AS #{type_to_sql(type, options[:limit], options[:precision], options[:scale])})" 352 355 remove_column(table_name, column_name) 353 rename_column(table_name, "#{column_name}_ar_tmp", column_name)356 rename_column(table_name, tmp_column_name, column_name) 354 357 commit_db_transaction 355 358 end trunk/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb
r6833 r6889 328 328 from_columns = columns(from).collect {|col| col.name} 329 329 columns = columns.find_all{|col| from_columns.include?(column_mappings[col])} 330 quoted_columns = columns.map { |col| quote_column_name(col) } * ',' 331 330 332 @connection.execute "SELECT * FROM #{from}" do |row| 331 sql = "INSERT INTO #{to} ( "+columns*','+") VALUES ("333 sql = "INSERT INTO #{to} (#{quoted_columns}) VALUES (" 332 334 sql << columns.map {|col| quote row[column_mappings[col]]} * ', ' 333 335 sql << ')' trunk/activerecord/test/migration_test.rb
r6842 r6889 396 396 Person.connection.remove_column("people","nick_name") 397 397 Person.connection.add_column("people","first_name", :string) 398 end 399 end 400 401 def test_rename_column_with_sql_reserved_word 402 begin 403 assert_nothing_raised { Person.connection.rename_column "people", "first_name", "group" } 404 Person.reset_column_information 405 assert Person.column_names.include?("group") 406 ensure 407 Person.connection.remove_column("people", "group") rescue nil 408 Person.connection.add_column("people", "first_name", :string) rescue nil 398 409 end 399 410 end