Skip to content

Commit

Permalink
Merge pull request #11120 from awilliams/ar_mysql2_boolean_quoting
Browse files Browse the repository at this point in the history
Fixes AR mysql2 adapter incorrectly casting boolean values
  • Loading branch information
senny committed Jul 16, 2013
2 parents 754a373 + 41bd94b commit cb1d07e
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 6 deletions.
22 changes: 22 additions & 0 deletions 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. * `change_column` for PostgreSQL adapter respects the `:array` option.


*Yves Senn* *Yves Senn*
Expand Down
Expand Up @@ -272,6 +272,12 @@ def quoted_false
QUOTED_FALSE QUOTED_FALSE
end end


def type_cast(value, column)
return super unless value == true || value == false

value ? 1 : 0
end

# REFERENTIAL INTEGRITY ==================================== # REFERENTIAL INTEGRITY ====================================


def disable_referential_integrity(&block) #:nodoc: def disable_referential_integrity(&block) #:nodoc:
Expand Down
Expand Up @@ -160,12 +160,6 @@ def error_number(exception) # :nodoc:


# QUOTING ================================================== # QUOTING ==================================================


def type_cast(value, column)
return super unless value == true || value == false

value ? 1 : 0
end

def quote_string(string) #:nodoc: def quote_string(string) #:nodoc:
@connection.quote(string) @connection.quote(string)
end end
Expand Down
25 changes: 25 additions & 0 deletions 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

0 comments on commit cb1d07e

Please sign in to comment.