1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

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.
This commit is contained in:
awilliams 2013-06-26 14:47:50 +02:00
parent 754a373e30
commit 41bd94b7ef
4 changed files with 53 additions and 6 deletions

View file

@ -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*

View file

@ -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:

View file

@ -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

View file

@ -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