diff options
4 files changed, 53 insertions, 6 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 8e262b5fd7..8667f40406 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,25 @@ +*   Fix bug when using Mysql2 adapter where in some cases, boolean values were +    being output in sql as `t` or `f` instead of `1` or `0`. Example: + +        class Model < ActiveRecord::Base +          validates_uniqueness_of :boolean_col +        end +        Model.first.valid? + +    Previously generated sql: + +        SELECT 1 AS one FROM `models` WHERE +          `models`.`boolean_col` = BINARY 'f' LIMIT 1 + +    With fix: + +        SELECT 1 AS one FROM `models` WHERE +          `models`.`boolean_col` = BINARY 0 LIMIT 1 + +    Fixes: #11119 + +    *Adam Williams* +  *   `change_column` for PostgreSQL adapter respects the `:array` option.      *Yves Senn* 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 5b25b26164..be42d7e3c6 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -272,6 +272,12 @@ module ActiveRecord          QUOTED_FALSE        end +      def type_cast(value, column) +        return super unless value == true || value == false + +        value ? 1 : 0 +      end +        # REFERENTIAL INTEGRITY ====================================        def disable_referential_integrity(&block) #:nodoc: diff --git a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb index 1826d88500..be0eb64efd 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb @@ -160,12 +160,6 @@ module ActiveRecord        # QUOTING ================================================== -      def type_cast(value, column) -        return super unless value == true || value == false - -        value ? 1 : 0 -      end -        def quote_string(string) #:nodoc:          @connection.quote(string)        end diff --git a/activerecord/test/cases/adapters/mysql2/quoting_test.rb b/activerecord/test/cases/adapters/mysql2/quoting_test.rb new file mode 100644 index 0000000000..90157b088b --- /dev/null +++ b/activerecord/test/cases/adapters/mysql2/quoting_test.rb @@ -0,0 +1,25 @@ +require "cases/helper" + +module ActiveRecord +  module ConnectionAdapters +    class Mysql2Adapter +      class QuotingTest < ActiveRecord::TestCase +        def setup +          @conn = ActiveRecord::Base.connection +        end + +        def test_type_cast_true +          c = Column.new(nil, 1, 'boolean') +          assert_equal 1, @conn.type_cast(true, nil) +          assert_equal 1, @conn.type_cast(true, c) +        end + +        def test_type_cast_false +          c = Column.new(nil, 1, 'boolean') +          assert_equal 0, @conn.type_cast(false, nil) +          assert_equal 0, @conn.type_cast(false, c) +        end +      end +    end +  end +end  | 
