{1,2} | {1,1,3} | 1
(1 row)
+-- IN and ANY clauses with Vars are not squashed.
+SELECT * FROM test_squash a, test_squash b WHERE a.id IN (1, 2, 3, b.id, b.id + 1);
+ id | data | id | data
+----+------+----+------
+(0 rows)
+
+SELECT * FROM test_squash a, test_squash b WHERE a.id = ANY (array[1, ((b.id + b.id * 2)), 5]);
+ id | data | id | data
+----+------+----+------
+(0 rows)
+
+SELECT * FROM test_squash a, test_squash b WHERE a.id IN ($1, $2, $3, b.id, b.id + $4) \bind 1 2 3 1
+;
+ id | data | id | data
+----+------+----+------
+(0 rows)
+
SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C";
query | calls
-------------------------------------------------------------------------------------------------------------+-------
SELECT (ROW(ARRAY[$1 /*, ... */])).* | 1
SELECT (ROW(ARRAY[$1 /*, ... */], ARRAY[$2 /*, ... */])).* | 1
SELECT (ROW(ARRAY[$1 /*, ... */], ARRAY[$2 /*, ... */])).*, $3 | 1
+ SELECT * FROM test_squash a, test_squash b WHERE a.id = ANY (array[$1, ((b.id + b.id * $2)), $3]) | 1
+ SELECT * FROM test_squash a, test_squash b WHERE a.id IN ($1, $2, $3, b.id, b.id + $4) | 1
+ SELECT * FROM test_squash a, test_squash b WHERE a.id IN ($1, $2, $3, b.id, b.id + $4) | 1
SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1
-(8 rows)
+(11 rows)
--
-- cleanup
SELECT 1, 2, (ROW(ARRAY[1, 2], ARRAY[1, 2, 3])).*, 3, 4;
SELECT (ROW(ARRAY[1, 2], ARRAY[1, $1, 3])).*, 1 \bind 1
;
+
+-- IN and ANY clauses with Vars are not squashed.
+SELECT * FROM test_squash a, test_squash b WHERE a.id IN (1, 2, 3, b.id, b.id + 1);
+SELECT * FROM test_squash a, test_squash b WHERE a.id = ANY (array[1, ((b.id + b.id * 2)), 5]);
+SELECT * FROM test_squash a, test_squash b WHERE a.id IN ($1, $2, $3, b.id, b.id + $4) \bind 1 2 3 1
+;
SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C";
--
List *rnonvars;
bool useOr;
ListCell *l;
+ bool has_rvars = false;
/*
* If the operator is <>, combine with AND not OR.
rexprs = lappend(rexprs, rexpr);
if (contain_vars_of_level(rexpr, 0))
+ {
rvars = lappend(rvars, rexpr);
+ has_rvars = true;
+ }
else
rnonvars = lappend(rnonvars, rexpr);
}
newa->element_typeid = scalar_type;
newa->elements = aexprs;
newa->multidims = false;
- newa->list_start = a->rexpr_list_start;
- newa->list_end = a->rexpr_list_end;
newa->location = -1;
+ /*
+ * If the IN expression contains Vars, disable query jumbling
+ * squashing. Vars cannot be safely jumbled.
+ */
+ newa->list_start = has_rvars ? -1 : a->rexpr_list_start;
+ newa->list_end = has_rvars ? -1 : a->rexpr_list_end;
+
result = (Node *) make_scalar_array_op(pstate,
a->name,
useOr,