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
|
value
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,8 +18,6 @@ module ActiveRecord
|
||||||
def quote(value, column = nil) #:nodoc:
|
def quote(value, column = nil) #:nodoc:
|
||||||
return super unless column
|
return super unless column
|
||||||
|
|
||||||
sql_type = type_to_sql(column.type, column.limit, column.precision, column.scale)
|
|
||||||
|
|
||||||
case value
|
case value
|
||||||
when Float
|
when Float
|
||||||
if value.infinite? || value.nan?
|
if value.infinite? || value.nan?
|
||||||
|
@ -27,16 +25,6 @@ module ActiveRecord
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
end
|
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
|
else
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
@ -100,6 +88,12 @@ module ActiveRecord
|
||||||
"'#{escape_bytea(value.to_s)}'"
|
"'#{escape_bytea(value.to_s)}'"
|
||||||
when OID::Xml::Data
|
when OID::Xml::Data
|
||||||
"xml '#{quote_string(value.to_s)}'"
|
"xml '#{quote_string(value.to_s)}'"
|
||||||
|
when OID::Bit::Data
|
||||||
|
if value.binary?
|
||||||
|
"B'#{value}'"
|
||||||
|
elsif value.hex?
|
||||||
|
"X'#{value}'"
|
||||||
|
end
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
@ -112,7 +106,7 @@ module ActiveRecord
|
||||||
# See http://deveiate.org/code/pg/PGconn.html#method-i-exec_prepared-doc
|
# See http://deveiate.org/code/pg/PGconn.html#method-i-exec_prepared-doc
|
||||||
# for more information
|
# for more information
|
||||||
{ value: value.to_s, format: 1 }
|
{ value: value.to_s, format: 1 }
|
||||||
when OID::Xml::Data
|
when OID::Xml::Data, OID::Bit::Data
|
||||||
value.to_s
|
value.to_s
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
|
|
Loading…
Reference in a new issue