Re: TupleTableSlot abstraction
Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>
At Tue, 25 Sep 2018 16:45:09 -0700, Andres Freund <andres@anarazel.de> wrote in <20180925234509.3hrrf6tmvy5tfith@alap3.anarazel.de> > Hi, > > On 2018-09-04 18:35:34 +0530, Amit Khandekar wrote: > > Subject: [PATCH 05/14] Use tts_flags instead of previous bool members > > > > Pack the boolean members in TupleTableSlot into a 16 bit tts_flags. > > This reduces the size of TupleTableSlot since each bool member takes > > at least a byte on the platforms where bool is defined as a char. > > > > Ashutosh Bapat and Andres Freund > > > + > > +/* true = slot is empty */ > > +#define TTS_ISEMPTY (1 << 1) > > +#define IS_TTS_EMPTY(slot) ((slot)->tts_flags & TTS_ISEMPTY) > > +#define SET_TTS_EMPTY(slot) ((slot)->tts_flags |= TTS_ISEMPTY) > > +#define RESET_TTS_EMPTY(slot) ((slot)->tts_flags &= ~TTS_ISEMPTY) > > The flag stuff is the right way, but I'm a bit dubious about the > accessor functions. I can see open-coding the accesses, using the > macros, or potentially going towards using bitfields. > > Any comments? Currently we have few setter/resetter function(macro)s for such simple operations. FWIW open-coding in the following two looks rather easier to me. > if (IS_TTS_EMPTY(slot)) > if (slot->tts_flags & TTS_ISEMPTY) About bitfields, an advantage of it is debugger awareness. We don't need to look aside to the definitions of bitwise macros while using debugger. And the current code is preserved in appearance by using it. > if (slot->tts_isempty) > slot->tts_isempty = true; In short, +1 from me to use bitfields. Coulnd't we use bitfield here, possiblly in other places then? ===== Not related to tuple slots, in other places, like infomask, we handle a set of bitmap values altogether. > infomask = tuple->t_data->t_infomask; Bare bitfields are a bit inconvenient for the use. It gets simpler using C11 anonymous member but not so bothersome even in C99. Anyway I don't think we jump into that immediately. infomask.all = tuple->t_data->t_infomask.all; - if (!HeapTupleHeaderXminCommitted(tuple)) C99> if (tuple->t_infomask.b.xmin_committed) C11> if (tuple->t_infomask.xmin_committed) regards. -- Kyotaro Horiguchi NTT Open Source Software Center
Commits
-
Fix memory leak when inserting tuple at relation creation for CTAS
- 414a9d3cf34c 12.0 landed
-
Build HashState's hashkeys expression with the correct parent.
- 5f32b29c1819 12.0 landed
-
Move TupleTableSlots boolean member into one flag variable.
- c5257345ef61 12.0 landed
-
Move generic slot support functions from heaptuple.c into execTuples.c.
- 9d906f1119de 12.0 landed
-
Remove absolete function TupleDescGetSlot().
- 10763358c3f0 12.0 landed
-
Remove function list from prologue of execTuples.c.
- bbdfbb9154fc 12.0 landed
-
Split ExecStoreTuple into ExecStoreHeapTuple and ExecStoreBufferHeapTuple.
- 29c94e03c7d0 12.0 landed
-
Change TupleTableSlot->tts_nvalid to type AttrNumber.
- a598708ffa8e 12.0 landed
-
Deduplicate code between slot_getallattrs() and slot_getsomeattrs().
- 88ebd62fcc2e 12.0 landed
-
Mention ownership requirements for REFRESH MATERIALIZED VIEW in docs
- ee8012481190 12.0 cited
-
Spell "partitionwise" consistently.
- 31380bc7c204 12.0 cited
-
Fix WHERE CURRENT OF when the referenced cursor uses an index-only scan.
- 8f5ac440430a 11.0 cited