]> granicus.if.org Git - postgresql/blob - src/backend/access/rmgrdesc/nbtdesc.c
Make heap TID a tiebreaker nbtree index column.
[postgresql] / src / backend / access / rmgrdesc / nbtdesc.c
1 /*-------------------------------------------------------------------------
2  *
3  * nbtdesc.c
4  *        rmgr descriptor routines for access/nbtree/nbtxlog.c
5  *
6  * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  *        src/backend/access/rmgrdesc/nbtdesc.c
12  *
13  *-------------------------------------------------------------------------
14  */
15 #include "postgres.h"
16
17 #include "access/nbtxlog.h"
18
19 void
20 btree_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_BTREE_INSERT_LEAF:
28                 case XLOG_BTREE_INSERT_UPPER:
29                 case XLOG_BTREE_INSERT_META:
30                         {
31                                 xl_btree_insert *xlrec = (xl_btree_insert *) rec;
32
33                                 appendStringInfo(buf, "off %u", xlrec->offnum);
34                                 break;
35                         }
36                 case XLOG_BTREE_SPLIT_L:
37                 case XLOG_BTREE_SPLIT_R:
38                         {
39                                 xl_btree_split *xlrec = (xl_btree_split *) rec;
40
41                                 appendStringInfo(buf, "level %u, firstright %d",
42                                                                  xlrec->level, xlrec->firstright);
43                                 break;
44                         }
45                 case XLOG_BTREE_VACUUM:
46                         {
47                                 xl_btree_vacuum *xlrec = (xl_btree_vacuum *) rec;
48
49                                 appendStringInfo(buf, "lastBlockVacuumed %u",
50                                                                  xlrec->lastBlockVacuumed);
51                                 break;
52                         }
53                 case XLOG_BTREE_DELETE:
54                         {
55                                 xl_btree_delete *xlrec = (xl_btree_delete *) rec;
56
57                                 appendStringInfo(buf, "%d items", xlrec->nitems);
58                                 break;
59                         }
60                 case XLOG_BTREE_MARK_PAGE_HALFDEAD:
61                         {
62                                 xl_btree_mark_page_halfdead *xlrec = (xl_btree_mark_page_halfdead *) rec;
63
64                                 appendStringInfo(buf, "topparent %u; leaf %u; left %u; right %u",
65                                                                  xlrec->topparent, xlrec->leafblk, xlrec->leftblk, xlrec->rightblk);
66                                 break;
67                         }
68                 case XLOG_BTREE_UNLINK_PAGE_META:
69                 case XLOG_BTREE_UNLINK_PAGE:
70                         {
71                                 xl_btree_unlink_page *xlrec = (xl_btree_unlink_page *) rec;
72
73                                 appendStringInfo(buf, "left %u; right %u; btpo_xact %u; ",
74                                                                  xlrec->leftsib, xlrec->rightsib,
75                                                                  xlrec->btpo_xact);
76                                 appendStringInfo(buf, "leafleft %u; leafright %u; topparent %u",
77                                                                  xlrec->leafleftsib, xlrec->leafrightsib,
78                                                                  xlrec->topparent);
79                                 break;
80                         }
81                 case XLOG_BTREE_NEWROOT:
82                         {
83                                 xl_btree_newroot *xlrec = (xl_btree_newroot *) rec;
84
85                                 appendStringInfo(buf, "lev %u", xlrec->level);
86                                 break;
87                         }
88                 case XLOG_BTREE_REUSE_PAGE:
89                         {
90                                 xl_btree_reuse_page *xlrec = (xl_btree_reuse_page *) rec;
91
92                                 appendStringInfo(buf, "rel %u/%u/%u; latestRemovedXid %u",
93                                                                  xlrec->node.spcNode, xlrec->node.dbNode,
94                                                                  xlrec->node.relNode, xlrec->latestRemovedXid);
95                                 break;
96                         }
97                 case XLOG_BTREE_META_CLEANUP:
98                         {
99                                 xl_btree_metadata *xlrec = (xl_btree_metadata *) rec;
100
101                                 appendStringInfo(buf, "oldest_btpo_xact %u; last_cleanup_num_heap_tuples: %f",
102                                                                  xlrec->oldest_btpo_xact,
103                                                                  xlrec->last_cleanup_num_heap_tuples);
104                                 break;
105                         }
106         }
107 }
108
109 const char *
110 btree_identify(uint8 info)
111 {
112         const char *id = NULL;
113
114         switch (info & ~XLR_INFO_MASK)
115         {
116                 case XLOG_BTREE_INSERT_LEAF:
117                         id = "INSERT_LEAF";
118                         break;
119                 case XLOG_BTREE_INSERT_UPPER:
120                         id = "INSERT_UPPER";
121                         break;
122                 case XLOG_BTREE_INSERT_META:
123                         id = "INSERT_META";
124                         break;
125                 case XLOG_BTREE_SPLIT_L:
126                         id = "SPLIT_L";
127                         break;
128                 case XLOG_BTREE_SPLIT_R:
129                         id = "SPLIT_R";
130                         break;
131                 case XLOG_BTREE_VACUUM:
132                         id = "VACUUM";
133                         break;
134                 case XLOG_BTREE_DELETE:
135                         id = "DELETE";
136                         break;
137                 case XLOG_BTREE_MARK_PAGE_HALFDEAD:
138                         id = "MARK_PAGE_HALFDEAD";
139                         break;
140                 case XLOG_BTREE_UNLINK_PAGE:
141                         id = "UNLINK_PAGE";
142                         break;
143                 case XLOG_BTREE_UNLINK_PAGE_META:
144                         id = "UNLINK_PAGE_META";
145                         break;
146                 case XLOG_BTREE_NEWROOT:
147                         id = "NEWROOT";
148                         break;
149                 case XLOG_BTREE_REUSE_PAGE:
150                         id = "REUSE_PAGE";
151                         break;
152                 case XLOG_BTREE_META_CLEANUP:
153                         id = "META_CLEANUP";
154                         break;
155         }
156
157         return id;
158 }