mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #16136 from sgrif/sg-pg-bit-string
Don't rely on the column SQL type for bit string quoting
This commit is contained in:
commit
132d400b6f
2 changed files with 33 additions and 13 deletions
|
@ -19,6 +19,32 @@ module ActiveRecord
|
|||
value
|
||||
end
|
||||
end
|
||||
|
||||
def type_cast_for_database(value)
|
||||
Data.new(super) if value
|
||||
end
|
||||
|
||||
class Data
|
||||
def initialize(value)
|
||||
@value = value
|
||||
end
|
||||
|
||||
def to_s
|
||||
value
|
||||
end
|
||||
|
||||
def binary?
|
||||
/\A[01]*\Z/ === value
|
||||
end
|
||||
|
||||
def hex?
|
||||
/\A[0-9A-F]*\Z/i === value
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
attr_reader :value
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -18,8 +18,6 @@ module ActiveRecord
|
|||
def quote(value, column = nil) #:nodoc:
|
||||
return super unless column
|
||||
|
||||
sql_type = type_to_sql(column.type, column.limit, column.precision, column.scale)
|
||||
|
||||
case value
|
||||
when Float
|
||||
if value.infinite? || value.nan?
|
||||
|
@ -27,16 +25,6 @@ module ActiveRecord
|
|||
else
|
||||
super
|
||||
end
|
||||
when String
|
||||
case sql_type
|
||||
when /^bit/
|
||||
case value
|
||||
when /\A[01]*\Z/ then "B'#{value}'" # Bit-string notation
|
||||
when /\A[0-9A-F]*\Z/i then "X'#{value}'" # Hexadecimal notation
|
||||
end
|
||||
else
|
||||
super
|
||||
end
|
||||
else
|
||||
super
|
||||
end
|
||||
|
@ -100,6 +88,12 @@ module ActiveRecord
|
|||
"'#{escape_bytea(value.to_s)}'"
|
||||
when OID::Xml::Data
|
||||
"xml '#{quote_string(value.to_s)}'"
|
||||
when OID::Bit::Data
|
||||
if value.binary?
|
||||
"B'#{value}'"
|
||||
elsif value.hex?
|
||||
"X'#{value}'"
|
||||
end
|
||||
else
|
||||
super
|
||||
end
|
||||
|
@ -112,7 +106,7 @@ module ActiveRecord
|
|||
# See http://deveiate.org/code/pg/PGconn.html#method-i-exec_prepared-doc
|
||||
# for more information
|
||||
{ value: value.to_s, format: 1 }
|
||||
when OID::Xml::Data
|
||||
when OID::Xml::Data, OID::Bit::Data
|
||||
value.to_s
|
||||
else
|
||||
super
|
||||
|
|
Loading…
Reference in a new issue