Method: Sequel::Postgres::AutoParameterize::DatasetMethods#complex_expression_sql_append

Defined in:
lib/sequel/extensions/pg_auto_parameterize.rb

#complex_expression_sql_append(sql, op, args) ⇒ Object

Transform column IN (int, …) expressions into column = ANY($) and column NOT IN (int, …) expressions into column != ALL($) using an integer array bound variable for the ANY/ALL argument. This is the same optimization PostgreSQL performs internally, but this reduces the number of bound variables.



273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
# File 'lib/sequel/extensions/pg_auto_parameterize.rb', line 273

def complex_expression_sql_append(sql, op, args)
  case op
  when :IN, :"NOT IN"
    l, r = args
    if auto_param?(sql) && !l.is_a?(Array) && _integer_array?(r) && r.size > 1
      if op == :IN 
        op = :"="
        func = :ANY
      else
        op = :!=
        func = :ALL
      end
      args = [l, Sequel.function(func, Sequel.cast(_integer_array_auto_param(r), 'int8[]'))]
    end
  end

  super
end