1 /*-------------------------------------------------------------------------
2 *
3 * spgdesc.c
4 * rmgr descriptor routines for access/spgist/spgxlog.c
5 *
6 * Portions Copyright (c) 1996-2018, 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
spg_desc(StringInfo buf,XLogReaderState * record)20 spg_desc(StringInfo buf, XLogReaderState *record)
21 {
22 char *rec = XLogRecGetData(record);
23 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
24
25 switch (info)
26 {
27 case XLOG_SPGIST_CREATE_INDEX:
28 break;
29 case XLOG_SPGIST_ADD_LEAF:
30 {
31 spgxlogAddLeaf *xlrec = (spgxlogAddLeaf *) rec;
32
33 appendStringInfoString(buf, "add leaf to page");
34 appendStringInfo(buf, "; off %u; headoff %u; parentoff %u",
35 xlrec->offnumLeaf, xlrec->offnumHeadLeaf,
36 xlrec->offnumParent);
37 if (xlrec->newPage)
38 appendStringInfoString(buf, " (newpage)");
39 if (xlrec->storesNulls)
40 appendStringInfoString(buf, " (nulls)");
41 }
42 break;
43 case XLOG_SPGIST_MOVE_LEAFS:
44 appendStringInfo(buf, "%u leafs",
45 ((spgxlogMoveLeafs *) rec)->nMoves);
46 break;
47 case XLOG_SPGIST_ADD_NODE:
48 appendStringInfo(buf, "off %u",
49 ((spgxlogAddNode *) rec)->offnum);
50 break;
51 case XLOG_SPGIST_SPLIT_TUPLE:
52 appendStringInfo(buf, "prefix off: %u, postfix off: %u (same %d, new %d)",
53 ((spgxlogSplitTuple *) rec)->offnumPrefix,
54 ((spgxlogSplitTuple *) rec)->offnumPostfix,
55 ((spgxlogSplitTuple *) rec)->postfixBlkSame,
56 ((spgxlogSplitTuple *) rec)->newPage
57 );
58 break;
59 case XLOG_SPGIST_PICKSPLIT:
60 {
61 spgxlogPickSplit *xlrec = (spgxlogPickSplit *) rec;
62
63 appendStringInfo(buf, "ndel %u; nins %u",
64 xlrec->nDelete, xlrec->nInsert);
65 if (xlrec->innerIsParent)
66 appendStringInfoString(buf, " (innerIsParent)");
67 if (xlrec->isRootSplit)
68 appendStringInfoString(buf, " (isRootSplit)");
69 }
70 break;
71 case XLOG_SPGIST_VACUUM_LEAF:
72 /* no further information */
73 break;
74 case XLOG_SPGIST_VACUUM_ROOT:
75 /* no further information */
76 break;
77 case XLOG_SPGIST_VACUUM_REDIRECT:
78 appendStringInfo(buf, "newest XID %u",
79 ((spgxlogVacuumRedirect *) rec)->newestRedirectXid);
80 break;
81 }
82 }
83
84 const char *
spg_identify(uint8 info)85 spg_identify(uint8 info)
86 {
87 const char *id = NULL;
88
89 switch (info & ~XLR_INFO_MASK)
90 {
91 case XLOG_SPGIST_CREATE_INDEX:
92 id = "CREATE_INDEX";
93 break;
94 case XLOG_SPGIST_ADD_LEAF:
95 id = "ADD_LEAF";
96 break;
97 case XLOG_SPGIST_MOVE_LEAFS:
98 id = "MOVE_LEAFS";
99 break;
100 case XLOG_SPGIST_ADD_NODE:
101 id = "ADD_NODE";
102 break;
103 case XLOG_SPGIST_SPLIT_TUPLE:
104 id = "SPLIT_TUPLE";
105 break;
106 case XLOG_SPGIST_PICKSPLIT:
107 id = "PICKSPLIT";
108 break;
109 case XLOG_SPGIST_VACUUM_LEAF:
110 id = "VACUUM_LEAF";
111 break;
112 case XLOG_SPGIST_VACUUM_ROOT:
113 id = "VACUUM_ROOT";
114 break;
115 case XLOG_SPGIST_VACUUM_REDIRECT:
116 id = "VACUUM_REDIRECT";
117 break;
118 }
119
120 return id;
121 }
122