From 41bd94b7ef0db484268b8c81de528aedad5ae08d Mon Sep 17 00:00:00 2001 From: awilliams Date: Wed, 26 Jun 2013 14:47:50 +0200 Subject: Unifies mysql and mysql2 casting of booleans Using the mysql2 adapter, boolean values were sometimes being incorrectly cast to 't' or 'f'. This changes the cast to match the mysql adapter behavior, ie 1 and 0. --- activerecord/CHANGELOG.md | 22 +++++++++++++++++++ .../connection_adapters/abstract_mysql_adapter.rb | 6 ++++++ .../connection_adapters/mysql_adapter.rb | 6 ------ .../test/cases/adapters/mysql2/quoting_test.rb | 25 ++++++++++++++++++++++ 4 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 activerecord/test/cases/adapters/mysql2/quoting_test.rb (limited to 'activerecord') 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 -- cgit v1.2.3