aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorawilliams <pwnfactory@gmail.com>2013-06-26 14:47:50 +0200
committerawilliams <pwnfactory@gmail.com>2013-07-16 12:14:09 +0200
commit41bd94b7ef0db484268b8c81de528aedad5ae08d (patch)
tree0950817d31ee121bd6ca1eb019a0b1a4650d1593
parent754a373e301d2df0b12a11083405252722bc8366 (diff)
downloadrails-41bd94b7ef0db484268b8c81de528aedad5ae08d.tar.gz
rails-41bd94b7ef0db484268b8c81de528aedad5ae08d.tar.bz2
rails-41bd94b7ef0db484268b8c81de528aedad5ae08d.zip
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.
-rw-r--r--activerecord/CHANGELOG.md22
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb6
-rw-r--r--activerecord/lib/active_record/connection_adapters/mysql_adapter.rb6
-rw-r--r--activerecord/test/cases/adapters/mysql2/quoting_test.rb25
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