1 /*-------------------------------------------------------------------------
4 * rmgr descriptor routines for access/nbtree/nbtxlog.c
6 * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * src/backend/access/rmgrdesc/nbtdesc.c
13 *-------------------------------------------------------------------------
17 #include "access/nbtree.h"
20 out_target(StringInfo buf, xl_btreetid *target)
22 appendStringInfo(buf, "rel %u/%u/%u; tid %u/%u",
23 target->node.spcNode, target->node.dbNode, target->node.relNode,
24 ItemPointerGetBlockNumber(&(target->tid)),
25 ItemPointerGetOffsetNumber(&(target->tid)));
29 btree_desc(StringInfo buf, uint8 xl_info, char *rec)
31 uint8 info = xl_info & ~XLR_INFO_MASK;
35 case XLOG_BTREE_INSERT_LEAF:
37 xl_btree_insert *xlrec = (xl_btree_insert *) rec;
39 appendStringInfoString(buf, "insert: ");
40 out_target(buf, &(xlrec->target));
43 case XLOG_BTREE_INSERT_UPPER:
45 xl_btree_insert *xlrec = (xl_btree_insert *) rec;
47 appendStringInfoString(buf, "insert_upper: ");
48 out_target(buf, &(xlrec->target));
51 case XLOG_BTREE_INSERT_META:
53 xl_btree_insert *xlrec = (xl_btree_insert *) rec;
55 appendStringInfoString(buf, "insert_meta: ");
56 out_target(buf, &(xlrec->target));
59 case XLOG_BTREE_SPLIT_L:
61 xl_btree_split *xlrec = (xl_btree_split *) rec;
63 appendStringInfo(buf, "split_l: rel %u/%u/%u ",
64 xlrec->node.spcNode, xlrec->node.dbNode,
66 appendStringInfo(buf, "left %u, right %u, next %u, level %u, firstright %d",
67 xlrec->leftsib, xlrec->rightsib, xlrec->rnext,
68 xlrec->level, xlrec->firstright);
71 case XLOG_BTREE_SPLIT_R:
73 xl_btree_split *xlrec = (xl_btree_split *) rec;
75 appendStringInfo(buf, "split_r: rel %u/%u/%u ",
76 xlrec->node.spcNode, xlrec->node.dbNode,
78 appendStringInfo(buf, "left %u, right %u, next %u, level %u, firstright %d",
79 xlrec->leftsib, xlrec->rightsib, xlrec->rnext,
80 xlrec->level, xlrec->firstright);
83 case XLOG_BTREE_SPLIT_L_ROOT:
85 xl_btree_split *xlrec = (xl_btree_split *) rec;
87 appendStringInfo(buf, "split_l_root: rel %u/%u/%u ",
88 xlrec->node.spcNode, xlrec->node.dbNode,
90 appendStringInfo(buf, "left %u, right %u, next %u, level %u, firstright %d",
91 xlrec->leftsib, xlrec->rightsib, xlrec->rnext,
92 xlrec->level, xlrec->firstright);
95 case XLOG_BTREE_SPLIT_R_ROOT:
97 xl_btree_split *xlrec = (xl_btree_split *) rec;
99 appendStringInfo(buf, "split_r_root: rel %u/%u/%u ",
100 xlrec->node.spcNode, xlrec->node.dbNode,
101 xlrec->node.relNode);
102 appendStringInfo(buf, "left %u, right %u, next %u, level %u, firstright %d",
103 xlrec->leftsib, xlrec->rightsib, xlrec->rnext,
104 xlrec->level, xlrec->firstright);
107 case XLOG_BTREE_VACUUM:
109 xl_btree_vacuum *xlrec = (xl_btree_vacuum *) rec;
111 appendStringInfo(buf, "vacuum: rel %u/%u/%u; blk %u, lastBlockVacuumed %u",
112 xlrec->node.spcNode, xlrec->node.dbNode,
113 xlrec->node.relNode, xlrec->block,
114 xlrec->lastBlockVacuumed);
117 case XLOG_BTREE_DELETE:
119 xl_btree_delete *xlrec = (xl_btree_delete *) rec;
121 appendStringInfo(buf, "delete: index %u/%u/%u; iblk %u, heap %u/%u/%u;",
122 xlrec->node.spcNode, xlrec->node.dbNode, xlrec->node.relNode,
124 xlrec->hnode.spcNode, xlrec->hnode.dbNode, xlrec->hnode.relNode);
127 case XLOG_BTREE_DELETE_PAGE:
128 case XLOG_BTREE_DELETE_PAGE_META:
129 case XLOG_BTREE_DELETE_PAGE_HALF:
131 xl_btree_delete_page *xlrec = (xl_btree_delete_page *) rec;
133 appendStringInfoString(buf, "delete_page: ");
134 out_target(buf, &(xlrec->target));
135 appendStringInfo(buf, "; dead %u; left %u; right %u",
136 xlrec->deadblk, xlrec->leftblk, xlrec->rightblk);
139 case XLOG_BTREE_NEWROOT:
141 xl_btree_newroot *xlrec = (xl_btree_newroot *) rec;
143 appendStringInfo(buf, "newroot: rel %u/%u/%u; root %u lev %u",
144 xlrec->node.spcNode, xlrec->node.dbNode,
146 xlrec->rootblk, xlrec->level);
149 case XLOG_BTREE_REUSE_PAGE:
151 xl_btree_reuse_page *xlrec = (xl_btree_reuse_page *) rec;
153 appendStringInfo(buf, "reuse_page: rel %u/%u/%u; latestRemovedXid %u",
154 xlrec->node.spcNode, xlrec->node.dbNode,
155 xlrec->node.relNode, xlrec->latestRemovedXid);
159 appendStringInfoString(buf, "UNKNOWN");