On Mon, 20 Nov 2023 at 10:00, Amit Langote <amitlangot...@gmail.com> wrote: > > On Thu, Sep 28, 2023 at 5:26 PM Amit Langote <amitlangot...@gmail.com> wrote: > > On Tue, Sep 26, 2023 at 10:06 PM Amit Langote <amitlangot...@gmail.com> > > wrote: > > > 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. > > > > Pushed that one. Here are the rebased patches. > > > > 0001 seems ready to me, but I'll wait a couple more days for others to > > weigh in. Just to highlight a kind of change that others may have > > differing opinions on, consider this hunk from the patch: > > > > - MemoryContextDelete(node->aggcontext); > > + if (node->aggcontext != NULL) > > + { > > + MemoryContextDelete(node->aggcontext); > > + node->aggcontext = NULL; > > + } > > ... > > + ExecEndNode(outerPlanState(node)); > > + outerPlanState(node) = NULL; > > > > So the patch wants to enhance the consistency of setting the pointer > > to NULL after freeing part. Robert mentioned his preference for doing > > it in the patch, which I agree with. > > Rebased.
There is a leak reported at [1], details for the same is available at [2]: diff -U3 /tmp/cirrus-ci-build/src/test/regress/expected/select_views.out /tmp/cirrus-ci-build/build/testrun/regress-running/regress/results/select_views.out --- /tmp/cirrus-ci-build/src/test/regress/expected/select_views.out 2023-12-19 23:00:04.677385000 +0000 +++ /tmp/cirrus-ci-build/build/testrun/regress-running/regress/results/select_views.out 2023-12-19 23:06:26.870259000 +0000 @@ -1288,6 +1288,7 @@ (102, '2011-10-12', 120), (102, '2011-10-28', 200), (103, '2011-10-15', 480); +WARNING: resource was not closed: relation "customer_pkey" CREATE VIEW my_property_normal AS SELECT * FROM customer WHERE name = current_user; CREATE VIEW my_property_secure WITH (security_barrier) A [1] - https://cirrus-ci.com/task/6494009196019712 [2] - https://api.cirrus-ci.com/v1/artifact/task/6494009196019712/testrun/build/testrun/regress-running/regress/regression.diffs Regards, Vingesh