summaryrefslogtreecommitdiffstats
path: root/src/backend/access/rmgrdesc/spgdesc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/rmgrdesc/spgdesc.c')
-rw-r--r--src/backend/access/rmgrdesc/spgdesc.c164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/backend/access/rmgrdesc/spgdesc.c b/src/backend/access/rmgrdesc/spgdesc.c
new file mode 100644
index 0000000..87f62f0
--- /dev/null
+++ b/src/backend/access/rmgrdesc/spgdesc.c
@@ -0,0 +1,164 @@
+/*-------------------------------------------------------------------------
+ *
+ * spgdesc.c
+ * rmgr descriptor routines for access/spgist/spgxlog.c
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/access/rmgrdesc/spgdesc.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/spgxlog.h"
+
+void
+spg_desc(StringInfo buf, XLogReaderState *record)
+{
+ char *rec = XLogRecGetData(record);
+ uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
+
+ switch (info)
+ {
+ case XLOG_SPGIST_ADD_LEAF:
+ {
+ spgxlogAddLeaf *xlrec = (spgxlogAddLeaf *) rec;
+
+ appendStringInfo(buf, "off: %u, headoff: %u, parentoff: %u, nodeI: %u",
+ xlrec->offnumLeaf, xlrec->offnumHeadLeaf,
+ xlrec->offnumParent, xlrec->nodeI);
+ if (xlrec->newPage)
+ appendStringInfoString(buf, " (newpage)");
+ if (xlrec->storesNulls)
+ appendStringInfoString(buf, " (nulls)");
+ }
+ break;
+ case XLOG_SPGIST_MOVE_LEAFS:
+ {
+ spgxlogMoveLeafs *xlrec = (spgxlogMoveLeafs *) rec;
+
+ appendStringInfo(buf, "nmoves: %u, parentoff: %u, nodeI: %u",
+ xlrec->nMoves,
+ xlrec->offnumParent, xlrec->nodeI);
+ if (xlrec->newPage)
+ appendStringInfoString(buf, " (newpage)");
+ if (xlrec->replaceDead)
+ appendStringInfoString(buf, " (replacedead)");
+ if (xlrec->storesNulls)
+ appendStringInfoString(buf, " (nulls)");
+ }
+ break;
+ case XLOG_SPGIST_ADD_NODE:
+ {
+ spgxlogAddNode *xlrec = (spgxlogAddNode *) rec;
+
+ appendStringInfo(buf, "off: %u, newoff: %u, parentBlk: %d, "
+ "parentoff: %u, nodeI: %u",
+ xlrec->offnum,
+ xlrec->offnumNew,
+ xlrec->parentBlk,
+ xlrec->offnumParent,
+ xlrec->nodeI);
+ if (xlrec->newPage)
+ appendStringInfoString(buf, " (newpage)");
+ }
+ break;
+ case XLOG_SPGIST_SPLIT_TUPLE:
+ {
+ spgxlogSplitTuple *xlrec = (spgxlogSplitTuple *) rec;
+
+ appendStringInfo(buf, "prefixoff: %u, postfixoff: %u",
+ xlrec->offnumPrefix,
+ xlrec->offnumPostfix);
+ if (xlrec->newPage)
+ appendStringInfoString(buf, " (newpage)");
+ if (xlrec->postfixBlkSame)
+ appendStringInfoString(buf, " (same)");
+ }
+ break;
+ case XLOG_SPGIST_PICKSPLIT:
+ {
+ spgxlogPickSplit *xlrec = (spgxlogPickSplit *) rec;
+
+ appendStringInfo(buf, "ndelete: %u, ninsert: %u, inneroff: %u, "
+ "parentoff: %u, nodeI: %u",
+ xlrec->nDelete, xlrec->nInsert,
+ xlrec->offnumInner,
+ xlrec->offnumParent, xlrec->nodeI);
+ if (xlrec->innerIsParent)
+ appendStringInfoString(buf, " (innerIsParent)");
+ if (xlrec->storesNulls)
+ appendStringInfoString(buf, " (nulls)");
+ if (xlrec->isRootSplit)
+ appendStringInfoString(buf, " (isRootSplit)");
+ }
+ break;
+ case XLOG_SPGIST_VACUUM_LEAF:
+ {
+ spgxlogVacuumLeaf *xlrec = (spgxlogVacuumLeaf *) rec;
+
+ appendStringInfo(buf, "ndead: %u, nplaceholder: %u, nmove: %u, nchain: %u",
+ xlrec->nDead, xlrec->nPlaceholder,
+ xlrec->nMove, xlrec->nChain);
+ }
+ break;
+ case XLOG_SPGIST_VACUUM_ROOT:
+ {
+ spgxlogVacuumRoot *xlrec = (spgxlogVacuumRoot *) rec;
+
+ appendStringInfo(buf, "ndelete: %u",
+ xlrec->nDelete);
+ }
+ break;
+ case XLOG_SPGIST_VACUUM_REDIRECT:
+ {
+ spgxlogVacuumRedirect *xlrec = (spgxlogVacuumRedirect *) rec;
+
+ appendStringInfo(buf, "ntoplaceholder: %u, firstplaceholder: %u, snapshotConflictHorizon: %u",
+ xlrec->nToPlaceholder,
+ xlrec->firstPlaceholder,
+ xlrec->snapshotConflictHorizon);
+ }
+ break;
+ }
+}
+
+const char *
+spg_identify(uint8 info)
+{
+ const char *id = NULL;
+
+ switch (info & ~XLR_INFO_MASK)
+ {
+ case XLOG_SPGIST_ADD_LEAF:
+ id = "ADD_LEAF";
+ break;
+ case XLOG_SPGIST_MOVE_LEAFS:
+ id = "MOVE_LEAFS";
+ break;
+ case XLOG_SPGIST_ADD_NODE:
+ id = "ADD_NODE";
+ break;
+ case XLOG_SPGIST_SPLIT_TUPLE:
+ id = "SPLIT_TUPLE";
+ break;
+ case XLOG_SPGIST_PICKSPLIT:
+ id = "PICKSPLIT";
+ break;
+ case XLOG_SPGIST_VACUUM_LEAF:
+ id = "VACUUM_LEAF";
+ break;
+ case XLOG_SPGIST_VACUUM_ROOT:
+ id = "VACUUM_ROOT";
+ break;
+ case XLOG_SPGIST_VACUUM_REDIRECT:
+ id = "VACUUM_REDIRECT";
+ break;
+ }
+
+ return id;
+}