Re: [BUG] Remove self joins causes 'variable not found in subplan target lists' error
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Richard Guo <guofenglinux@gmail.com>
Cc: Sergey Soloviev <sergey.soloviev@tantorlabs.ru>,
pgsql-hackers@lists.postgresql.org
Date: 2025-08-25T19:16:07Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix semijoin unique-ification for child relations
- 58ea074f1433 18.0 landed
- 97b0f36bde9a 19 (unreleased) landed
-
Fix "variable not found in subplan target lists" in semijoin de-duplication.
- b8a1bdc458e3 19 (unreleased) landed
- 3aee6283709f 18.0 landed
-
Recalculate where-needed data accurately after a join removal.
- a3179ab692be 18.0 cited
Attachments
- v3-fix-variable-not-found-in-subplan-target-lists.patch (text/x-diff) patch v3
I wrote: > Yeah. I think this is an oversight in create_unique_paths(): it's > building an ORDER BY list without consideration for the possibility > that some of the entries are known to be constant. In fact, because > make_pathkeys_for_sortclauses will get rid of redundancies, this > example actually ends up with a unique_rel whose unique_pathkeys > are shorter than the unique_groupclause, which is pretty bogus. Here is a patch that fixes it that way. I like this better than Sergey's approach because it is making the plans better not worse. There are a couple loose ends yet to be dealt with: * The fact that we now avoid duplicate unique-ifications is good, but I think it breaks the test case added by 44e95b572, since that's no longer demonstrating what it set out to demonstrate. (See the delta in aggregates.out.) I'm not sure that that's a huge problem, but we probably at least ought to modify the comment on that test case. * What happens if we find that *all* the semi_rhs_exprs are known constant? We'll compute empty pathkeys and groupClause, but then what? It looks like create_final_unique_paths etc then build a useless Unique step. Maybe we should just absorb the input relation's path list as-is? regards, tom lane