Re: BUG #17994: Invalidating relcache corrupts tupDesc inside ExecEvalFieldStoreDeForm()

From: Andrew Dunstan <andrew(at)dunslane(dot)net>
To: Andres Freund <andres(at)anarazel(dot)de>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: exclusion(at)gmail(dot)com, pgsql-bugs(at)lists(dot)postgresql(dot)org
Subject: Re: BUG #17994: Invalidating relcache corrupts tupDesc inside ExecEvalFieldStoreDeForm()
Date: 2023-06-28 21:57:47
Message-ID: e52f6028-7196-8545-9726-a17a50ea14a3@dunslane.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs


On 2023-06-28 We 16:54, Andres Freund wrote:
> Hi,
>
> On 2023-06-28 15:52:28 -0400, Tom Lane wrote:
>> Andres Freund<andres(at)anarazel(dot)de> writes:
>>> If other sessions caused the tupledesc to be changed,
>>> we should already hang onto the old definition via the
>>> RememberToFreeTupleDescAtEOX() mechanism?
>> I believe the tupdesc in question is actually in the typcache,
>> which doesn't have anything like RememberToFreeTupleDescAtEOX
>> (which is a horrid hack anyway if you ask me).
> It's in the typecache, but that just uses the relcache's tupledesc for
> non-record composites. But looks like it doesn't suffice, because
> TypeCacheRelCallback() releases the refcount the typecache held, regardless of
> the tupledesc having changed meaningfully or not.
>
> So even if there can't have been "important" changes to the tupledesc due to
> locking, we end up with the newer tupledesc on a second lookup...
>
>
> I agree that the RememberToFreeTupleDescAtEOX thing is a ugly hack, but I
> don't think it's easy to come up with something good...
>
>
>> We could probably make things better for this specific case by
>> teaching the typcache not to replace a cached tupdesc unless its
>> contents actually change. But that just makes it harder to get
>> to a bug instance; it's not a cure-all.
> Yea :(.
>

:-(

I thought about  whether the datumCopy() idea might be manageable, but
getmissingattr() is inlined by heap_getttr() which has distressingly
large number of call sites, including in third party code.

Could we maybe cache missing values elsewhere in a way that's less
volatile? That's an extremely vague idea, just thinking out loud.

cheers

andrew

--
Andrew Dunstan
EDB:https://www.enterprisedb.com

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Michael Paquier 2023-06-28 22:57:40 Re: BUG #18000: Access method used by matview can be dropped leaving broken matview
Previous Message Andres Freund 2023-06-28 20:59:55 Re: BUG #18002: Duplicate entries of row possible even after having primary key