diff options
author | Yves Senn <yves.senn@gmail.com> | 2013-07-16 03:22:36 -0700 |
---|---|---|
committer | Yves Senn <yves.senn@gmail.com> | 2013-07-16 03:22:36 -0700 |
commit | cb1d07e43926bcec95cb8b4a663ca9889173395a (patch) | |
tree | 0950817d31ee121bd6ca1eb019a0b1a4650d1593 /activerecord | |
parent | 754a373e301d2df0b12a11083405252722bc8366 (diff) | |
parent | 41bd94b7ef0db484268b8c81de528aedad5ae08d (diff) | |
download | rails-cb1d07e43926bcec95cb8b4a663ca9889173395a.tar.gz rails-cb1d07e43926bcec95cb8b4a663ca9889173395a.tar.bz2 rails-cb1d07e43926bcec95cb8b4a663ca9889173395a.zip |
Merge pull request #11120 from awilliams/ar_mysql2_boolean_quoting
Fixes AR mysql2 adapter incorrectly casting boolean values
Diffstat (limited to 'activerecord')
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 |