Coverage Report

Created: 2026-10-16 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/postgres/src/backend/access/rmgrdesc/spgdesc.c
Line
Count
Source
1
/*-------------------------------------------------------------------------
2
 *
3
 * spgdesc.c
4
 *    rmgr descriptor routines for access/spgist/spgxlog.c
5
 *
6
 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7
 * Portions Copyright (c) 1994, Regents of the University of California
8
 *
9
 *
10
 * IDENTIFICATION
11
 *    src/backend/access/rmgrdesc/spgdesc.c
12
 *
13
 *-------------------------------------------------------------------------
14
 */
15
#include "postgres.h"
16
17
#include "access/spgxlog.h"
18
19
void
20
spg_desc(StringInfo buf, XLogReaderState *record)
21
0
{
22
0
  char     *rec = XLogRecGetData(record);
23
0
  uint8   info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
24
25
0
  switch (info)
26
0
  {
27
0
    case XLOG_SPGIST_ADD_LEAF:
28
0
      {
29
0
        spgxlogAddLeaf *xlrec = (spgxlogAddLeaf *) rec;
30
31
0
        appendStringInfo(buf, "off: %u, headoff: %u, parentoff: %u, nodeI: %u",
32
0
                 xlrec->offnumLeaf, xlrec->offnumHeadLeaf,
33
0
                 xlrec->offnumParent, xlrec->nodeI);
34
0
        if (xlrec->newPage)
35
0
          appendStringInfoString(buf, " (newpage)");
36
0
        if (xlrec->storesNulls)
37
0
          appendStringInfoString(buf, " (nulls)");
38
0
      }
39
0
      break;
40
0
    case XLOG_SPGIST_MOVE_LEAFS:
41
0
      {
42
0
        spgxlogMoveLeafs *xlrec = (spgxlogMoveLeafs *) rec;
43
44
0
        appendStringInfo(buf, "nmoves: %u, parentoff: %u, nodeI: %u",
45
0
                 xlrec->nMoves,
46
0
                 xlrec->offnumParent, xlrec->nodeI);
47
0
        if (xlrec->newPage)
48
0
          appendStringInfoString(buf, " (newpage)");
49
0
        if (xlrec->replaceDead)
50
0
          appendStringInfoString(buf, " (replacedead)");
51
0
        if (xlrec->storesNulls)
52
0
          appendStringInfoString(buf, " (nulls)");
53
0
      }
54
0
      break;
55
0
    case XLOG_SPGIST_ADD_NODE:
56
0
      {
57
0
        spgxlogAddNode *xlrec = (spgxlogAddNode *) rec;
58
59
0
        appendStringInfo(buf, "off: %u, newoff: %u, parentBlk: %d, "
60
0
                 "parentoff: %u, nodeI: %u",
61
0
                 xlrec->offnum,
62
0
                 xlrec->offnumNew,
63
0
                 xlrec->parentBlk,
64
0
                 xlrec->offnumParent,
65
0
                 xlrec->nodeI);
66
0
        if (xlrec->newPage)
67
0
          appendStringInfoString(buf, " (newpage)");
68
0
      }
69
0
      break;
70
0
    case XLOG_SPGIST_SPLIT_TUPLE:
71
0
      {
72
0
        spgxlogSplitTuple *xlrec = (spgxlogSplitTuple *) rec;
73
74
0
        appendStringInfo(buf, "prefixoff: %u, postfixoff: %u",
75
0
                 xlrec->offnumPrefix,
76
0
                 xlrec->offnumPostfix);
77
0
        if (xlrec->newPage)
78
0
          appendStringInfoString(buf, " (newpage)");
79
0
        if (xlrec->postfixBlkSame)
80
0
          appendStringInfoString(buf, " (same)");
81
0
      }
82
0
      break;
83
0
    case XLOG_SPGIST_PICKSPLIT:
84
0
      {
85
0
        spgxlogPickSplit *xlrec = (spgxlogPickSplit *) rec;
86
87
0
        appendStringInfo(buf, "ndelete: %u, ninsert: %u, inneroff: %u, "
88
0
                 "parentoff: %u, nodeI: %u",
89
0
                 xlrec->nDelete, xlrec->nInsert,
90
0
                 xlrec->offnumInner,
91
0
                 xlrec->offnumParent, xlrec->nodeI);
92
0
        if (xlrec->innerIsParent)
93
0
          appendStringInfoString(buf, " (innerIsParent)");
94
0
        if (xlrec->storesNulls)
95
0
          appendStringInfoString(buf, " (nulls)");
96
0
        if (xlrec->isRootSplit)
97
0
          appendStringInfoString(buf, " (isRootSplit)");
98
0
      }
99
0
      break;
100
0
    case XLOG_SPGIST_VACUUM_LEAF:
101
0
      {
102
0
        spgxlogVacuumLeaf *xlrec = (spgxlogVacuumLeaf *) rec;
103
104
0
        appendStringInfo(buf, "ndead: %u, nplaceholder: %u, nmove: %u, nchain: %u",
105
0
                 xlrec->nDead, xlrec->nPlaceholder,
106
0
                 xlrec->nMove, xlrec->nChain);
107
0
      }
108
0
      break;
109
0
    case XLOG_SPGIST_VACUUM_ROOT:
110
0
      {
111
0
        spgxlogVacuumRoot *xlrec = (spgxlogVacuumRoot *) rec;
112
113
0
        appendStringInfo(buf, "ndelete: %u",
114
0
                 xlrec->nDelete);
115
0
      }
116
0
      break;
117
0
    case XLOG_SPGIST_VACUUM_REDIRECT:
118
0
      {
119
0
        spgxlogVacuumRedirect *xlrec = (spgxlogVacuumRedirect *) rec;
120
121
0
        appendStringInfo(buf, "ntoplaceholder: %u, firstplaceholder: %u, snapshotConflictHorizon: %u, isCatalogRel: %c",
122
0
                 xlrec->nToPlaceholder,
123
0
                 xlrec->firstPlaceholder,
124
0
                 xlrec->snapshotConflictHorizon,
125
0
                 xlrec->isCatalogRel ? 'T' : 'F');
126
0
      }
127
0
      break;
128
0
  }
129
0
}
130
131
const char *
132
spg_identify(uint8 info)
133
0
{
134
0
  const char *id = NULL;
135
136
0
  switch (info & ~XLR_INFO_MASK)
137
0
  {
138
0
    case XLOG_SPGIST_ADD_LEAF:
139
0
      id = "ADD_LEAF";
140
0
      break;
141
0
    case XLOG_SPGIST_MOVE_LEAFS:
142
0
      id = "MOVE_LEAFS";
143
0
      break;
144
0
    case XLOG_SPGIST_ADD_NODE:
145
0
      id = "ADD_NODE";
146
0
      break;
147
0
    case XLOG_SPGIST_SPLIT_TUPLE:
148
0
      id = "SPLIT_TUPLE";
149
0
      break;
150
0
    case XLOG_SPGIST_PICKSPLIT:
151
0
      id = "PICKSPLIT";
152
0
      break;
153
0
    case XLOG_SPGIST_VACUUM_LEAF:
154
0
      id = "VACUUM_LEAF";
155
0
      break;
156
0
    case XLOG_SPGIST_VACUUM_ROOT:
157
0
      id = "VACUUM_ROOT";
158
0
      break;
159
0
    case XLOG_SPGIST_VACUUM_REDIRECT:
160
0
      id = "VACUUM_REDIRECT";
161
0
      break;
162
0
  }
163
164
0
  return id;
165
0
}