Re: generic plans and "initial" pruning

From: Amit Langote <amitlangote09(at)gmail(dot)com>
To: Robert Haas <robertmhaas(at)gmail(dot)com>
Cc: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Andres Freund <andres(at)anarazel(dot)de>, Daniel Gustafsson <daniel(at)yesql(dot)se>, David Rowley <dgrowleyml(at)gmail(dot)com>, Jacob Champion <jchampion(at)timescale(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>, Thom Brown <thom(at)linux(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Subject: Re: generic plans and "initial" pruning
Date: 2023-09-26 13:06:12
Message-ID: CA+HiwqFM6qE-qc5SQyQYXf-OTsPOaCVq=qDqBnyra_mthySLRw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Mon, Sep 25, 2023 at 9:57 PM Amit Langote <amitlangote09(at)gmail(dot)com> wrote:
> On Wed, Sep 6, 2023 at 11:20 PM Robert Haas <robertmhaas(at)gmail(dot)com> wrote:
> > - Is there any point to all of these early exit cases? For example, in
> > ExecInitBitmapAnd, why exit early if initialization fails? Why not
> > just plunge ahead and if initialization failed the caller will notice
> > that and when we ExecEndNode some of the child node pointers will be
> > NULL but who cares? The obvious disadvantage of this approach is that
> > we're doing a bunch of unnecessary initialization, but we're also
> > speeding up the common case where we don't need to abort by avoiding a
> > branch that will rarely be taken. I'm not quite sure what the right
> > thing to do is here.
> I thought about this some and figured that adding the
> is-CachedPlan-still-valid tests in the following places should suffice
> after all:
>
> 1. In InitPlan() right after the top-level ExecInitNode() calls
> 2. In ExecInit*() functions of Scan nodes, right after
> ExecOpenScanRelation() calls

After sleeping on this, I think we do need the checks after all the
ExecInitNode() calls too, because we have many instances of the code
like the following one:

outerPlanState(gatherstate) = ExecInitNode(outerNode, estate, eflags);
tupDesc = ExecGetResultType(outerPlanState(gatherstate));
<some code that dereferences outDesc>

If outerNode is a SeqScan and ExecInitSeqScan() returned early because
ExecOpenScanRelation() detected that plan was invalidated, then
tupDesc would be NULL in this case, causing the code to crash.

Now one might say that perhaps we should only add the
is-CachedPlan-valid test in the instances where there is an actual
risk of such misbehavior, but that could lead to confusion, now or
later. It seems better to add them after every ExecInitNode() call
while we're inventing the notion, because doing so relieves the
authors of future enhancements of the ExecInit*() routines from
worrying about any of this.

Attached 0003 should show how that turned out.

Updated 0002 as mentioned in the previous reply -- setting pointers to
NULL after freeing them more consistently across various ExecEnd*()
routines and using the `if (pointer != NULL)` style over the `if
(pointer)` more consistently.

Updated 0001's commit message to remove the mention of its relation to
any future commits. I intend to push it tomorrow.

Patches 0004 onwards contain changes too, mainly in terms of moving
the code around from one patch to another, but I'll omit the details
of the specific change for now.

--
Thanks, Amit Langote
EDB: http://www.enterprisedb.com

Attachment Content-Type Size
v47-0005-Teach-the-executor-to-lock-child-tables-in-some-.patch application/octet-stream 11.1 KB
v47-0007-Add-field-to-store-parent-relids-to-Append-Merge.patch application/octet-stream 26.1 KB
v47-0009-Track-opened-range-table-relations-in-a-List-in-.patch application/octet-stream 2.5 KB
v47-0006-Assert-that-relations-needing-their-permissions-.patch application/octet-stream 5.1 KB
v47-0008-Delay-locking-of-child-tables-in-cached-plans-un.patch application/octet-stream 25.2 KB
v47-0002-Check-pointer-NULLness-before-cleanup-in-ExecEnd.patch application/octet-stream 31.3 KB
v47-0004-Adjustments-to-allow-ExecutorStart-to-sometimes-.patch application/octet-stream 49.3 KB
v47-0003-Prepare-executor-to-support-detecting-CachedPlan.patch application/octet-stream 41.3 KB
v47-0001-Remove-obsolete-executor-cleanup-code.patch application/octet-stream 31.1 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Alexander Pyhalov 2023-09-26 13:15:14 Re: Partial aggregates pushdown
Previous Message David Rowley 2023-09-26 13:05:44 Re: Correct the documentation for work_mem