brin_tuple.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * brin_tuple.h
  3. * Declarations for dealing with BRIN-specific tuples.
  4. *
  5. * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
  6. * Portions Copyright (c) 1994, Regents of the University of California
  7. *
  8. * IDENTIFICATION
  9. * src/include/access/brin_tuple.h
  10. */
  11. #ifndef BRIN_TUPLE_H
  12. #define BRIN_TUPLE_H
  13. #include "access/brin_internal.h"
  14. #include "access/tupdesc.h"
  15. /*
  16. * A BRIN index stores one index tuple per page range. Each index tuple
  17. * has one BrinValues struct for each indexed column; in turn, each BrinValues
  18. * has (besides the null flags) an array of Datum whose size is determined by
  19. * the opclass.
  20. */
  21. typedef struct BrinValues
  22. {
  23. AttrNumber bv_attno; /* index attribute number */
  24. bool bv_hasnulls; /* are there any nulls in the page range? */
  25. bool bv_allnulls; /* are all values nulls in the page range? */
  26. Datum *bv_values; /* current accumulated values */
  27. } BrinValues;
  28. /*
  29. * This struct is used to represent an in-memory index tuple. The values can
  30. * only be meaningfully decoded with an appropriate BrinDesc.
  31. */
  32. typedef struct BrinMemTuple
  33. {
  34. bool bt_placeholder; /* this is a placeholder tuple */
  35. BlockNumber bt_blkno; /* heap blkno that the tuple is for */
  36. MemoryContext bt_context; /* memcxt holding the bt_columns values */
  37. BrinValues bt_columns[FLEXIBLE_ARRAY_MEMBER];
  38. } BrinMemTuple;
  39. /*
  40. * An on-disk BRIN tuple. This is possibly followed by a nulls bitmask, with
  41. * room for 2 null bits (two bits for each indexed column); an opclass-defined
  42. * number of Datum values for each column follow.
  43. */
  44. typedef struct BrinTuple
  45. {
  46. /* heap block number that the tuple is for */
  47. BlockNumber bt_blkno;
  48. /* ---------------
  49. * bt_info is laid out in the following fashion:
  50. *
  51. * 7th (high) bit: has nulls
  52. * 6th bit: is placeholder tuple
  53. * 5th bit: unused
  54. * 4-0 bit: offset of data
  55. * ---------------
  56. */
  57. uint8 bt_info;
  58. } BrinTuple;
  59. #define SizeOfBrinTuple (offsetof(BrinTuple, bt_info) + sizeof(uint8))
  60. /*
  61. * bt_info manipulation macros
  62. */
  63. #define BRIN_OFFSET_MASK 0x1F
  64. /* bit 0x20 is not used at present */
  65. #define BRIN_PLACEHOLDER_MASK 0x40
  66. #define BRIN_NULLS_MASK 0x80
  67. #define BrinTupleDataOffset(tup) ((Size) (((BrinTuple *) (tup))->bt_info & BRIN_OFFSET_MASK))
  68. #define BrinTupleHasNulls(tup) (((((BrinTuple *) (tup))->bt_info & BRIN_NULLS_MASK)) != 0)
  69. #define BrinTupleIsPlaceholder(tup) (((((BrinTuple *) (tup))->bt_info & BRIN_PLACEHOLDER_MASK)) != 0)
  70. extern BrinTuple *brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno,
  71. BrinMemTuple *tuple, Size *size);
  72. extern BrinTuple *brin_form_placeholder_tuple(BrinDesc *brdesc,
  73. BlockNumber blkno, Size *size);
  74. extern void brin_free_tuple(BrinTuple *tuple);
  75. extern BrinTuple *brin_copy_tuple(BrinTuple *tuple, Size len);
  76. extern bool brin_tuples_equal(const BrinTuple *a, Size alen,
  77. const BrinTuple *b, Size blen);
  78. extern BrinMemTuple *brin_new_memtuple(BrinDesc *brdesc);
  79. extern void brin_memtuple_initialize(BrinMemTuple *dtuple,
  80. BrinDesc *brdesc);
  81. extern BrinMemTuple *brin_deform_tuple(BrinDesc *brdesc,
  82. BrinTuple *tuple);
  83. #endif /* BRIN_TUPLE_H */