Module: ActiveRecord::ConnectionAdapters::Redshift::Quoting

Extended by:
ActiveSupport::Concern
Included in:
ActiveRecord::ConnectionAdapters::RedshiftAdapter
Defined in:
lib/active_record/connection_adapters/redshift_7_0/quoting.rb,
lib/active_record/connection_adapters/redshift_7_1/quoting.rb,
lib/active_record/connection_adapters/redshift_7_2/quoting.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

QUOTED_COLUMN_NAMES =

:nodoc:

Concurrent::Map.new
QUOTED_TABLE_NAMES =

:nodoc:

Concurrent::Map.new

Instance Method Summary collapse

Instance Method Details

#column_name_matcherObject



120
121
122
# File 'lib/active_record/connection_adapters/redshift_7_1/quoting.rb', line 120

def column_name_matcher
  COLUMN_NAME
end

#column_name_with_order_matcherObject



124
125
126
# File 'lib/active_record/connection_adapters/redshift_7_1/quoting.rb', line 124

def column_name_with_order_matcher
  COLUMN_NAME_WITH_ORDER
end

#escape_bytea(value) ⇒ Object

Escapes binary strings for bytea input to the database.



8
9
10
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 8

def escape_bytea(value)
  @connection.escape_bytea(value) if value
end

#lookup_cast_type_from_column(column) ⇒ Object

:nodoc:



115
116
117
118
# File 'lib/active_record/connection_adapters/redshift_7_1/quoting.rb', line 115

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) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 70

def quote(value)
  case value
  when Type::Binary::Data
    "'#{escape_bytea(value.to_s)}'"
  when Float
    if value.infinite? || value.nan?
      "'#{value}'"
    else
      super
    end
  else
    super
  end
end

#quote_column_name(name) ⇒ Object

Quotes column names for use in SQL queries.



41
42
43
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 41

def quote_column_name(name) # :nodoc:
  PG::Connection.quote_ident(name.to_s)
end

#quote_default_expression(value, column) ⇒ Object

:nodoc:



93
94
95
96
97
98
99
100
101
# File 'lib/active_record/connection_adapters/redshift_7_1/quoting.rb', line 93

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
  else
    super
  end
end

#quote_default_value(value, column) ⇒ Object

Does not quote function default values for UUID columns



62
63
64
65
66
67
68
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 62

def quote_default_value(value, column) # :nodoc:
  if column.type == :uuid && value =~ /\(\)/
    value
  else
    quote(value, column)
  end
end

#quote_schema_name(name) ⇒ Object

Quotes schema names for use in SQL queries.



46
47
48
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 46

def quote_schema_name(name)
  PG::Connection.quote_ident(name)
end

#quote_string(s) ⇒ Object

Quotes strings for use in SQL input.



20
21
22
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 20

def quote_string(s) # :nodoc:
  @connection.escape(s)
end

#quote_table_name(name) ⇒ Object

Checks the following cases:

  • table_name

  • “table.name”

  • schema_name.table_name

  • schema_name.“table.name”

  • “schema.name”.table_name

  • “schema.name”.“table.name”



32
33
34
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 32

def quote_table_name(name)
  Utils.extract_schema_qualified_name(name.to_s).quoted
end

#quote_table_name_for_assignment(_table, attr) ⇒ Object



36
37
38
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 36

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

#quoted_binary(value) ⇒ Object

:nodoc:



65
66
67
# File 'lib/active_record/connection_adapters/redshift_7_1/quoting.rb', line 65

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

#quoted_date(value) ⇒ Object

Quote date/time values for use in SQL input.



51
52
53
54
55
56
57
58
59
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 51

def quoted_date(value) # :nodoc:
  result = super

  if value.year <= 0
    bce_year = format('%04d', -value.year + 1)
    result = "#{result.sub(/^-?\d+/, bce_year)} BC"
  end
  result
end

#type_cast(value) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 85

def type_cast(value)
  case value
  when Type::Binary::Data
    # Return a bind param hash with format as binary.
    # See http://deveiate.org/code/pg/PGconn.html#method-i-exec_prepared-doc
    # for more information
    { value: value.to_s, format: 1 }
  else
    super
  end
end

#unescape_bytea(value) ⇒ Object

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.



15
16
17
# File 'lib/active_record/connection_adapters/redshift_7_0/quoting.rb', line 15

def unescape_bytea(value)
  @connection.unescape_bytea(value) if value
end