Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 6889

Show
Ignore:
Timestamp:
05/29/07 07:21:41 (1 year ago)
Author:
bitsweat
Message:

SQLite, MySQL, PostgreSQL, Oracle: quote column names in column migration SQL statements. Closes #8466.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activerecord/CHANGELOG

    r6879 r6889  
    11*SVN* 
     2 
     3* SQLite, MySQL, PostgreSQL, Oracle: quote column names in column migration SQL statements.  #8466 [marclove, lorenjohnson] 
    24 
    35* Allow nil serialized attributes with a set class constraint.  #7293 [sandofsky] 
  • trunk/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb

    r6848 r6889  
    389389        current_type = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Type"] 
    390390 
    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)}") 
    392392      end 
    393393 
     
    397397        end 
    398398 
    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])}" 
    400400        add_column_options!(change_column_sql, options) 
    401401        execute(change_column_sql) 
     
    404404      def rename_column(table_name, column_name, new_column_name) #:nodoc: 
    405405        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}" 
    407407      end 
    408408 
  • trunk/activerecord/lib/active_record/connection_adapters/oracle_adapter.rb

    r6859 r6889  
    388388 
    389389        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)}" 
    391391        end 
    392392 
    393393        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])}" 
    395395          add_column_options!(change_column_sql, options) 
    396396          execute(change_column_sql) 
     
    398398 
    399399        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}" 
    401401        end 
    402402 
    403403        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)}" 
    405405        end 
    406406 
  • trunk/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb

    r6433 r6889  
    326326        notnull = options[:null] == false 
    327327 
     328        quoted_column_name = quote_column_name(column_name) 
     329 
    328330        # 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])}") 
    330332 
    331333        # Set optional default. If not null, update nulls to the new default. 
     
    333335          change_column_default(table_name, column_name, default) 
    334336          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") 
    336338          end 
    337339        end 
    338340 
    339341        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") 
    341343        end 
    342344      end 
     
    344346      def change_column(table_name, column_name, type, options = {}) #:nodoc: 
    345347        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])}" 
    347349        rescue ActiveRecord::StatementInvalid 
    348350          # This is PG7, so we use a more arcane way of doing it. 
    349351          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])})" 
    352355          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) 
    354357          commit_db_transaction 
    355358        end 
  • trunk/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb

    r6833 r6889  
    328328          from_columns = columns(from).collect {|col| col.name} 
    329329          columns = columns.find_all{|col| from_columns.include?(column_mappings[col])} 
     330          quoted_columns = columns.map { |col| quote_column_name(col) } * ',' 
     331 
    330332          @connection.execute "SELECT * FROM #{from}" do |row| 
    331             sql = "INSERT INTO #{to} ("+columns*','+") VALUES (" 
     333            sql = "INSERT INTO #{to} (#{quoted_columns}) VALUES (" 
    332334            sql << columns.map {|col| quote row[column_mappings[col]]} * ', ' 
    333335            sql << ')' 
  • trunk/activerecord/test/migration_test.rb

    r6842 r6889  
    396396        Person.connection.remove_column("people","nick_name") 
    397397        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 
    398409      end 
    399410    end