@@ -82,6 +82,186 @@ SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
82
82
83
83
(1 row)
84
84
85
+ -- If we freeze the only tuple on test1, the infomask should
86
+ -- always be the same in all test runs. we show raw flags by
87
+ -- default: HEAP_XMIN_COMMITTED and HEAP_XMIN_INVALID.
88
+ VACUUM FREEZE test1;
89
+ SELECT t_infomask, t_infomask2, flags
90
+ FROM heap_page_items(get_raw_page('test1', 0)),
91
+ LATERAL heap_tuple_infomask_flags(t_infomask, t_infomask2) m(flags);
92
+ t_infomask | t_infomask2 | flags
93
+ ------------+-------------+-----------------------------------------------------------
94
+ 2816 | 2 | {HEAP_XMAX_INVALID,HEAP_XMIN_COMMITTED,HEAP_XMIN_INVALID}
95
+ (1 row)
96
+
97
+ -- output the decoded flag HEAP_XMIN_FROZEN instead
98
+ SELECT t_infomask, t_infomask2, flags
99
+ FROM heap_page_items(get_raw_page('test1', 0)),
100
+ LATERAL heap_tuple_infomask_flags(t_infomask, t_infomask2, true) m(flags);
101
+ t_infomask | t_infomask2 | flags
102
+ ------------+-------------+--------------------------------------
103
+ 2816 | 2 | {HEAP_XMAX_INVALID,HEAP_XMIN_FROZEN}
104
+ (1 row)
105
+
106
+ -- tests for decoding of combined flags
107
+ -- HEAP_XMAX_SHR_LOCK = (HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)
108
+ SELECT heap_tuple_infomask_flags(x'0050'::int, 0, true);
109
+ heap_tuple_infomask_flags
110
+ ---------------------------
111
+ {HEAP_XMAX_SHR_LOCK}
112
+ (1 row)
113
+
114
+ SELECT heap_tuple_infomask_flags(x'0050'::int, 0, false);
115
+ heap_tuple_infomask_flags
116
+ ---------------------------------------------
117
+ {HEAP_XMAX_EXCL_LOCK,HEAP_XMAX_KEYSHR_LOCK}
118
+ (1 row)
119
+
120
+ -- HEAP_XMIN_FROZEN = (HEAP_XMIN_COMMITTED | HEAP_XMIN_INVALID)
121
+ SELECT heap_tuple_infomask_flags(x'0300'::int, 0, true);
122
+ heap_tuple_infomask_flags
123
+ ---------------------------
124
+ {HEAP_XMIN_FROZEN}
125
+ (1 row)
126
+
127
+ SELECT heap_tuple_infomask_flags(x'0300'::int, 0, false);
128
+ heap_tuple_infomask_flags
129
+ -----------------------------------------
130
+ {HEAP_XMIN_COMMITTED,HEAP_XMIN_INVALID}
131
+ (1 row)
132
+
133
+ -- HEAP_MOVED = (HEAP_MOVED_IN | HEAP_MOVED_OFF)
134
+ SELECT heap_tuple_infomask_flags(x'C000'::int, 0, true);
135
+ heap_tuple_infomask_flags
136
+ ---------------------------
137
+ {HEAP_MOVED}
138
+ (1 row)
139
+
140
+ SELECT heap_tuple_infomask_flags(x'C000'::int, 0, false);
141
+ heap_tuple_infomask_flags
142
+ --------------------------------
143
+ {HEAP_MOVED_IN,HEAP_MOVED_OFF}
144
+ (1 row)
145
+
146
+ -- HEAP_LOCKED_UPGRADED = (HEAP_XMAX_IS_MULTI | HEAP_XMAX_LOCK_ONLY)
147
+ SELECT heap_tuple_infomask_flags(x'1080'::int, 0, true);
148
+ heap_tuple_infomask_flags
149
+ ---------------------------
150
+ {HEAP_LOCKED_UPGRADED}
151
+ (1 row)
152
+
153
+ SELECT heap_tuple_infomask_flags(x'1080'::int, 0, false);
154
+ heap_tuple_infomask_flags
155
+ ------------------------------------------
156
+ {HEAP_XMAX_LOCK_ONLY,HEAP_XMAX_IS_MULTI}
157
+ (1 row)
158
+
159
+ -- test all flags of t_infomask and t_infomask2
160
+ SELECT unnest(heap_tuple_infomask_flags(x'FFFF'::int, x'FFFF'::int, false))
161
+ AS flags ORDER BY 1;
162
+ flags
163
+ -----------------------
164
+ HEAP_COMBOCID
165
+ HEAP_HASEXTERNAL
166
+ HEAP_HASNULL
167
+ HEAP_HASOID_OLD
168
+ HEAP_HASVARWIDTH
169
+ HEAP_HOT_UPDATED
170
+ HEAP_KEYS_UPDATED
171
+ HEAP_MOVED_IN
172
+ HEAP_MOVED_OFF
173
+ HEAP_ONLY_TUPLE
174
+ HEAP_UPDATED
175
+ HEAP_XMAX_COMMITTED
176
+ HEAP_XMAX_EXCL_LOCK
177
+ HEAP_XMAX_INVALID
178
+ HEAP_XMAX_IS_MULTI
179
+ HEAP_XMAX_KEYSHR_LOCK
180
+ HEAP_XMAX_LOCK_ONLY
181
+ HEAP_XMIN_COMMITTED
182
+ HEAP_XMIN_INVALID
183
+ (19 rows)
184
+
185
+ SELECT unnest(heap_tuple_infomask_flags(x'FFFF'::int, x'FFFF'::int, true))
186
+ AS flags ORDER BY 1;
187
+ flags
188
+ ---------------------
189
+ HEAP_COMBOCID
190
+ HEAP_HASEXTERNAL
191
+ HEAP_HASNULL
192
+ HEAP_HASOID_OLD
193
+ HEAP_HASVARWIDTH
194
+ HEAP_HOT_UPDATED
195
+ HEAP_KEYS_UPDATED
196
+ HEAP_MOVED
197
+ HEAP_ONLY_TUPLE
198
+ HEAP_UPDATED
199
+ HEAP_XMAX_COMMITTED
200
+ HEAP_XMAX_INVALID
201
+ HEAP_XMAX_IS_MULTI
202
+ HEAP_XMAX_LOCK_ONLY
203
+ HEAP_XMAX_SHR_LOCK
204
+ HEAP_XMIN_FROZEN
205
+ (16 rows)
206
+
207
+ SELECT unnest(heap_tuple_infomask_flags(-1, -1, false))
208
+ AS flags ORDER BY 1;
209
+ flags
210
+ -----------------------
211
+ HEAP_COMBOCID
212
+ HEAP_HASEXTERNAL
213
+ HEAP_HASNULL
214
+ HEAP_HASOID_OLD
215
+ HEAP_HASVARWIDTH
216
+ HEAP_HOT_UPDATED
217
+ HEAP_KEYS_UPDATED
218
+ HEAP_MOVED_IN
219
+ HEAP_MOVED_OFF
220
+ HEAP_ONLY_TUPLE
221
+ HEAP_UPDATED
222
+ HEAP_XMAX_COMMITTED
223
+ HEAP_XMAX_EXCL_LOCK
224
+ HEAP_XMAX_INVALID
225
+ HEAP_XMAX_IS_MULTI
226
+ HEAP_XMAX_KEYSHR_LOCK
227
+ HEAP_XMAX_LOCK_ONLY
228
+ HEAP_XMIN_COMMITTED
229
+ HEAP_XMIN_INVALID
230
+ (19 rows)
231
+
232
+ SELECT unnest(heap_tuple_infomask_flags(-1, -1, true))
233
+ AS flags ORDER BY 1;
234
+ flags
235
+ ---------------------
236
+ HEAP_COMBOCID
237
+ HEAP_HASEXTERNAL
238
+ HEAP_HASNULL
239
+ HEAP_HASOID_OLD
240
+ HEAP_HASVARWIDTH
241
+ HEAP_HOT_UPDATED
242
+ HEAP_KEYS_UPDATED
243
+ HEAP_MOVED
244
+ HEAP_ONLY_TUPLE
245
+ HEAP_UPDATED
246
+ HEAP_XMAX_COMMITTED
247
+ HEAP_XMAX_INVALID
248
+ HEAP_XMAX_IS_MULTI
249
+ HEAP_XMAX_LOCK_ONLY
250
+ HEAP_XMAX_SHR_LOCK
251
+ HEAP_XMIN_FROZEN
252
+ (16 rows)
253
+
254
+ -- no flags
255
+ SELECT unnest(heap_tuple_infomask_flags(0, 0, false));
256
+ unnest
257
+ --------
258
+ (0 rows)
259
+
260
+ SELECT unnest(heap_tuple_infomask_flags(0, 0, true));
261
+ unnest
262
+ --------
263
+ (0 rows)
264
+
85
265
DROP TABLE test1;
86
266
-- check that using any of these functions with a partitioned table or index
87
267
-- would fail
0 commit comments