Unprocessed SubLink from whole-row join alias expansion - Mailing list pgsql-hackers

From Richard Guo
Subject Unprocessed SubLink from whole-row join alias expansion
Date
Msg-id CAMbWs49PgeNFhQTZ2gSzwatF0_LXyegMPGt++jSfxUN7NZuQ5Q@mail.gmail.com
Whole thread
Responses Re: Unprocessed SubLink from whole-row join alias expansion
List pgsql-hackers
Further fuzzing with Claude on the join alias found this bug.  The
following queries fail in various ways on master and all supported
branches:

create table t (a int, b int);

select 1 from ((select (select 1) as x) s cross join t) j
  where (select 1 where j is null) is null;
ERROR:  cannot handle unplanned sub-select

select 1 from ((select (select 1) as x) s cross join t) j
  where (1, 1) in (select (j is null)::int, count(*) from t);
TRAP: failed Assert("!IsA(node, SubLink)"), File: "prepagg.c"

select 1 from ((select (select 1) as x) s cross join t) j
  where exists (select 1 from t tablesample system ((j is null)::int * 100));
ERROR:  unrecognized node type: 22

Once subquery s is flattened, the joinaliasvars entry for j.x is no
longer a Var but the SubLink (select 1), so expanding a reference to j
inside a sub-select inserts a SubLink into that sub-select.

But flatten_join_alias_vars_mutator fails to notice this and thus does
not set the sub-select's hasSubLinks flag.  So preprocess_expression
skips SS_process_sublinks, and the SubLink survives into code that
can't cope with one.

The fix is to make the same checkExprHasSubLink() test in the
whole-row path.  See attached.

- Richard

Attachment

pgsql-hackers by date:

Previous
From: Masahiko Sawada
Date:
Subject: Re: Add a hook for handling logical decoding messages on subscribers.
Next
From: shihao zhong
Date:
Subject: Re: REPACK (CONCURRENTLY) decoding worker is canceled by lock_timeout