123456789_123456789_123456789_123456789_123456789_

Module: ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting

Relationships & Source Files
Namespace Children
Modules:
Exceptions:
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb

Constant Summary

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

append_features, prepend_features

Instance Method Summary

Instance Method Details

#check_int_in_range(value)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 81

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.raise_int_wider_than_64bit to false.
    ERROR
    raise IntegerOutOf64BitRange.new exception
  end
end

#determine_encoding_of_strings_in_array(value) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 214

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

#encode_array(array_data) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 199

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

#encode_range(range) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 210

def encode_range(range)
  "[#{type_cast_range_value(range.begin)},#{type_cast_range_value(range.end)}#{range.exclude_end? ? ')' : ']'}"
end

#escape_bytea(value)

Escapes binary strings for bytea input to the database.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 70

def escape_bytea(value)
  valid_raw_connection.escape_bytea(value) if value
end

#infinity?(value) ⇒ Boolean (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 232

def infinity?(value)
  value.respond_to?(:infinite?) && value.infinite?
end

#lookup_cast_type(sql_type) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 195

def lookup_cast_type(sql_type)
  super(query_value("SELECT #{quote(sql_type)}::regtype::oid", "SCHEMA").to_i)
end

#lookup_cast_type_from_column(column)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 189

def lookup_cast_type_from_column(column) # :nodoc:
  verify! if type_map.nil?
  type_map.lookup(column.oid, column.fmod, column.sql_type)
end

#quote(value)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 97

def quote(value) # :nodoc:
  if ActiveRecord.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

#quote_default_expression(value, column)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 156

def quote_default_expression(value, column) # :nodoc:
  if value.is_a?(Proc)
    value.call
  elsif column.type == :uuid && value.is_a?(String) && value.include?("()")
    value # Does not quote function default values for UUID columns
  elsif column.respond_to?(:array?)
    type = lookup_cast_type_from_column(column)
    quote(type.serialize(value))
  else
    super
  end
end

#quote_schema_name(schema_name)

Quotes schema names for use in SQL queries.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 138

def quote_schema_name(schema_name)
  quote_column_name(schema_name)
end

#quote_string(s)

This method is for internal use only.

Quotes strings for use in SQL input.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 127

def quote_string(s) # :nodoc:
  with_raw_connection(allow_retry: true, materialize_transactions: false) do |connection|
    connection.escape(s)
  end
end

#quote_table_name_for_assignment(table, attr)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 133

def quote_table_name_for_assignment(table, attr)
  quote_column_name(attr)
end

#quoted_binary(value)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 152

def quoted_binary(value) # :nodoc:
  "'#{escape_bytea(value.to_s)}'"
end

#quoted_date(value)

This method is for internal use only.

Quote date/time values for use in SQL input.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 143

def quoted_date(value) # :nodoc:
  if value.year <= 0
    bce_year = format("%04d", -value.year + 1)
    super.sub(/^-?\d+/, bce_year) + " BC"
  else
    super
  end
end

#type_cast(value)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 169

def type_cast(value) # :nodoc:
  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)
  when Rational
    value.to_f
  else
    super
  end
end

#type_cast_array(values) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 221

def type_cast_array(values)
  case values
  when ::Array then values.map { |item| type_cast_array(item) }
  else type_cast(values)
  end
end

#type_cast_range_value(value) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 228

def type_cast_range_value(value)
  infinity?(value) ? "" : type_cast(value)
end

#unescape_bytea(value)

Unescapes bytea output from a database to the binary string it represents. NOTE: This is NOT an inverse of escape_bytea! This is only to be used on escaped binary output from database drive.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb', line 77

def unescape_bytea(value)
  valid_raw_connection.unescape_bytea(value) if value
end