Re: BUG #19099: Conditional DELETE from partitioned table with non-updatable partition raises internal error

Tender Wang <tndrwang@gmail.com>

From: Tender Wang <tndrwang@gmail.com>
To: Amit Langote <amitlangote09@gmail.com>
Cc: Kirill Reshke <reshkekirill@gmail.com>, Tom Lane <tgl@sss.pgh.pa.us>, jian he <jian.universality@gmail.com>, exclusion@gmail.com, pgsql-bugs@lists.postgresql.org
Date: 2025-10-30T11:08:26Z
Lists: pgsql-bugs
Amit Langote <amitlangote09@gmail.com> 于2025年10月30日周四 16:29写道:

>
>
> I am not really sure if we should play with the planner code.
>
> I suspect the real issue is that we’re assuming partitioned tables
> always need a ctid, which wasn’t true before MERGE started using the
> root ResultRelInfo. In fact, the old code already looked wrong -- it’s
> been requiring a ctid even for partitioned tables where that was never
> necessary. We can fix this by only requiring the junk ctid when we
> actually operate through the root partitioned table, that is, for
> MERGE.  Like the attached.
>

With your patch, this issue didn't happen again.
But I still get a different output when I enable verbose in EXPLAIN,

Output: ctid (enable_partition_pruning = on)
vs
Output: NULL::oid(enable_partition_pruning = off)

From the user's perspective, it's a bit confusing.
I agree more with Tom’s opinion — we should throw an error like "cannot
delete from foreign table p1"
But the plan only had a dummy root relation; CheckValidResultRel() doesn't
work.
Some other code place may need to do something.


-- 
Thanks,
Tender Wang