PostgreSQL Source Code  git master
brin_tuple.c File Reference
#include "postgres.h"
#include "access/brin_tuple.h"
#include "access/htup_details.h"
#include "access/tupdesc.h"
#include "access/tupmacs.h"
#include "utils/datum.h"
#include "utils/memutils.h"
Include dependency graph for brin_tuple.c:

Go to the source code of this file.

Functions

static void brin_deconstruct_tuple (BrinDesc *brdesc, char *tp, bits8 *nullbits, bool nulls, Datum *values, bool *allnulls, bool *hasnulls)
 
static TupleDesc brtuple_disk_tupdesc (BrinDesc *brdesc)
 
BrinTuplebrin_form_tuple (BrinDesc *brdesc, BlockNumber blkno, BrinMemTuple *tuple, Size *size)
 
BrinTuplebrin_form_placeholder_tuple (BrinDesc *brdesc, BlockNumber blkno, Size *size)
 
void brin_free_tuple (BrinTuple *tuple)
 
BrinTuplebrin_copy_tuple (BrinTuple *tuple, Size len, BrinTuple *dest, Size *destsz)
 
bool brin_tuples_equal (const BrinTuple *a, Size alen, const BrinTuple *b, Size blen)
 
BrinMemTuplebrin_new_memtuple (BrinDesc *brdesc)
 
BrinMemTuplebrin_memtuple_initialize (BrinMemTuple *dtuple, BrinDesc *brdesc)
 
BrinMemTuplebrin_deform_tuple (BrinDesc *brdesc, BrinTuple *tuple, BrinMemTuple *dMemtuple)
 

Function Documentation

◆ brin_copy_tuple()

BrinTuple* brin_copy_tuple ( BrinTuple tuple,
Size  len,
BrinTuple dest,
Size destsz 
)

Definition at line 319 of file brin_tuple.c.

References generate_unaccent_rules::dest, palloc(), and repalloc().

Referenced by brin_evacuate_page(), bringetbitmap(), brininsert(), and summarize_range().

320 {
321  if (!destsz || *destsz == 0)
322  dest = palloc(len);
323  else if (len > *destsz)
324  {
325  dest = repalloc(dest, len);
326  *destsz = len;
327  }
328 
329  memcpy(dest, tuple, len);
330 
331  return dest;
332 }
void * repalloc(void *pointer, Size size)
Definition: mcxt.c:1070
void * palloc(Size size)
Definition: mcxt.c:950

◆ brin_deconstruct_tuple()

static void brin_deconstruct_tuple ( BrinDesc brdesc,
char *  tp,
bits8 nullbits,
bool  nulls,
Datum values,
bool allnulls,
bool hasnulls 
)
inlinestatic

Definition at line 503 of file brin_tuple.c.

References att_addlength_pointer, att_align_nominal, att_align_pointer, att_isnull, attnum, BrinDesc::bd_info, BrinDesc::bd_tupdesc, brtuple_disk_tupdesc(), fetchatt, TupleDescData::natts, BrinOpcInfo::oi_nstored, and TupleDescAttr.

Referenced by brin_deform_tuple().

