Commit 7ab32140 authored by Tom Lane's avatar Tom Lane

Fix crash in assign_collations_walker for EXISTS with empty SELECT list.

We (I think I, actually) forgot about this corner case while coding
collation resolution.  Per bug #8648 from Arjen Nienhuis.
parent 02bb4bbc
...@@ -484,16 +484,22 @@ assign_collations_walker(Node *node, assign_collations_context *context) ...@@ -484,16 +484,22 @@ assign_collations_walker(Node *node, assign_collations_context *context)
* SubLink. Act as though the Query returns its first output * SubLink. Act as though the Query returns its first output
* column, which indeed is what it does for EXPR_SUBLINK and * column, which indeed is what it does for EXPR_SUBLINK and
* ARRAY_SUBLINK cases. In the cases where the SubLink * ARRAY_SUBLINK cases. In the cases where the SubLink
* returns boolean, this info will be ignored. * returns boolean, this info will be ignored. Special case:
* in EXISTS, the Query might return no columns, in which case
* we need do nothing.
* *
* We needn't recurse, since the Query is already processed. * We needn't recurse, since the Query is already processed.
*/ */
Query *qtree = (Query *) node; Query *qtree = (Query *) node;
TargetEntry *tent; TargetEntry *tent;
if (qtree->targetList == NIL)
return false;
tent = (TargetEntry *) linitial(qtree->targetList); tent = (TargetEntry *) linitial(qtree->targetList);
Assert(IsA(tent, TargetEntry)); Assert(IsA(tent, TargetEntry));
Assert(!tent->resjunk); if (tent->resjunk)
return false;
collation = exprCollation((Node *) tent->expr); collation = exprCollation((Node *) tent->expr);
/* collation doesn't change if it's converted to array */ /* collation doesn't change if it's converted to array */
strength = COLLATE_IMPLICIT; strength = COLLATE_IMPLICIT;
......
...@@ -700,3 +700,13 @@ explain (verbose, costs off) ...@@ -700,3 +700,13 @@ explain (verbose, costs off)
One-Time Filter: ("*VALUES*".column1 = "*VALUES*".column1) One-Time Filter: ("*VALUES*".column1 = "*VALUES*".column1)
(8 rows) (8 rows)
--
-- Check we behave sanely in corner case of empty SELECT list (bug #8648)
--
create temp table nocolumns();
select exists(select * from nocolumns);
exists
--------
f
(1 row)
...@@ -405,3 +405,9 @@ explain (verbose, costs off) ...@@ -405,3 +405,9 @@ explain (verbose, costs off)
explain (verbose, costs off) explain (verbose, costs off)
select x, x from select x, x from
(select (select random() where y=y) as x from (values(1),(2)) v(y)) ss; (select (select random() where y=y) as x from (values(1),(2)) v(y)) ss;
--
-- Check we behave sanely in corner case of empty SELECT list (bug #8648)
--
create temp table nocolumns();
select exists(select * from nocolumns);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment