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

Changeset 5937

Show
Ignore:
Timestamp:
01/15/07 02:22:53 (2 years ago)
Author:
bitsweat
Message:

change_column accepts :default => nil. Closes #6956.

Files:

Legend:

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

    r5935 r5937  
    11*SVN* 
     2 
     3* change_column accepts :default => nil.  #6956 [dcmanges, Jeremy Kemper] 
    24 
    35* MySQL, PostgreSQL: change_column_default quotes the default value and doesn't lose column type information.  #3987, #6664 [Jonathan Viney, manfred, altano@bigfoot.com] 
  • trunk/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb

    r4600 r5937  
    254254      #   <tt>:binary</tt> or <tt>:integer</tt> columns only) 
    255255      # * <tt>:default</tt>: 
    256       #   The column's default value.  You cannot explicitely set the default 
    257       #   value to +NULL+.  Simply leave off this option if you want a +NULL+ 
    258       #   default value. 
     256      #   The column's default value. Use nil for NULL. 
    259257      # * <tt>:null</tt>: 
    260258      #   Allows or disallows +NULL+ values in the column.  This option could 
     
    272270      # * MySQL: <tt>:precision</tt> [1..63], <tt>:scale</tt> [0..30].  
    273271      #   Default is (10,0). 
    274       # * PostGres?: <tt>:precision</tt> [1..infinity],  
     272      # * PostgreSQL: <tt>:precision</tt> [1..infinity],  
    275273      #   <tt>:scale</tt> [0..infinity]. No default. 
    276       # * Sqlite2: Any <tt>:precision</tt> and <tt>:scale</tt> may be used.  
     274      # * SQLite2: Any <tt>:precision</tt> and <tt>:scale</tt> may be used.  
    277275      #   Internal storage as strings. No default. 
    278       # * Sqlite3: No restrictions on <tt>:precision</tt> and <tt>:scale</tt>, 
     276      # * SQLite3: No restrictions on <tt>:precision</tt> and <tt>:scale</tt>, 
    279277      #   but the maximum supported <tt>:precision</tt> is 16. No default. 
    280278      # * Oracle: <tt>:precision</tt> [1..38], <tt>:scale</tt> [-84..127].  
  • trunk/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb

    r5933 r5937  
    274274          column_type_sql 
    275275        end 
    276       end             
    277      
     276      end 
     277 
    278278      def add_column_options!(sql, options) #:nodoc: 
    279         sql << " DEFAULT #{quote(options[:default], options[:column])}" unless options[:default].nil? 
     279        sql << " DEFAULT #{quote(options[:default], options[:column])}" if options_include_default?(options) 
    280280        sql << " NOT NULL" if options[:null] == false 
    281281      end 
     
    294294        sql << "ORDER BY #{options[:order]}" 
    295295      end 
     296 
     297      protected 
     298        def options_include_default?(options) 
     299          options.include?(:default) && !(options[:null] == false && options[:default].nil?) 
     300        end 
    296301    end 
    297302  end 
  • trunk/activerecord/lib/active_record/connection_adapters/firebird_adapter.rb

    r5459 r5937  
    506506      def change_column(table_name, column_name, type, options = {}) # :nodoc: 
    507507        change_column_type(table_name, column_name, type, options) 
    508         change_column_position(table_name, column_name, options[:position]) if options[:position] 
    509         change_column_default(table_name, column_name, options[:default]) if options.has_key?(:default
     508        change_column_position(table_name, column_name, options[:position]) if options.include?(:position) 
     509        change_column_default(table_name, column_name, options[:default]) if options_include_default?(options
    510510      end 
    511511 
  • trunk/activerecord/lib/active_record/connection_adapters/frontbase_adapter.rb

    r5933 r5937  
    796796      def add_column_options!(sql, options) #:nodoc: 
    797797        default_value = quote(options[:default], options[:column]) 
    798         if options[:default] 
     798        if options_include_default?(options) 
    799799          if options[:type] == :boolean 
    800800            default_value = options[:default] == 0 ? quoted_false : quoted_true 
    801801          end 
    802         end 
    803         sql << " DEFAULT #{default_value}" unless options[:default].nil? 
     802          sql << " DEFAULT #{default_value}" 
     803        end 
    804804        sql << " NOT NULL" if options[:null] == false 
    805805      end 
     
    829829        change_column_sql = %( ALTER TABLE "#{table_name}" ALTER COLUMN "#{column_name}" ) 
    830830 
    831         default_value = quote(options[:default], options[:column]
    832         if options[:default] 
     831        if options_include_default?(options
     832          default_value = quote(options[:default], options[:column]) 
    833833          if type == :boolean 
    834834            default_value = options[:default] == 0 ? quoted_false : quoted_true 
    835835          end 
    836         end 
    837  
    838         if default_value != "NULL" 
    839836          change_column_sql << " SET DEFAULT #{default_value}" 
    840           execute(change_column_sql) 
    841         end 
     837        end 
     838 
     839        execute(change_column_sql) 
    842840         
    843841#         change_column_sql = "ALTER TABLE #{table_name} CHANGE #{column_name} #{column_name} #{type_to_sql(type, options[:limit])}" 
  • trunk/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb

    r5935 r5937  
    365365 
    366366      def change_column(table_name, column_name, type, options = {}) #:nodoc: 
    367         if options[:default].nil? 
     367        unless options_include_default?(options) 
    368368          options[:default] = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Default"] 
    369369        end 
    370          
     370 
    371371        change_column_sql = "ALTER TABLE #{table_name} CHANGE #{column_name} #{column_name} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" 
    372372        add_column_options!(change_column_sql, options) 
  • trunk/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb

    r5935 r5937  
    322322 
    323323        # Set optional default. If not null, update nulls to the new default. 
    324         unless default.nil? 
     324        if options_include_default?(options) 
    325325          change_column_default(table_name, column_name, default) 
    326326          if notnull 
    327             execute("UPDATE #{table_name} SET #{column_name}='#{default}' WHERE #{column_name} IS NULL") 
     327            execute("UPDATE #{table_name} SET #{column_name}=#{quote(default, options[:column])} WHERE #{column_name} IS NULL") 
    328328          end 
    329329        end 
     
    346346          commit_db_transaction 
    347347        end 
    348         change_column_default(table_name, column_name, options[:default]) unless options[:default].nil? 
     348 
     349        if options_include_default?(options) 
     350          change_column_default(table_name, column_name, options[:default]) 
     351        end 
    349352      end 
    350353 
  • trunk/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb

    r5658 r5937  
    265265      def change_column(table_name, column_name, type, options = {}) #:nodoc: 
    266266        alter_table(table_name) do |definition| 
     267          include_default = options_include_default?(options) 
    267268          definition[column_name].instance_eval do 
    268269            self.type    = type 
    269             self.limit   = options[:limit] if options[:limit] 
    270             self.default = options[:default] unless options[:default].nil? 
     270            self.limit   = options[:limit] if options.include?(:limit) 
     271            self.default = options[:default] if include_default 
    271272          end 
    272273        end 
  • trunk/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb

    r5891 r5937  
    460460      def change_column(table_name, column_name, type, options = {}) #:nodoc: 
    461461        sql_commands = ["ALTER TABLE #{table_name} ALTER COLUMN #{column_name} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"] 
    462         unless options[:default].nil? 
     462        if options_include_default?(options) 
    463463          remove_default_constraint(table_name, column_name) 
    464           sql_commands << "ALTER TABLE #{table_name} ADD CONSTRAINT DF_#{table_name}_#{column_name} DEFAULT #{quote(options[:default])} FOR #{column_name}" 
     464          sql_commands << "ALTER TABLE #{table_name} ADD CONSTRAINT DF_#{table_name}_#{column_name} DEFAULT #{quote(options[:default], options[:column])} FOR #{column_name}" 
    465465        end 
    466466        sql_commands.each {|c| 
  • trunk/activerecord/lib/active_record/connection_adapters/sybase_adapter.rb

    r5839 r5937  
    382382 
    383383      def add_column_options!(sql, options) #:nodoc: 
    384         sql << " DEFAULT #{quote(options[:default], options[:column])}" unless options[:default].nil? 
     384        sql << " DEFAULT #{quote(options[:default], options[:column])}" if options_include_default?(options) 
    385385 
    386386        if check_null_for_column?(options[:column], sql) 
  • trunk/activerecord/test/migration_test.rb

    r5935 r5937  
    9595 
    9696    def test_create_table_with_not_null_column 
    97       Person.connection.create_table :testings do |t| 
    98         t.column :foo, :string, :null => false 
     97      assert_nothing_raised do 
     98        Person.connection.create_table :testings do |t| 
     99          t.column :foo, :string, :null => false 
     100        end 
    99101      end 
    100102 
     
    423425      assert new_columns.find { |c| c.name == 'approved' and c.type == :boolean and c.default == false } 
    424426      assert_nothing_raised { Topic.connection.change_column :topics, :approved, :boolean, :default => true } 
     427    end 
     428     
     429    def test_change_column_with_nil_default 
     430      Person.connection.add_column "people", "contributor", :boolean, :default => true 
     431      Person.reset_column_information 
     432      assert Person.new.contributor? 
     433       
     434      assert_nothing_raised { Person.connection.change_column "people", "contributor", :boolean, :default => nil } 
     435      Person.reset_column_information 
     436      assert !Person.new.contributor? 
     437      assert_nil Person.new.contributor 
    425438    end 
    426439