506 {
507  int attnum;
508  int stored;
509  TupleDesc diskdsc;
510  long off;
511 
512  /*
513  * First iterate to natts to obtain both null flags for each attribute.
514  * Note that we reverse the sense of the att_isnull test, because we store
515  * 1 for a null value (rather than a 1 for a not null value as is the
516  * att_isnull convention used elsewhere.) See brin_form_tuple.
517  */
518  for (attnum = 0; attnum < brdesc->bd_tupdesc->natts; attnum++)
519  {
520  /*
521  * the "all nulls" bit means that all values in the page range for
522  * this column are nulls. Therefore there are no values in the tuple
523  * data area.
524  */
525  allnulls[attnum] = nulls && !att_isnull(attnum, nullbits);
526 
527  /*
528  * the "has nulls" bit means that some tuples have nulls, but others
529  * have not-null values. Therefore we know the tuple contains data
530  * for this column.
531  *
532  * The hasnulls bits follow the allnulls bits in the same bitmask.
533  */
534  hasnulls[attnum] =
535  nulls && !att_isnull(brdesc->bd_tupdesc->natts + attnum, nullbits);
536  }
537 
538  /*
539  * Iterate to obtain each attribute's stored values. Note that since we
540  * may reuse attribute entries for more than one column, we cannot cache
541  * offsets here.
542  */
543  diskdsc = brtuple_disk_tupdesc(brdesc);
544  stored = 0;
545  off = 0;
546  for (attnum = 0; attnum < brdesc->bd_tupdesc->natts; attnum++)
547  {
548  int datumno;
549 
550  if (allnulls[attnum])
551  {
552  stored += brdesc->bd_info[attnum]->oi_nstored;
553  continue;
554  }
555 
556  for (datumno = 0;
557  datumno < brdesc->bd_info[attnum]->oi_nstored;
558  datumno++)
559  {
560  Form_pg_attribute thisatt = TupleDescAttr(diskdsc, stored);
561 
562  if (thisatt->attlen == -1)
563  {
564  off = att_align_pointer(off, thisatt->attalign, -1,
565  tp + off);
566  }
567  else
568  {
569  /* not varlena, so safe to use att_align_nominal */
570  off = att_align_nominal(off, thisatt->attalign);
571  }
572 
573  values[stored++] = fetchatt(thisatt, tp + off);
574 
575  off = att_addlength_pointer(off, thisatt->attlen, tp + off);
576  }
577  }
578 }
#define att_align_nominal(cur_offset, attalign)
Definition: tupmacs.h:148
#define att_isnull(ATT, BITS)
Definition: tupmacs.h:25
#define TupleDescAttr(tupdesc, i)
Definition: tupdesc.h:92
#define fetchatt(A, T)
Definition: tupmacs.h:41
static TupleDesc brtuple_disk_tupdesc(BrinDesc *brdesc)
Definition: brin_tuple.c:50
uint16 oi_nstored
Definition: brin_internal.h:28
TupleDesc bd_tupdesc
Definition: brin_internal.h:50
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:193
#define att_addlength_pointer(cur_offset, attlen, attptr)
Definition: tupmacs.h:176
#define att_align_pointer(cur_offset, attalign, attlen, attptr)
Definition: tupmacs.h:126
BrinOpcInfo * bd_info[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_internal.h:59
int16 attnum
Definition: pg_attribute.h:79
static Datum values[MAXATTR]
Definition: bootstrap.c:165

◆ brin_deform_tuple()

BrinMemTuple* brin_deform_tuple ( BrinDesc brdesc,
BrinTuple tuple,
BrinMemTuple dMemtuple 
)

Definition at line 420 of file brin_tuple.c.

References BrinDesc::bd_info, BrinDesc::bd_tupdesc, brin_deconstruct_tuple(), brin_memtuple_initialize(), brin_new_memtuple(), BrinTupleDataOffset, BrinTupleHasNulls, BrinTupleIsPlaceholder, BrinMemTuple::bt_allnulls, BrinMemTuple::bt_blkno, BrinTuple::bt_blkno, BrinMemTuple::bt_columns, BrinMemTuple::bt_context, BrinMemTuple::bt_hasnulls, BrinMemTuple::bt_placeholder, BrinMemTuple::bt_values, BrinValues::bv_allnulls, BrinValues::bv_hasnulls, BrinValues::bv_values, datumCopy(), i, MemoryContextSwitchTo(), TupleDescData::natts, BrinOpcInfo::oi_nstored, BrinOpcInfo::oi_typcache, SizeOfBrinTuple, TypeCacheEntry::typbyval, TypeCacheEntry::typlen, and values.

Referenced by brin_page_items(), bringetbitmap(), brininsert(), and union_tuples().

421 {
422  BrinMemTuple *dtup;
423  Datum *values;
424  bool *allnulls;
425  bool *hasnulls;
426  char *tp;
427  bits8 *nullbits;
428  int keyno;
429  int valueno;
430  MemoryContext oldcxt;
431 
432  dtup = dMemtuple ? brin_memtuple_initialize(dMemtuple, brdesc) :
433  brin_new_memtuple(brdesc);
434 
435  if (BrinTupleIsPlaceholder(tuple))
436  dtup->bt_placeholder = true;
437  dtup->bt_blkno = tuple->bt_blkno;
438 
439  values = dtup->bt_values;
440  allnulls = dtup->bt_allnulls;
441  hasnulls = dtup->bt_hasnulls;
442 
443  tp = (char *) tuple + BrinTupleDataOffset(tuple);
444 
445  if (BrinTupleHasNulls(tuple))
446  nullbits = (bits8 *) ((char *) tuple + SizeOfBrinTuple);
447  else
448  nullbits = NULL;
449  brin_deconstruct_tuple(brdesc,
450  tp, nullbits, BrinTupleHasNulls(tuple),
451  values, allnulls, hasnulls);
452 
453  /*
454  * Iterate to assign each of the values to the corresponding item in the
455  * values array of each column. The copies occur in the tuple's context.
456  */
457  oldcxt = MemoryContextSwitchTo(dtup->bt_context);
458  for (valueno = 0, keyno = 0; keyno < brdesc->bd_tupdesc->natts; keyno++)
459  {
460  int i;
461 
462  if (allnulls[keyno])
463  {
464  valueno += brdesc->bd_info[keyno]->oi_nstored;
465  continue;
466  }
467 
468  /*
469  * We would like to skip datumCopy'ing the values datum in some cases,
470  * caller permitting ...
471  */
472  for (i = 0; i < brdesc->bd_info[keyno]->oi_nstored; i++)
473  dtup->bt_columns[keyno].bv_values[i] =
474  datumCopy(values[valueno++],
475  brdesc->bd_info[keyno]->oi_typcache[i]->typbyval,
476  brdesc->bd_info[keyno]->oi_typcache[i]->typlen);
477 
478  dtup->bt_columns[keyno].bv_hasnulls = hasnulls[keyno];
479  dtup->bt_columns[keyno].bv_allnulls = false;
480  }
481 
482  MemoryContextSwitchTo(oldcxt);
483 
484  return dtup;
485 }
#define BrinTupleIsPlaceholder(tup)
Definition: brin_tuple.h:83
#define SizeOfBrinTuple
Definition: brin_tuple.h:71
#define BrinTupleHasNulls(tup)
Definition: brin_tuple.h:82
BlockNumber bt_blkno
Definition: brin_tuple.h:39
bool bv_allnulls
Definition: brin_tuple.h:28
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:109
BrinMemTuple * brin_new_memtuple(BrinDesc *brdesc)
Definition: brin_tuple.c:355
int16 typlen
Definition: typcache.h:39
bool typbyval
Definition: typcache.h:40
Datum * bt_values
Definition: brin_tuple.h:42
bool bt_placeholder
Definition: brin_tuple.h:38
bool bv_hasnulls
Definition: brin_tuple.h:27
TypeCacheEntry * oi_typcache[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_internal.h:34
uint16 oi_nstored
Definition: brin_internal.h:28
static void brin_deconstruct_tuple(BrinDesc *brdesc, char *tp, bits8 *nullbits, bool nulls, Datum *values, bool *allnulls, bool *hasnulls)
Definition: brin_tuple.c:503
BrinValues bt_columns[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_tuple.h:46
TupleDesc bd_tupdesc
Definition: brin_internal.h:50
bool * bt_hasnulls
Definition: brin_tuple.h:44
Datum datumCopy(Datum value, bool typByVal, int typLen)
Definition: datum.c:131
uint8 bits8
Definition: c.h:381
uintptr_t Datum
Definition: postgres.h:367
BrinOpcInfo * bd_info[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_internal.h:59
BlockNumber bt_blkno
Definition: brin_tuple.h:57
bool * bt_allnulls
Definition: brin_tuple.h:43
static Datum values[MAXATTR]
Definition: bootstrap.c:165
#define BrinTupleDataOffset(tup)
Definition: brin_tuple.h:81
int i
Datum * bv_values
Definition: brin_tuple.h:29
BrinMemTuple * brin_memtuple_initialize(BrinMemTuple *dtuple, BrinDesc *brdesc)
Definition: brin_tuple.c:382
MemoryContext bt_context
Definition: brin_tuple.h:40

◆ brin_form_placeholder_tuple()

BrinTuple* brin_form_placeholder_tuple ( BrinDesc brdesc,
BlockNumber  blkno,
Size size 
)

Definition at line 261 of file brin_tuple.c.

References BrinDesc::bd_tupdesc, BITMAPLEN, BRIN_NULLS_MASK, BRIN_PLACEHOLDER_MASK, BrinTuple::bt_blkno, BrinTuple::bt_info, HIGHBIT, MAXALIGN, TupleDescData::natts, palloc0(), and SizeOfBrinTuple.

Referenced by summarize_range().

262 {
263  Size len;
264  Size hoff;
265  BrinTuple *rettuple;
266  int keyno;
267  bits8 *bitP;
268  int bitmask;
269 
270  /* compute total space needed: always add nulls */
271  len = SizeOfBrinTuple;
272  len += BITMAPLEN(brdesc->bd_tupdesc->natts * 2);
273  len = hoff = MAXALIGN(len);
274 
275  rettuple = palloc0(len);
276  rettuple->bt_blkno = blkno;
277  rettuple->bt_info = hoff;
279 
280  bitP = ((bits8 *) ((char *) rettuple + SizeOfBrinTuple)) - 1;
281  bitmask = HIGHBIT;
282  /* set allnulls true for all attributes */
283  for (keyno = 0; keyno < brdesc->bd_tupdesc->natts; keyno++)
284  {
285  if (bitmask != HIGHBIT)
286  bitmask <<= 1;
287  else
288  {
289  bitP += 1;
290  *bitP = 0x0;
291  bitmask = 1;
292  }
293 
294  *bitP |= bitmask;
295  }
296  /* no need to set hasnulls */
297 
298  *size = len;
299  return rettuple;
300 }
#define SizeOfBrinTuple
Definition: brin_tuple.h:71
#define BITMAPLEN(NATTS)
Definition: htup_details.h:547
#define BRIN_NULLS_MASK
Definition: brin_tuple.h:79
TupleDesc bd_tupdesc
Definition: brin_internal.h:50
#define HIGHBIT
Definition: c.h:1096
#define BRIN_PLACEHOLDER_MASK
Definition: brin_tuple.h:78
uint8 bits8
Definition: c.h:381
void * palloc0(Size size)
Definition: mcxt.c:981
BlockNumber bt_blkno
Definition: brin_tuple.h:57
size_t Size
Definition: c.h:473
#define MAXALIGN(LEN)
Definition: c.h:698
uint8 bt_info
Definition: brin_tuple.h:68

◆ brin_form_tuple()

BrinTuple* brin_form_tuple ( BrinDesc brdesc,
BlockNumber  blkno,
BrinMemTuple tuple,
Size size 
)

Definition at line 88 of file brin_tuple.c.

References Assert, BrinDesc::bd_info, BrinDesc::bd_totalstored, BrinDesc::bd_tupdesc, BITMAPLEN, BRIN_NULLS_MASK, BRIN_OFFSET_MASK, BRIN_PLACEHOLDER_MASK, brtuple_disk_tupdesc(), BrinTuple::bt_blkno, BrinMemTuple::bt_columns, BrinTuple::bt_info, BrinMemTuple::bt_placeholder, BrinValues::bv_allnulls, BrinValues::bv_hasnulls, BrinValues::bv_values, heap_compute_data_size(), heap_fill_tuple(), HIGHBIT, MAXALIGN, TupleDescData::natts, BrinOpcInfo::oi_nstored, palloc(), palloc0(), pfree(), SizeOfBrinTuple, and values.

Referenced by brininsert(), form_and_insert_tuple(), and summarize_range().

90 {
91  Datum *values;
92  bool *nulls;
93  bool anynulls = false;
94  BrinTuple *rettuple;
95  int keyno;
96  int idxattno;
97  uint16 phony_infomask = 0;
98  bits8 *phony_nullbitmap;
99  Size len,
100  hoff,
101  data_len;
102 
103  Assert(brdesc->bd_totalstored > 0);
104 
105  values = (Datum *) palloc(sizeof(Datum) * brdesc->bd_totalstored);
106  nulls = (bool *) palloc0(sizeof(bool) * brdesc->bd_totalstored);
107  phony_nullbitmap = (bits8 *)
108  palloc(sizeof(bits8) * BITMAPLEN(brdesc->bd_totalstored));
109 
110  /*
111  * Set up the values/nulls arrays for heap_fill_tuple
112  */
113  idxattno = 0;
114  for (keyno = 0; keyno < brdesc->bd_tupdesc->natts; keyno++)
115  {
116  int datumno;
117 
118  /*
119  * "allnulls" is set when there's no nonnull value in any row in the
120  * column; when this happens, there is no data to store. Thus set the
121  * nullable bits for all data elements of this column and we're done.
122  */
123  if (tuple->bt_columns[keyno].bv_allnulls)
124  {
125  for (datumno = 0;
126  datumno < brdesc->bd_info[keyno]->oi_nstored;
127  datumno++)
128  nulls[idxattno++] = true;
129  anynulls = true;
130  continue;
131  }
132 
133  /*
134  * The "hasnulls" bit is set when there are some null values in the
135  * data. We still need to store a real value, but the presence of
136  * this means we need a null bitmap.
137  */
138  if (tuple->bt_columns[keyno].bv_hasnulls)
139  anynulls = true;
140 
141  for (datumno = 0;
142  datumno < brdesc->bd_info[keyno]->oi_nstored;
143  datumno++)
144  values[idxattno++] = tuple->bt_columns[keyno].bv_values[datumno];
145  }
146 
147  /* Assert we did not overrun temp arrays */
148  Assert(idxattno <= brdesc->bd_totalstored);
149 
150  /* compute total space needed */
151  len = SizeOfBrinTuple;
152  if (anynulls)
153  {
154  /*
155  * We need a double-length bitmap on an on-disk BRIN index tuple; the
156  * first half stores the "allnulls" bits, the second stores
157  * "hasnulls".
158  */
159  len += BITMAPLEN(brdesc->bd_tupdesc->natts * 2);
160  }
161 
162  len = hoff = MAXALIGN(len);
163 
164  data_len = heap_compute_data_size(brtuple_disk_tupdesc(brdesc),
165  values, nulls);
166  len += data_len;
167 
168  len = MAXALIGN(len);
169 
170  rettuple = palloc0(len);
171  rettuple->bt_blkno = blkno;
172  rettuple->bt_info = hoff;
173 
174  /* Assert that hoff fits in the space available */
175  Assert((rettuple->bt_info & BRIN_OFFSET_MASK) == hoff);
176 
177  /*
178  * The infomask and null bitmap as computed by heap_fill_tuple are useless
179  * to us. However, that function will not accept a null infomask; and we
180  * need to pass a valid null bitmap so that it will correctly skip
181  * outputting null attributes in the data area.
182  */
184  values,
185  nulls,
186  (char *) rettuple + hoff,
187  data_len,
188  &phony_infomask,
189  phony_nullbitmap);
190 
191  /* done with these */
192  pfree(values);
193  pfree(nulls);
194  pfree(phony_nullbitmap);
195 
196  /*
197  * Now fill in the real null bitmasks. allnulls first.
198  */
199  if (anynulls)
200  {
201  bits8 *bitP;
202  int bitmask;
203 
204  rettuple->bt_info |= BRIN_NULLS_MASK;
205 
206  /*
207  * Note that we reverse the sense of null bits in this module: we
208  * store a 1 for a null attribute rather than a 0. So we must reverse
209  * the sense of the att_isnull test in brin_deconstruct_tuple as well.
210  */
211  bitP = ((bits8 *) ((char *) rettuple + SizeOfBrinTuple)) - 1;
212  bitmask = HIGHBIT;
213  for (keyno = 0; keyno < brdesc->bd_tupdesc->natts; keyno++)
214  {
215  if (bitmask != HIGHBIT)
216  bitmask <<= 1;
217  else
218  {
219  bitP += 1;
220  *bitP = 0x0;
221  bitmask = 1;
222  }
223 
224  if (!tuple->bt_columns[keyno].bv_allnulls)
225  continue;
226 
227  *bitP |= bitmask;
228  }
229  /* hasnulls bits follow */
230  for (keyno = 0; keyno < brdesc->bd_tupdesc->natts; keyno++)
231  {
232  if (bitmask != HIGHBIT)
233  bitmask <<= 1;
234  else
235  {
236  bitP += 1;
237  *bitP = 0x0;
238  bitmask = 1;
239  }
240 
241  if (!tuple->bt_columns[keyno].bv_hasnulls)
242  continue;
243 
244  *bitP |= bitmask;
245  }
246  }
247 
248  if (tuple->bt_placeholder)
249  rettuple->bt_info |= BRIN_PLACEHOLDER_MASK;
250 
251  *size = len;
252  return rettuple;
253 }
#define BRIN_OFFSET_MASK
Definition: brin_tuple.h:76
void heap_fill_tuple(TupleDesc tupleDesc, Datum *values, bool *isnull, char *data, Size data_size, uint16 *infomask, bits8 *bit)
Definition: heaptuple.c:304
#define SizeOfBrinTuple
Definition: brin_tuple.h:71
bool bv_allnulls
Definition: brin_tuple.h:28
#define BITMAPLEN(NATTS)
Definition: htup_details.h:547
unsigned short uint16
Definition: c.h:373
void pfree(void *pointer)
Definition: mcxt.c:1057
static TupleDesc brtuple_disk_tupdesc(BrinDesc *brdesc)
Definition: brin_tuple.c:50
bool bt_placeholder
Definition: brin_tuple.h:38
bool bv_hasnulls
Definition: brin_tuple.h:27
uint16 oi_nstored
Definition: brin_internal.h:28
int bd_totalstored
Definition: brin_internal.h:56
BrinValues bt_columns[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_tuple.h:46
#define BRIN_NULLS_MASK
Definition: brin_tuple.h:79
TupleDesc bd_tupdesc
Definition: brin_internal.h:50
#define HIGHBIT
Definition: c.h:1096
#define BRIN_PLACEHOLDER_MASK
Definition: brin_tuple.h:78
uint8 bits8
Definition: c.h:381
void * palloc0(Size size)
Definition: mcxt.c:981
uintptr_t Datum
Definition: postgres.h:367
BrinOpcInfo * bd_info[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_internal.h:59
BlockNumber bt_blkno
Definition: brin_tuple.h:57
#define Assert(condition)
Definition: c.h:745
size_t Size
Definition: c.h:473
#define MAXALIGN(LEN)
Definition: c.h:698
Size heap_compute_data_size(TupleDesc tupleDesc, Datum *values, bool *isnull)
Definition: heaptuple.c:119
static Datum values[MAXATTR]
Definition: bootstrap.c:165
uint8 bt_info
Definition: brin_tuple.h:68
void * palloc(Size size)
Definition: mcxt.c:950
Datum * bv_values
Definition: brin_tuple.h:29

◆ brin_free_tuple()

void brin_free_tuple ( BrinTuple tuple)

Definition at line 306 of file brin_tuple.c.

References pfree().

Referenced by summarize_range().

307 {
308  pfree(tuple);
309 }
void pfree(void *pointer)
Definition: mcxt.c:1057

◆ brin_memtuple_initialize()

BrinMemTuple* brin_memtuple_initialize ( BrinMemTuple dtuple,
BrinDesc brdesc 
)

Definition at line 382 of file brin_tuple.c.

References BrinDesc::bd_info, BrinDesc::bd_tupdesc, BrinMemTuple::bt_columns, BrinMemTuple::bt_context, BrinValues::bv_allnulls, BrinValues::bv_attno, BrinValues::bv_hasnulls, BrinValues::bv_values, i, MAXALIGN, MemoryContextReset(), TupleDescData::natts, and BrinOpcInfo::oi_nstored.

Referenced by brin_deform_tuple(), brin_new_memtuple(), brinbuildCallback(), brinsummarize(), and initialize_brin_buildstate().

383 {
384  int i;
385  char *currdatum;
386 
388 
389  currdatum = (char *) dtuple +
390  MAXALIGN(sizeof(BrinMemTuple) +
391  sizeof(BrinValues) * brdesc->bd_tupdesc->natts);
392  for (i = 0; i < brdesc->bd_tupdesc->natts; i++)
393  {
394  dtuple->bt_columns[i].bv_allnulls = true;
395  dtuple->bt_columns[i].bv_hasnulls = false;
396 
397  dtuple->bt_columns[i].bv_attno = i + 1;
398  dtuple->bt_columns[i].bv_allnulls = true;
399  dtuple->bt_columns[i].bv_hasnulls = false;
400  dtuple->bt_columns[i].bv_values = (Datum *) currdatum;
401  currdatum += sizeof(Datum) * brdesc->bd_info[i]->oi_nstored;
402  }
403 
404  return dtuple;
405 }
struct BrinValues BrinValues
bool bv_allnulls
Definition: brin_tuple.h:28
void MemoryContextReset(MemoryContext context)
Definition: mcxt.c:137
bool bv_hasnulls
Definition: brin_tuple.h:27
AttrNumber bv_attno
Definition: brin_tuple.h:26
uint16 oi_nstored
Definition: brin_internal.h:28
BrinValues bt_columns[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_tuple.h:46
TupleDesc bd_tupdesc
Definition: brin_internal.h:50
uintptr_t Datum
Definition: postgres.h:367
BrinOpcInfo * bd_info[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_internal.h:59
#define MAXALIGN(LEN)
Definition: c.h:698
int i
Datum * bv_values
Definition: brin_tuple.h:29
MemoryContext bt_context
Definition: brin_tuple.h:40

◆ brin_new_memtuple()

BrinMemTuple* brin_new_memtuple ( BrinDesc brdesc)

Definition at line 355 of file brin_tuple.c.

References ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate, BrinDesc::bd_totalstored, BrinDesc::bd_tupdesc, brin_memtuple_initialize(), BrinMemTuple::bt_allnulls, BrinMemTuple::bt_context, BrinMemTuple::bt_hasnulls, BrinMemTuple::bt_values, CurrentMemoryContext, MAXALIGN, TupleDescData::natts, palloc(), and palloc0().

Referenced by brin_deform_tuple(), bringetbitmap(), and initialize_brin_buildstate().

356 {
357  BrinMemTuple *dtup;
358  long basesize;
359 
360  basesize = MAXALIGN(sizeof(BrinMemTuple) +
361  sizeof(BrinValues) * brdesc->bd_tupdesc->natts);
362  dtup = palloc0(basesize + sizeof(Datum) * brdesc->bd_totalstored);
363 
364  dtup->bt_values = palloc(sizeof(Datum) * brdesc->bd_totalstored);
365  dtup->bt_allnulls = palloc(sizeof(bool) * brdesc->bd_tupdesc->natts);
366  dtup->bt_hasnulls = palloc(sizeof(bool) * brdesc->bd_tupdesc->natts);
367 
369  "brin dtuple",
371 
372  brin_memtuple_initialize(dtup, brdesc);
373 
374  return dtup;
375 }
#define AllocSetContextCreate
Definition: memutils.h:170
Datum * bt_values
Definition: brin_tuple.h:42
#define ALLOCSET_DEFAULT_SIZES
Definition: memutils.h:192
int bd_totalstored
Definition: brin_internal.h:56
TupleDesc bd_tupdesc
Definition: brin_internal.h:50
bool * bt_hasnulls
Definition: brin_tuple.h:44
MemoryContext CurrentMemoryContext
Definition: mcxt.c:38
void * palloc0(Size size)
Definition: mcxt.c:981
uintptr_t Datum
Definition: postgres.h:367
bool * bt_allnulls
Definition: brin_tuple.h:43
#define MAXALIGN(LEN)
Definition: c.h:698
void * palloc(Size size)
Definition: mcxt.c:950
BrinMemTuple * brin_memtuple_initialize(BrinMemTuple *dtuple, BrinDesc *brdesc)
Definition: brin_tuple.c:382
MemoryContext bt_context
Definition: brin_tuple.h:40

◆ brin_tuples_equal()

bool brin_tuples_equal ( const BrinTuple a,
Size  alen,
const BrinTuple b,
Size  blen 
)

Definition at line 338 of file brin_tuple.c.

Referenced by brin_doupdate().

339 {
340  if (alen != blen)
341  return false;
342  if (memcmp(a, b, alen) != 0)
343  return false;
344  return true;
345 }

◆ brtuple_disk_tupdesc()

static TupleDesc brtuple_disk_tupdesc ( BrinDesc brdesc)
static

Definition at line 50 of file brin_tuple.c.

References BrinDesc::bd_context, BrinDesc::bd_disktdesc, BrinDesc::bd_info, BrinDesc::bd_totalstored, BrinDesc::bd_tupdesc, CreateTemplateTupleDesc(), i, MemoryContextSwitchTo(), TupleDescData::natts, BrinOpcInfo::oi_nstored, BrinOpcInfo::oi_typcache, TupleDescInitEntry(), and TypeCacheEntry::type_id.

Referenced by brin_deconstruct_tuple(), and brin_form_tuple().

51 {
52  /* We cache these in the BrinDesc */
53  if (brdesc->bd_disktdesc == NULL)
54  {
55  int i;
56  int j;
57  AttrNumber attno = 1;
58  TupleDesc tupdesc;
59  MemoryContext oldcxt;
60 
61  /* make sure it's in the bdesc's context */
62  oldcxt = MemoryContextSwitchTo(brdesc->bd_context);
63 
64  tupdesc = CreateTemplateTupleDesc(brdesc->bd_totalstored);
65 
66  for (i = 0; i < brdesc->bd_tupdesc->natts; i++)
67  {
68  for (j = 0; j < brdesc->bd_info[i]->oi_nstored; j++)
69  TupleDescInitEntry(tupdesc, attno++, NULL,
70  brdesc->bd_info[i]->oi_typcache[j]->type_id,
71  -1, 0);
72  }
73 
74  MemoryContextSwitchTo(oldcxt);
75 
76  brdesc->bd_disktdesc = tupdesc;
77  }
78 
79  return brdesc->bd_disktdesc;
80 }
TupleDesc CreateTemplateTupleDesc(int natts)
Definition: tupdesc.c:44
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:109
TypeCacheEntry * oi_typcache[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_internal.h:34
uint16 oi_nstored
Definition: brin_internal.h:28
int bd_totalstored
Definition: brin_internal.h:56
TupleDesc bd_tupdesc
Definition: brin_internal.h:50
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
Definition: tupdesc.c:603
BrinOpcInfo * bd_info[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_internal.h:59
MemoryContext bd_context
Definition: brin_internal.h:44
TupleDesc bd_disktdesc
Definition: brin_internal.h:53
int i
int16 AttrNumber
Definition: attnum.h:21