Browse files

PostgreSQL adapter should call thread safe quote_string function

Signed-off-by: Michael Koziarski <>
  • Loading branch information...
1 parent d970733 commit c5c022c705e4179f74e063186ea68a1c58797822 @libc libc committed with NZKoz Apr 23, 2009
Showing with 14 additions and 2 deletions.
  1. +14 −2 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
@@ -287,7 +287,13 @@ def table_alias_length
# Escapes binary strings for bytea input to the database.
def escape_bytea(value)
- if PGconn.respond_to?(:escape_bytea)
+ if @connection.respond_to?(:escape_bytea)
+ self.class.instance_eval do
+ define_method(:escape_bytea) do |value|
+ @connection.escape_bytea(value) if value
+ end
+ end
+ elsif PGconn.respond_to?(:escape_bytea)
self.class.instance_eval do
define_method(:escape_bytea) do |value|
PGconn.escape_bytea(value) if value
@@ -376,7 +382,13 @@ def quote(value, column = nil) #:nodoc:
# Quotes strings for use in SQL input in the postgres driver for better performance.
def quote_string(s) #:nodoc:
- if PGconn.respond_to?(:escape)
+ if @connection.respond_to?(:escape)
+ self.class.instance_eval do
+ define_method(:quote_string) do |s|
+ @connection.escape(s)
+ end
+ end
+ elsif PGconn.respond_to?(:escape)
self.class.instance_eval do
define_method(:quote_string) do |s|

4 comments on commit c5c022c

Can someone please explain to me how this provides thread safety? I assume I don't grasp the solution.

Ah, I see the pg gem (in pg.c) notes,

  • Connection instance method for versions of 8.1 and higher of libpq
  • uses PQescapeStringConn, which is safer. Avoid calling as a class method,
  • the class method uses the deprecated PQescapeString() API function.

eh, both PQescapeStringConn and PQescapeString call on PQescapeStringInternal (in libpq) to do their dirty work, which wouldn't help much if any. Maybe we shouldn't call this "thread safe" if it's only "safer." Any comments?


maxlapshin replied Aug 3, 2009

This change was made because of some mysterious bugs, that were cured with it. I'll ask the author of patch to comment it.

Please sign in to comment.