Make ActiveRecord's quoted name caches thread-safe.

This commit is contained in:
Kevin Menard 2023-07-20 14:50:51 -04:00
parent 0ccde297a1
commit 68d572a5d1
4 changed files with 15 additions and 14 deletions

@ -92,14 +92,6 @@ def self.build_read_query_regexp(*parts) # :nodoc:
/\A(?:[(\s]|#{COMMENT_REGEX})*#{Regexp.union(*parts)}/
end
def self.quoted_column_names # :nodoc:
@quoted_column_names ||= {}
end
def self.quoted_table_names # :nodoc:
@quoted_table_names ||= {}
end
def self.find_cmd_and_exec(commands, *args) # :doc:
commands = Array(commands)

@ -6,6 +6,9 @@ module ActiveRecord
module ConnectionAdapters
module MySQL
module Quoting # :nodoc:
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
def cast_bound_value(value)
case value
when Rational
@ -27,11 +30,11 @@ def cast_bound_value(value)
end
def quote_column_name(name)
self.class.quoted_column_names[name] ||= "`#{super.gsub('`', '``')}`"
QUOTED_COLUMN_NAMES[name] ||= "`#{super.gsub('`', '``')}`"
end
def quote_table_name(name)
self.class.quoted_table_names[name] ||= super.gsub(".", "`.`").freeze
QUOTED_TABLE_NAMES[name] ||= super.gsub(".", "`.`").freeze
end
def unquoted_true

@ -4,6 +4,9 @@ module ActiveRecord
module ConnectionAdapters
module PostgreSQL
module Quoting
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
class IntegerOutOf64BitRange < StandardError
def initialize(msg)
super(msg)
@ -83,7 +86,7 @@ def quote_string(s) # :nodoc:
# - "schema.name".table_name
# - "schema.name"."table.name"
def quote_table_name(name) # :nodoc:
self.class.quoted_table_names[name] ||= Utils.extract_schema_qualified_name(name.to_s).quoted.freeze
QUOTED_TABLE_NAMES[name] ||= Utils.extract_schema_qualified_name(name.to_s).quoted.freeze
end
# Quotes schema names for use in SQL queries.
@ -97,7 +100,7 @@ def quote_table_name_for_assignment(table, attr)
# Quotes column names for use in SQL queries.
def quote_column_name(name) # :nodoc:
self.class.quoted_column_names[name] ||= PG::Connection.quote_ident(super).freeze
QUOTED_COLUMN_NAMES[name] ||= PG::Connection.quote_ident(super).freeze
end
# Quote date/time values for use in SQL input.

@ -4,6 +4,9 @@ module ActiveRecord
module ConnectionAdapters
module SQLite3
module Quoting # :nodoc:
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
def quote_string(s)
::SQLite3::Database.quote(s)
end
@ -13,11 +16,11 @@ def quote_table_name_for_assignment(table, attr)
end
def quote_table_name(name)
self.class.quoted_table_names[name] ||= super.gsub(".", "\".\"").freeze
QUOTED_TABLE_NAMES[name] ||= super.gsub(".", "\".\"").freeze
end
def quote_column_name(name)
self.class.quoted_column_names[name] ||= %Q("#{super.gsub('"', '""')}")
QUOTED_COLUMN_NAMES[name] ||= %Q("#{super.gsub('"', '""')}")
end
def quoted_time(value)