Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * hashdesc.c
4 : * rmgr descriptor routines for access/hash/hash.c
5 : *
6 : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7 : * Portions Copyright (c) 1994, Regents of the University of California
8 : *
9 : *
10 : * IDENTIFICATION
11 : * src/backend/access/rmgrdesc/hashdesc.c
12 : *
13 : *-------------------------------------------------------------------------
14 : */
15 : #include "postgres.h"
16 :
17 : #include "access/hash_xlog.h"
18 :
19 : void
20 108 : hash_desc(StringInfo buf, XLogReaderState *record)
21 : {
22 108 : char *rec = XLogRecGetData(record);
23 108 : uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
24 :
25 108 : switch (info)
26 : {
27 24 : case XLOG_HASH_INIT_META_PAGE:
28 : {
29 24 : xl_hash_init_meta_page *xlrec = (xl_hash_init_meta_page *) rec;
30 :
31 24 : appendStringInfo(buf, "num_tuples %g, fillfactor %d",
32 24 : xlrec->num_tuples, xlrec->ffactor);
33 24 : break;
34 : }
35 24 : case XLOG_HASH_INIT_BITMAP_PAGE:
36 : {
37 24 : xl_hash_init_bitmap_page *xlrec = (xl_hash_init_bitmap_page *) rec;
38 :
39 24 : appendStringInfo(buf, "bmsize %d", xlrec->bmsize);
40 24 : break;
41 : }
42 36 : case XLOG_HASH_INSERT:
43 : {
44 36 : xl_hash_insert *xlrec = (xl_hash_insert *) rec;
45 :
46 36 : appendStringInfo(buf, "off %u", xlrec->offnum);
47 36 : break;
48 : }
49 0 : case XLOG_HASH_ADD_OVFL_PAGE:
50 : {
51 0 : xl_hash_add_ovfl_page *xlrec = (xl_hash_add_ovfl_page *) rec;
52 :
53 0 : appendStringInfo(buf, "bmsize %d, bmpage_found %c",
54 0 : xlrec->bmsize, (xlrec->bmpage_found) ? 'T' : 'F');
55 0 : break;
56 : }
57 0 : case XLOG_HASH_SPLIT_ALLOCATE_PAGE:
58 : {
59 0 : xl_hash_split_allocate_page *xlrec = (xl_hash_split_allocate_page *) rec;
60 :
61 0 : appendStringInfo(buf, "new_bucket %u, meta_page_masks_updated %c, issplitpoint_changed %c",
62 : xlrec->new_bucket,
63 0 : (xlrec->flags & XLH_SPLIT_META_UPDATE_MASKS) ? 'T' : 'F',
64 0 : (xlrec->flags & XLH_SPLIT_META_UPDATE_SPLITPOINT) ? 'T' : 'F');
65 0 : break;
66 : }
67 0 : case XLOG_HASH_SPLIT_COMPLETE:
68 : {
69 0 : xl_hash_split_complete *xlrec = (xl_hash_split_complete *) rec;
70 :
71 0 : appendStringInfo(buf, "old_bucket_flag %u, new_bucket_flag %u",
72 0 : xlrec->old_bucket_flag, xlrec->new_bucket_flag);
73 0 : break;
74 : }
75 0 : case XLOG_HASH_MOVE_PAGE_CONTENTS:
76 : {
77 0 : xl_hash_move_page_contents *xlrec = (xl_hash_move_page_contents *) rec;
78 :
79 0 : appendStringInfo(buf, "ntups %d, is_primary %c",
80 0 : xlrec->ntups,
81 0 : xlrec->is_prim_bucket_same_wrt ? 'T' : 'F');
82 0 : break;
83 : }
84 0 : case XLOG_HASH_SQUEEZE_PAGE:
85 : {
86 0 : xl_hash_squeeze_page *xlrec = (xl_hash_squeeze_page *) rec;
87 :
88 0 : appendStringInfo(buf, "prevblkno %u, nextblkno %u, ntups %d, is_primary %c",
89 : xlrec->prevblkno,
90 : xlrec->nextblkno,
91 0 : xlrec->ntups,
92 0 : xlrec->is_prim_bucket_same_wrt ? 'T' : 'F');
93 0 : break;
94 : }
95 12 : case XLOG_HASH_DELETE:
96 : {
97 12 : xl_hash_delete *xlrec = (xl_hash_delete *) rec;
98 :
99 24 : appendStringInfo(buf, "clear_dead_marking %c, is_primary %c",
100 12 : xlrec->clear_dead_marking ? 'T' : 'F',
101 12 : xlrec->is_primary_bucket_page ? 'T' : 'F');
102 12 : break;
103 : }
104 12 : case XLOG_HASH_UPDATE_META_PAGE:
105 : {
106 12 : xl_hash_update_meta_page *xlrec = (xl_hash_update_meta_page *) rec;
107 :
108 12 : appendStringInfo(buf, "ntuples %g",
109 : xlrec->ntuples);
110 12 : break;
111 : }
112 0 : case XLOG_HASH_VACUUM_ONE_PAGE:
113 : {
114 0 : xl_hash_vacuum_one_page *xlrec = (xl_hash_vacuum_one_page *) rec;
115 :
116 0 : appendStringInfo(buf, "ntuples %d, snapshotConflictHorizon %u, isCatalogRel %c",
117 0 : xlrec->ntuples,
118 : xlrec->snapshotConflictHorizon,
119 0 : xlrec->isCatalogRel ? 'T' : 'F');
120 0 : break;
121 : }
122 : }
123 108 : }
124 :
125 : const char *
126 118 : hash_identify(uint8 info)
127 : {
128 118 : const char *id = NULL;
129 :
130 118 : switch (info & ~XLR_INFO_MASK)
131 : {
132 26 : case XLOG_HASH_INIT_META_PAGE:
133 26 : id = "INIT_META_PAGE";
134 26 : break;
135 26 : case XLOG_HASH_INIT_BITMAP_PAGE:
136 26 : id = "INIT_BITMAP_PAGE";
137 26 : break;
138 38 : case XLOG_HASH_INSERT:
139 38 : id = "INSERT";
140 38 : break;
141 0 : case XLOG_HASH_ADD_OVFL_PAGE:
142 0 : id = "ADD_OVFL_PAGE";
143 0 : break;
144 0 : case XLOG_HASH_SPLIT_ALLOCATE_PAGE:
145 0 : id = "SPLIT_ALLOCATE_PAGE";
146 0 : break;
147 0 : case XLOG_HASH_SPLIT_PAGE:
148 0 : id = "SPLIT_PAGE";
149 0 : break;
150 0 : case XLOG_HASH_SPLIT_COMPLETE:
151 0 : id = "SPLIT_COMPLETE";
152 0 : break;
153 0 : case XLOG_HASH_MOVE_PAGE_CONTENTS:
154 0 : id = "MOVE_PAGE_CONTENTS";
155 0 : break;
156 0 : case XLOG_HASH_SQUEEZE_PAGE:
157 0 : id = "SQUEEZE_PAGE";
158 0 : break;
159 14 : case XLOG_HASH_DELETE:
160 14 : id = "DELETE";
161 14 : break;
162 0 : case XLOG_HASH_SPLIT_CLEANUP:
163 0 : id = "SPLIT_CLEANUP";
164 0 : break;
165 14 : case XLOG_HASH_UPDATE_META_PAGE:
166 14 : id = "UPDATE_META_PAGE";
167 14 : break;
168 0 : case XLOG_HASH_VACUUM_ONE_PAGE:
169 0 : id = "VACUUM_ONE_PAGE";
170 : }
171 :
172 118 : return id;
173 : }
|