1
0
Fork 0
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:
Matthew Draper 2014-07-12 01:27:50 +09:30
commit 132d400b6f
2 changed files with 33 additions and 13 deletions

View file

@ -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

View file

@ -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