method
check_int_in_range
v6.1.7.7 -
Show latest stable
- Class:
ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting
check_int_in_range(value)private
No documentation available.
# File activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb, line 129
def check_int_in_range(value)
if value.to_int > 9223372036854775807 || value.to_int < -9223372036854775808
exception = <<~ERROR
Provided value outside of the range of a signed 64bit integer.
PostgreSQL will treat the column type in question as a numeric.
This may result in a slow sequential scan due to a comparison
being performed between an integer or bigint value and a numeric value.
To allow for this potentially unwanted behavior, set
ActiveRecord::Base.raise_int_wider_than_64bit to false.
ERROR
raise IntegerOutOf64BitRange.new exception
end
end
def _quote(value)
if ActiveRecord::Base.raise_int_wider_than_64bit && value.is_a?(Integer)
check_int_in_range(value)
end
case value
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
when Numeric
if value.finite?
super
else
"'#{value}'"
end
when OID::Array::Data
_quote(encode_array(value))
when Range
_quote(encode_range(value))
else
super
end
end
def _type_cast(value)
case value
when Type::Binary::Data
# Return a bind param hash with format as binary.
# See https://deveiate.org/code/pg/PG/Connection.html#method-i-exec_prepared-doc
# for more information
{ value: value.to_s, format: 1 }
when OID::Xml::Data, OID::Bit::Data
value.to_s
when OID::Array::Data
encode_array(value)
when Range
encode_range(value)
else
super
end
end
def encode_array(array_data)
encoder = array_data.encoder
values = type_cast_array(array_data.values)
result = encoder.encode(values)
if encoding = determine_encoding_of_strings_in_array(values)
result.force_encoding(encoding)
end
result
end
def encode_range(range)
"[#{type_cast_range_value(range.begin)},#{type_cast_range_value(range.end)}#{range.exclude_end? ? ')' : ']'}"
end
def determine_encoding_of_strings_in_array(value)
case value
when ::Array then determine_encoding_of_strings_in_array(value.first)
when ::String then value.encoding
end
end
def type_cast_array(values)
case values
when ::Array then values.map { |item| type_cast_array(item) }
else _type_cast(values)
end
end
def type_cast_range_value(value)
infinity?(value) ? "" : type_cast(value)
end
def infinity?(value)
value.respond_to?(:infinite?) && value.infinite?
end
end