Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Postgres/src/include/storage/   (Postgres Database Version 18.4©)  Datei vom 11.4.2026 mit Größe 5 kB image not shown  

Quelle  brin_tuple.h   Sprache: unbekannt

 
/*
 * brin_tuple.h
 *  Declarations for dealing with BRIN-specific tuples.
 *
 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * IDENTIFICATION
 *   src/include/access/brin_tuple.h
 */

#ifndef BRIN_TUPLE_H
#define BRIN_TUPLE_H

#include "access/brin_internal.h"
#include "access/tupdesc.h"

/*
 * The BRIN opclasses may register serialization callback, in case the on-disk
 * and in-memory representations differ (e.g. for performance reasons).
 */

typedef void (*brin_serialize_callback_type) (BrinDesc *bdesc, Datum src, Datum *dst);

/*
 * A BRIN index stores one index tuple per page range.  Each index tuple
 * has one BrinValues struct for each indexed column; in turn, each BrinValues
 * has (besides the null flags) an array of Datum whose size is determined by
 * the opclass.
 */

typedef struct BrinValues
{
 AttrNumber bv_attno;  /* index attribute number */
 bool  bv_hasnulls; /* are there any nulls in the page range? */
 bool  bv_allnulls; /* are all values nulls in the page range? */
 Datum    *bv_values;  /* current accumulated values */
 Datum  bv_mem_value; /* expanded accumulated values */
 MemoryContext bv_context;
 brin_serialize_callback_type bv_serialize;
} BrinValues;

/*
 * This struct is used to represent an in-memory index tuple.  The values can
 * only be meaningfully decoded with an appropriate BrinDesc.
 */

typedef struct BrinMemTuple
{
 bool  bt_placeholder; /* this is a placeholder tuple */
 bool  bt_empty_range; /* range represents no tuples */
 BlockNumber bt_blkno;  /* heap blkno that the tuple is for */
 MemoryContext bt_context; /* memcxt holding the bt_columns values */
 /* output arrays for brin_deform_tuple: */
 Datum    *bt_values;  /* values array */
 bool    *bt_allnulls; /* allnulls array */
 bool    *bt_hasnulls; /* hasnulls array */
 /* not an output array, but must be last */
 BrinValues bt_columns[FLEXIBLE_ARRAY_MEMBER];
} BrinMemTuple;

/*
 * An on-disk BRIN tuple.  This is possibly followed by a nulls bitmask, with
 * room for 2 null bits (two bits for each indexed column); an opclass-defined
 * number of Datum values for each column follow.
 */

typedef struct BrinTuple
{
 /* heap block number that the tuple is for */
 BlockNumber bt_blkno;

 /* ---------------
  * bt_info is laid out in the following fashion:
  *
  * 7th (high) bit: has nulls
  * 6th bit: is placeholder tuple
  * 5th bit: range is empty
  * 4-0 bit: offset of data
  * ---------------
 */

 uint8  bt_info;
} BrinTuple;

#define SizeOfBrinTuple (offsetof(BrinTuple, bt_info) + sizeof(uint8))

/*
 * bt_info manipulation macros
 */

#define BRIN_OFFSET_MASK  0x1F
#define BRIN_EMPTY_RANGE_MASK 0x20
#define BRIN_PLACEHOLDER_MASK 0x40
#define BRIN_NULLS_MASK   0x80

#define BrinTupleDataOffset(tup) ((Size) (((BrinTuple *) (tup))->bt_info & BRIN_OFFSET_MASK))
#define BrinTupleHasNulls(tup) (((((BrinTuple *) (tup))->bt_info & BRIN_NULLS_MASK)) != 0)
#define BrinTupleIsPlaceholder(tup) (((((BrinTuple *) (tup))->bt_info & BRIN_PLACEHOLDER_MASK)) != 0)
#define BrinTupleIsEmptyRange(tup) (((((BrinTuple *) (tup))->bt_info & BRIN_EMPTY_RANGE_MASK)) != 0)


extern BrinTuple *brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno,
          BrinMemTuple *tuple, Size *size);
extern BrinTuple *brin_form_placeholder_tuple(BrinDesc *brdesc,
             BlockNumber blkno, Size *size);
extern void brin_free_tuple(BrinTuple *tuple);
extern BrinTuple *brin_copy_tuple(BrinTuple *tuple, Size len,
          BrinTuple *dest, Size *destsz);
extern bool brin_tuples_equal(const BrinTuple *a, Size alen,
         const BrinTuple *b, Size blen);

extern BrinMemTuple *brin_new_memtuple(BrinDesc *brdesc);
extern BrinMemTuple *brin_memtuple_initialize(BrinMemTuple *dtuple,
             BrinDesc *brdesc);
extern BrinMemTuple *brin_deform_tuple(BrinDesc *brdesc,
            BrinTuple *tuple, BrinMemTuple *dMemtuple);

#endif       /* BRIN_TUPLE_H */

Messung V0.5 in Prozent
C=92 H=89 G=90

[Dauer der Verarbeitung: 0.18 Sekunden, vorverarbeitet 2026-08-08]