On Fri, Dec 9, 2022 at 7:49 PM Alvaro Herrera <alvhe...@alvh.no-ip.org> wrote: > On 2022-Dec-09, Amit Langote wrote: > > On Fri, Dec 9, 2022 at 6:52 PM Alvaro Herrera <alvhe...@alvh.no-ip.org> > > wrote: > > > Remind me again why is part_prune_results_list not part of struct > > > CachedPlan then? I tried to understand that based on comments upthread, > > > but I was unable to find anything. > > > > > (My first reaction to your above comment was "well, rename GetCachedPlan > > > then, maybe to GetRunnablePlan", but then I'm wondering if CachedPlan is > > > in any way a structure that must be "immutable" in the way parser output > > > is. Looking at the comment at the top of plancache.c it appears to me > > > that it isn't, but maybe I'm missing something.) > > > > CachedPlan *is* supposed to be read-only per the comment above > > CachedPlanSource definition: > > > > * ...If we are using a generic > > * cached plan then it is meant to be re-used across multiple executions, so > > * callers must always treat CachedPlans as read-only. > > I read that as implying that the part_prune_results_list must remain > intact as long as no invalidations occur. Does part_prune_result_list > really change as a result of something other than a sinval event? > Keep in mind that if a sinval message that touches one of the relations > in the plan arrives, then we'll discard it and generate it afresh. I > don't see that the part_prune_results_list would change otherwise, but > maybe I misunderstand?
Pruning will be done afresh on every fetch of a given cached plan when CheckCachedPlan() is called on it, so the part_prune_results_list part will be discarded and rebuilt as many times as the plan is executed. You'll find a description around CachedPlanSavePartitionPruneResults() that's in v12. -- Thanks, Amit Langote EDB: http://www.enterprisedb.com