Merge pull request #44408 from kmcphillips/mysql-quote-duration

Quote ActiveSupport::Duration in mysql2 adapter
This commit is contained in:
Jean Boussier 2022-02-12 18:54:52 +01:00 committed by GitHub
commit f9a1671c18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 127 additions and 2 deletions

@ -8,7 +8,7 @@ module MySQL
module Quoting # :nodoc: module Quoting # :nodoc:
def quote_bound_value(value) def quote_bound_value(value)
case value case value
when Numeric when Numeric, ActiveSupport::Duration
quote(value.to_s) quote(value.to_s)
when BigDecimal when BigDecimal
quote(value.to_s("F")) quote(value.to_s("F"))

@ -7,7 +7,7 @@ module ActiveRecord
module ConnectionAdapters module ConnectionAdapters
class Mysql2Adapter class Mysql2Adapter
class BindParameterTest < ActiveRecord::Mysql2TestCase class BindParameterTest < ActiveRecord::Mysql2TestCase
fixtures :topics fixtures :topics, :posts
def test_update_question_marks def test_update_question_marks
str = "foo?bar" str = "foo?bar"
@ -46,6 +46,36 @@ def test_create_null_bytes
assert_equal str, x.title assert_equal str, x.title
assert_equal str, x.content assert_equal str, x.content
end end
def test_where_with_string_for_string_column_using_bind_parameters
count = Post.where("title = ?", "Welcome to the weblog").count
assert_equal 1, count
end
def test_where_with_integer_for_string_column_using_bind_parameters
count = Post.where("title = ?", 0).count
assert_equal 0, count
end
def test_where_with_float_for_string_column_using_bind_parameters
count = Post.where("title = ?", 0.0).count
assert_equal 0, count
end
def test_where_with_boolean_for_string_column_using_bind_parameters
count = Post.where("title = ?", false).count
assert_equal 0, count
end
def test_where_with_decimal_for_string_column_using_bind_parameters
count = Post.where("title = ?", BigDecimal(0)).count
assert_equal 0, count
end
def test_where_with_duration_for_string_column_using_bind_parameters
count = Post.where("title = ?", 0.seconds).count
assert_equal 0, count
end
end end
end end
end end

@ -16,6 +16,10 @@ def test_quote_bound_big_decimal
assert_equal "'4.2'", @conn.quote_bound_value(BigDecimal("4.2")) assert_equal "'4.2'", @conn.quote_bound_value(BigDecimal("4.2"))
end end
def test_quote_bound_duration
assert_equal "'42'", @conn.quote_bound_value(42.seconds)
end
def test_quote_bound_true def test_quote_bound_true
assert_equal "'1'", @conn.quote_bound_value(true) assert_equal "'1'", @conn.quote_bound_value(true)
end end

@ -0,0 +1,48 @@
# frozen_string_literal: true
require "cases/helper"
module ActiveRecord
module ConnectionAdapters
class PostgreSQLAdapter
class BindParameterTest < ActiveRecord::PostgreSQLTestCase
fixtures :posts
def test_where_with_string_for_string_column_using_bind_parameters
count = Post.where("title = ?", "Welcome to the weblog").count
assert_equal 1, count
end
def test_where_with_integer_for_string_column_using_bind_parameters
assert_raises ActiveRecord::StatementInvalid do
Post.where("title = ?", 0).count
end
end
def test_where_with_float_for_string_column_using_bind_parameters
assert_raises ActiveRecord::StatementInvalid do
Post.where("title = ?", 0.0).count
end
end
def test_where_with_boolean_for_string_column_using_bind_parameters
assert_raises ActiveRecord::StatementInvalid do
Post.where("title = ?", false).count
end
end
def test_where_with_decimal_for_string_column_using_bind_parameters
assert_raises ActiveRecord::StatementInvalid do
Post.where("title = ?", BigDecimal(0)).count
end
end
def test_where_with_duration_for_string_column_using_bind_parameters
assert_raises ActiveRecord::StatementInvalid do
Post.where("title = ?", 0.seconds).count
end
end
end
end
end
end

@ -0,0 +1,43 @@
# frozen_string_literal: true
require "cases/helper"
module ActiveRecord
module ConnectionAdapters
class SQLite3Adapter
class BindParameterTest < ActiveRecord::SQLite3TestCase
fixtures :posts
def test_where_with_string_for_string_column_using_bind_parameters
count = Post.where("title = ?", "Welcome to the weblog").count
assert_equal 1, count
end
def test_where_with_integer_for_string_column_using_bind_parameters
count = Post.where("title = ?", 0).count
assert_equal 0, count
end
def test_where_with_float_for_string_column_using_bind_parameters
count = Post.where("title = ?", 0.0).count
assert_equal 0, count
end
def test_where_with_boolean_for_string_column_using_bind_parameters
count = Post.where("title = ?", false).count
assert_equal 0, count
end
def test_where_with_decimal_for_string_column_using_bind_parameters
count = Post.where("title = ?", BigDecimal(0)).count
assert_equal 0, count
end
def test_where_with_duration_for_string_column_using_bind_parameters
count = Post.where("title = ?", 0.seconds).count
assert_equal 0, count
end
end
end
end
end