提交 bc9dc418 编写于 作者: M Matthew Draper

Merge pull request #26208 from nanaya/pg-insensitive-text

Fix case insensitive check for text column in pg
* Fixed support for case insensitive comparisons of `text` columns in
PostgreSQL.
*Edho Arief*
* Made ActiveRecord consistently use `ActiveRecord::Type` (not `ActiveModel::Type`)
*Iain Beeston*
......
......@@ -770,11 +770,15 @@ def can_perform_case_insensitive_comparison_for?(column)
@case_insensitive_cache[column.sql_type] ||= begin
sql = <<-end_sql
SELECT exists(
SELECT * FROM pg_proc
WHERE proname = 'lower'
AND proargtypes = ARRAY[#{quote column.sql_type}::regtype]::oidvector
) OR exists(
SELECT * FROM pg_proc
INNER JOIN pg_cast
ON casttarget::text::oidvector = proargtypes
ON ARRAY[casttarget]::oidvector = proargtypes
WHERE proname = 'lower'
AND castsource = '#{column.sql_type}'::regtype::oid
AND castsource = #{quote column.sql_type}::regtype
)
end_sql
execute_and_clear(sql, "SCHEMA", []) do |result|
......
require "cases/helper"
class PostgresqlCaseInsensitiveTest < ActiveRecord::PostgreSQLTestCase
class Default < ActiveRecord::Base; end
def test_case_insensitiveness
connection = ActiveRecord::Base.connection
table = Default.arel_table
column = Default.columns_hash["char1"]
comparison = connection.case_insensitive_comparison table, :char1, column, nil
assert_match /lower/i, comparison.to_sql
column = Default.columns_hash["char2"]
comparison = connection.case_insensitive_comparison table, :char2, column, nil
assert_match /lower/i, comparison.to_sql
column = Default.columns_hash["char3"]
comparison = connection.case_insensitive_comparison table, :char3, column, nil
assert_match /lower/i, comparison.to_sql
column = Default.columns_hash["multiline_default"]
comparison = connection.case_insensitive_comparison table, :multiline_default, column, nil
assert_match /lower/i, comparison.to_sql
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册