Re: PlaceholderVars and join removal with appendrel parents

From: Tender Wang <tndrwang(at)gmail(dot)com>
To: Arne Roland <arne(dot)roland(at)malkut(dot)net>
Cc: Richard Guo <guofenglinux(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: PlaceholderVars and join removal with appendrel parents
Date: 2026-07-13 13:44:24
Message-ID: CAHewXN=8rQBLKyisxkukeekRaAR4Ub--vgMMYYe_Y-eJ-JcwyQ@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Arne Roland <arne(dot)roland(at)malkut(dot)net> 于2026年7月13日周一 18:24写道:
>
> Hi Richard,
>
> thank you for your great work with the optimizer!
>
> I just stumbled and by accident landed on your commit 9a60f295bcb (and
> then looked up the discussion
> https://www.postgresql.org/message-id/flat/CALzhyqwryL2QywgO03VQr_237Sq3MEVgTTT2_A9G3nGT5-SRZg%40mail.gmail.com)
> I am under the impression we need to extend the same fix for or clauses
> descending into the orclause sub-RestrictInfos.
>
> This is the simplified minimal test case, that is failing for me:
>
> CREATE TABLE a (id int PRIMARY KEY, b_id int);
> CREATE TABLE uniq (id int PRIMARY KEY);
> CREATE TABLE parted_b (id int PRIMARY KEY) PARTITION BY RANGE (id);
> CREATE TABLE parted_b1 PARTITION OF parted_b FOR VALUES FROM (0) TO (10);
>
> SELECT 1 FROM a, (SELECT t1.id FROM parted_b t1 LEFT JOIN uniq t2 ON
> t1.id = t2.id) s
> WHERE (s.id = 1 AND a.id = 2) OR (s.id = 3 AND a.id = 4) GROUP BY ();
>

Yeah, the last fix can't cover this case, because the
otherrel->baserestrictinfo is NIL when trying to remove outerjoin rel
from phv.
The the otherrel->baserestrictinfo would be assigned when calling
extract_restriction_or_clauses() in query_planner().
But in extract_restriction_or_clauses(), we had no way to make the thing right.

> My idea would be to put a bitmapset into remove_rel_from_query with the
> seen ones and recurse removing it from the rinfo. I attached a sketch of
> my idea. But maybe our have a better one.

It seems that we have to process otherrel's baserestrictinfo and
joininfo if the query involves a partition table.
If we ignore one of them in add_other_rels_to_query(), the rel that
was removed is brought back to the child rel.
Then the crash would happen.

I took a quick look at this patch. It seems workable.

--
Thanks,
Tender Wang

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Henson Choi 2026-07-13 13:55:05 Re: Row pattern recognition
Previous Message Tom Lane 2026-07-13 13:42:47 Re: Small patch to improve safety of utf8_to_unicode().