Re: posgres 12 bug (partitioned table) - Mailing list pgsql-bugs
From | Soumyadeep Chakraborty |
---|---|
Subject | Re: posgres 12 bug (partitioned table) |
Date | |
Msg-id | CAE-ML+9FdRAke2AB_cRpazjcvBYZSjO15hA3CeEuadg8j7Njtg@mail.gmail.com Whole thread Raw |
In response to | Re: posgres 12 bug (partitioned table) (Amit Langote <amitlangote09@gmail.com>) |
Responses |
Re: posgres 12 bug (partitioned table)
Re: posgres 12 bug (partitioned table) |
List | pgsql-bugs |
Hi Amit, Thanks for your reply! On Tue, Jul 7, 2020 at 7:18 AM Amit Langote <amitlangote09@gmail.com> wrote: > > Hi Soumyadeep, > > Thanks for picking this up. > > On Tue, Jul 7, 2020 at 7:46 AM Soumyadeep Chakraborty > <soumyadeep2007@gmail.com> wrote: > > Upon investigation, it seems that the problem is caused by the > > following: > > > > The slot passed to the call to ExecProcessReturning() inside > > ExecInsert() is often a virtual tuple table slot. > > Actually, not that often in practice. The slot is not virtual, for > example, when inserting into a regular non-partitioned table. Indeed! I meant partitioned tables are a common use case. Sorry, I should have elaborated. > If I change this to return a "heap" slot for partitioned tables, just > like for foreign tables, the problem goes away (see the attached). In > fact, even make check-world passes, so I don't know why it isn't that > way to begin with. > This is what I had thought of initially but I had taken a step back for 2 reasons: 1. It is not mandatory for an AM to supply a heap tuple in the slot passed to any AM routine. With your patch, the slot passed to table_tuple_insert() inside ExecInsert() for instance is now expected to supply a heap tuple for the subsequent call to ExecProcessReturning(). This can lead to garbage values for xmin, xmax, cmin and cmax. I tried applying your patch on Zedstore [1], a columnar AM, and consequently, I got incorrect values for xmin, xmax etc with the query reported in this issue. 2. This is a secondary aspect but I will mention it here for completeness. Not knowing enough about this code: will demanding heap tuples for partitioned tables all throughout the code have a performance impact? At a first glance it didn't seem to be the case. However, I did find lots of callsites for partitioning or otherwise where we kind of expect a virtual tuple table slot (as evidenced with the calls to ExecStoreVirtualTuple()). With your patch, we seem to be calling ExecStoreVirtualTuple() on a heap tuple table slot, in various places: such as inside execute_attr_map_slot(). It seems to be harmless to do so however, in accordance with my limited investigation. All in all, I think we have to explicitly supply those system columns. I heard from Daniel that one of the motivations for having table AMs was to ensure that transaction meta-data storage is not demanded off any AM. [1] https://github.com/greenplum-db/postgres/tree/zedstore Regards, Soumyadeep
pgsql-bugs by date: