On Mon, Nov 29, 2021 at 10:33 PM Tom Lane <t...@sss.pgh.pa.us> wrote:

> Andy Fan <zhihui.fan1...@gmail.com> writes:
> > During my recent work,  I need some new stuff attached to Relation.
> Rather
> > than adding
> > some new data structures,  I added it to Relation directly.  Like
> > relation->balabala.  Then
> > I initialize it during ExecutorRun,  like  table_tuple_insert.. and
> > destroy it at ExecutorEnd.
>


> at least not if you expect that a relcache reset would not preserve the
> data.


Thanks for looking into this question.

I am not clear about this sentence .  IMO,  if the relcache is reset,  my
data
would be lost,  That's why I expect there is no relcache reset happening in
Executor Stage,  are you talking about something different?


> Also, what happens in the case of nested executor runs touching the same
> relation?
>

If you are talking about the RelationClose would be called many times, then
my solution is my resource is only destroyed when the refcount == 0;   If
you are talking
about the different situation needs different resource types, then that's
something
I didn't describe it clearly.  At the current time, we can assume "For 1
SQL statement, there
are only 1 resource needed per relation, even the executor or nest executor
touch the
same relation many times".   I'd like to describe this clearly as well for
review purposes,
but I want to focus on one topic only first.  So let's first assume my
assumption is correct.


> Why do you think this ought to be in the relcache, and not in the
> executor's rangetable-associated data structures?
>
>
I just see the ExecutorEnd code is not called after the exceptions case.
and I hope my resource
can be released totally even if the statement raises errors.  for example:

CREATE TABLE t(A INT PRIMARY KEY);

INSERT INTO t VALUES(1);
INSERT INTO t VALUES(1);

In the above case, the ExecutorEnd is not called, but the RelationClose
will be absolutely called
during the ResourceOwnerRelease call.

-- 
Best Regards
Andy Fan

Reply via email to