PostgreSQL: use standard-conforming strings if possible
This commit is contained in:
parent
72a3e4b77b
commit
dac80f779d
@ -263,20 +263,12 @@ def supports_primary_key? #:nodoc:
|
||||
true
|
||||
end
|
||||
|
||||
# Does PostgreSQL support standard conforming strings?
|
||||
def supports_standard_conforming_strings?
|
||||
# Temporarily set the client message level above error to prevent unintentional
|
||||
# error messages in the logs when working on a PostgreSQL database server that
|
||||
# does not support standard conforming strings.
|
||||
client_min_messages_old = client_min_messages
|
||||
self.client_min_messages = 'panic'
|
||||
|
||||
# postgres-pr does not raise an exception when client_min_messages is set higher
|
||||
# than error and "SHOW standard_conforming_strings" fails, but returns an empty
|
||||
# PGresult instead.
|
||||
has_support = query('SHOW standard_conforming_strings')[0][0] rescue false
|
||||
self.client_min_messages = client_min_messages_old
|
||||
has_support
|
||||
# Enable standard-conforming strings if available.
|
||||
def set_standard_conforming_strings
|
||||
old, self.client_min_messages = client_min_messages, 'panic'
|
||||
execute('SET standard_conforming_strings = on') rescue nil
|
||||
ensure
|
||||
self.client_min_messages = old
|
||||
end
|
||||
|
||||
def supports_insert_with_returning?
|
||||
@ -376,9 +368,9 @@ def unescape_bytea(original_value)
|
||||
# Quotes PostgreSQL-specific data types for SQL input.
|
||||
def quote(value, column = nil) #:nodoc:
|
||||
if value.kind_of?(String) && column && column.type == :binary
|
||||
"#{quoted_string_prefix}'#{escape_bytea(value)}'"
|
||||
"'#{escape_bytea(value)}'"
|
||||
elsif value.kind_of?(String) && column && column.sql_type == 'xml'
|
||||
"xml E'#{quote_string(value)}'"
|
||||
"xml '#{quote_string(value)}'"
|
||||
elsif value.kind_of?(Numeric) && column && column.sql_type == 'money'
|
||||
# Not truly string input, so doesn't require (or allow) escape string syntax.
|
||||
"'#{value.to_s}'"
|
||||
@ -991,22 +983,11 @@ def connect
|
||||
# Ignore async_exec and async_query when using postgres-pr.
|
||||
@async = @config[:allow_concurrency] && @connection.respond_to?(:async_exec)
|
||||
|
||||
# Use escape string syntax if available. We cannot do this lazily when encountering
|
||||
# the first string, because that could then break any transactions in progress.
|
||||
# See: http://www.postgresql.org/docs/current/static/runtime-config-compatible.html
|
||||
# If PostgreSQL doesn't know the standard_conforming_strings parameter then it doesn't
|
||||
# support escape string syntax. Don't override the inherited quoted_string_prefix.
|
||||
if supports_standard_conforming_strings?
|
||||
self.class.instance_eval do
|
||||
define_method(:quoted_string_prefix) { 'E' }
|
||||
end
|
||||
end
|
||||
|
||||
# Money type has a fixed precision of 10 in PostgreSQL 8.2 and below, and as of
|
||||
# PostgreSQL 8.3 it has a fixed precision of 19. PostgreSQLColumn.extract_precision
|
||||
# should know about this but can't detect it there, so deal with it here.
|
||||
PostgreSQLColumn.money_precision =
|
||||
(postgresql_version >= 80300) ? 19 : 10
|
||||
PostgreSQLColumn.money_precision = (postgresql_version >= 80300) ? 19 : 10
|
||||
|
||||
configure_connection
|
||||
end
|
||||
|
||||
@ -1022,7 +1003,10 @@ def configure_connection
|
||||
end
|
||||
self.client_min_messages = @config[:min_messages] if @config[:min_messages]
|
||||
self.schema_search_path = @config[:schema_search_path] || @config[:schema_order]
|
||||
|
||||
|
||||
# Use standard-conforming strings if available so we don't have to do the E'...' dance.
|
||||
set_standard_conforming_strings
|
||||
|
||||
# If using ActiveRecord's time zone support configure the connection to return
|
||||
# TIMESTAMP WITH ZONE types in UTC.
|
||||
execute("SET time zone 'UTC'") if ActiveRecord::Base.default_timezone == :utc
|
||||
|
Loading…
Reference in New Issue
Block a user