diff options
| author | Paul Sadauskas <psadauskas@gmail.com> | 2012-01-24 14:22:24 -0700 | 
|---|---|---|
| committer | José Valim <jose.valim@gmail.com> | 2012-02-08 13:34:04 +0100 | 
| commit | 0a75336c89a517bf2328a6e5f87319b9f2457252 (patch) | |
| tree | c4af4c1c62a1cbf5ef70b3b843d9046976838024 | |
| parent | 77b4edce1544f105cc7764249becc1e998b88fc2 (diff) | |
| download | rails-0a75336c89a517bf2328a6e5f87319b9f2457252.tar.gz rails-0a75336c89a517bf2328a6e5f87319b9f2457252.tar.bz2 rails-0a75336c89a517bf2328a6e5f87319b9f2457252.zip | |
Handle nil in add_index :length option in MySQL
Our schema.rb is being generated with an `add_index` line similar to this:
    add_index "foo", ["foo", "bar"], :name => "xxx", :length => {"foo"=>8, "bar=>nil}
This is the same as it was on Rails 3.1.3, however, now when that
schema.rb is evaluated, its generating bad SQL in MySQL:
    Mysql::Error: You have an error in your SQL syntax; check the manual
    that corresponds to your MySQL server version for the right syntax
    to use near '))' at line 1: CREATE UNIQUE INDEX
    `xxx` ON `foo` (`foo`(8), `bar`())
This commit adds a check for nil on the length attribute to prevent the
empty parens from being output.
Conflicts:
	activerecord/test/cases/migration/index_test.rb
Signed-off-by: José Valim <jose.valim@gmail.com>
| -rw-r--r-- | activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb | 2 | ||||
| -rw-r--r-- | activerecord/test/cases/migration_test.rb | 5 | 
2 files changed, 6 insertions, 1 deletions
| diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb index 0cc5ee2958..9d9dbcc355 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -541,7 +541,7 @@ module ActiveRecord          if options.is_a?(Hash) && length = options[:length]            case length            when Hash -            column_names.each {|name| option_strings[name] += "(#{length[name]})" if length.has_key?(name)} +            column_names.each {|name| option_strings[name] += "(#{length[name]})" if length.has_key?(name) && length[name].present?}            when Fixnum              column_names.each {|name| option_strings[name] += "(#{length})"}            end diff --git a/activerecord/test/cases/migration_test.rb b/activerecord/test/cases/migration_test.rb index 1e68911ab3..c4ccce9126 100644 --- a/activerecord/test/cases/migration_test.rb +++ b/activerecord/test/cases/migration_test.rb @@ -161,6 +161,11 @@ if ActiveRecord::Base.connection.supports_migrations?        Person.connection.remove_index("people", :name => good_index_name)      end +    def test_add_index_attribute_length_limit +      connection.add_index :testings, [:foo, :bar], :length => {:foo => 10, :bar => nil} +      assert connection.index_exists?(:testings, [:foo, :bar]) +    end +      def test_remove_nonexistent_index        # we do this by name, so OpenBase is a wash as noted above        unless current_adapter?(:OpenBaseAdapter) | 
