mirror of
https://github.com/postgres/postgres.git
synced 2025-05-17 06:41:24 +03:00
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.
This commit is contained in:
parent
05ec931add
commit
b44ae4893d
@ -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)
|
|||||||
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)
|
|||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user