PostgreSQL Source Code: contrib/pageinspect/hashfuncs.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
12
24
30
31#define IS_INDEX(r) ((r)->rd_rel->relkind == RELKIND_INDEX)
32#define IS_HASH(r) ((r)->rd_rel->relam == HASH_AM_OID)
33
34
35
36
37
39{
44
45
52
53
54
55
56
57
60{
63
64
66 {
68
71 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
72 errmsg("input page is not a valid %s page", "hash"),
73 errdetail("Expected special size %d, got %d.",
76
80 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
81 errmsg("input page is not a valid %s page", "hash"),
82 errdetail("Expected %08x, got %08x.",
84
86 }
87
88
93 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
94 errmsg("invalid hash page type %08x", pagetype)));
95
96
97 if (flags != 0 && (pagetype & flags) == 0)
98 {
99 switch (flags)
100 {
103 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
104 errmsg("page is not a hash meta page")));
105 break;
108 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
109 errmsg("page is not a hash bucket or overflow page")));
110 break;
113 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
114 errmsg("page is not a hash overflow page")));
115 break;
116 default:
118 "hash page of type %08x not in mask %08x",
119 pagetype, flags);
120 break;
121 }
122 }
123
124
125
126
128 {
130
133 (errcode(ERRCODE_INDEX_CORRUPTED),
134 errmsg("invalid magic number for metadata"),
135 errdetail("Expected 0x%08x, got 0x%08x.",
137
140 (errcode(ERRCODE_INDEX_CORRUPTED),
141 errmsg("invalid version for metadata"),
142 errdetail("Expected %d, got %d.",
144 }
145
146 return page;
147}
148
149
150
151
152
153
154
155static void
157{
160 int off;
161
162 stat->dead_items = stat->live_items = 0;
164
165
171
172
174 {
176
178 stat->live_items++;
179 else
180 stat->dead_items++;
181 }
183}
184
185
186
187
188
189
190
193{
197 int pagetype;
198 const char *type;
199
202 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
203 errmsg("must be superuser to use raw page functions")));
204
206
208 type = "unused";
209 else
210 {
212
213
216 type = "metapage";
218 type = "overflow";
220 type = "bucket";
222 type = "bitmap";
223 else
224 type = "unused";
225 }
226
228}
229
230
231
232
233
234
235
238{
241 int j;
243 bool nulls[9] = {0};
247
250 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
251 errmsg("must be superuser to use raw page functions")));
252
254
255
257 stat.hasho_flag = stat.hasho_page_id = stat.free_size = 0;
258
260
261
263 elog(ERROR, "return type must be a row type");
265
266 j = 0;
276
278
280}
281
282
283
284
286{
289};
290
291
292
293
294
295
296
297
298
301{
306 bool nulls[3] = {0};
312
315 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
316 errmsg("must be superuser to use raw page functions")));
317
319 {
321
323
325
327
329
331
333
335
336
338 elog(ERROR, "return type must be a row type");
340
342
344
346 }
347
350
352 {
355 int j;
356
358
361
363
364 j = 0;
367
370
373
375
377 }
378
380}
381
382
383
384
385
386
387
388
389
392{
397 mapbuf;
399 Page mappage;
400 bool bit = false;
404 int32 bitmappage,
405 bitmapbit;
407 int i,
408 j;
410 bool nulls[3] = {0};
412
415 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
416 errmsg("must be superuser to use raw page functions")));
417
419
422 (errcode(ERRCODE_WRONG_OBJECT_TYPE),
423 errmsg("\"%s\" is not a %s index",
425
428 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
429 errmsg("cannot access temporary tables of other sessions")));
430
433 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
434 errmsg("invalid block number")));
435
438 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
439 errmsg("block number %" PRId64 " is out of range for relation \"%s\"",
441
442
445
446
447
448
449
450 if (ovflblkno == 0)
452 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
453 errmsg("invalid overflow block number %u",
458 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
459 errmsg("invalid overflow block number %u",
461
462
463
464
465
467
468 bitmappage = ovflbitno >> BMPG_SHIFT(metap);
469 bitmapbit = ovflbitno & BMPG_MASK(metap);
470
473 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
474 errmsg("invalid overflow block number %u",
476
477 bitmapblkno = metap->hashm_mapp[bitmappage];
478
480
481
485
486 bit = ISSET(freep, bitmapbit) != 0;
487
490
491
493 elog(ERROR, "return type must be a row type");
495
496 j = 0;
500
502
504}
505
506
507
508
509
510
511
512
513
516{
522 int i,
523 j;
525 bool nulls[16] = {0};
528
531 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
532 errmsg("must be superuser to use raw page functions")));
533
535
536
538 elog(ERROR, "return type must be a row type");
540
542
543 j = 0;
558
562
566
568
570}
ArrayType * construct_array_builtin(Datum *elems, int nelems, Oid elmtype)
#define InvalidBlockNumber
static Datum values[MAXATTR]
#define RelationGetNumberOfBlocks(reln)
static Page BufferGetPage(Buffer buffer)
Size PageGetFreeSpace(const PageData *page)
static uint16 PageGetSpecialSize(const PageData *page)
static Size PageGetPageSize(const PageData *page)
static Item PageGetItem(const PageData *page, const ItemIdData *itemId)
static bool PageIsNew(const PageData *page)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
AttInMetadata * TupleDescGetAttInMetadata(TupleDesc tupdesc)
Datum Int64GetDatum(int64 X)
Datum Float8GetDatum(float8 X)
#define PG_GETARG_INT64(n)
#define PG_RETURN_TEXT_P(x)
#define PG_RETURN_DATUM(x)
#define PG_GETARG_BYTEA_P(n)
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
#define SRF_IS_FIRSTCALL()
#define SRF_PERCALL_SETUP()
#define SRF_RETURN_NEXT(_funcctx, _result)
#define SRF_FIRSTCALL_INIT()
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
#define SRF_RETURN_DONE(_funcctx)
#define HashPageGetOpaque(page)
#define HASH_MAX_SPLITPOINTS
#define HashPageGetBitmap(page)
#define HashPageGetMeta(page)
#define BMPG_SHIFT(metap)
Datum hash_bitmap_info(PG_FUNCTION_ARGS)
Datum hash_page_stats(PG_FUNCTION_ARGS)
PG_FUNCTION_INFO_V1(hash_page_type)
Datum hash_page_type(PG_FUNCTION_ARGS)
Datum hash_metapage_info(PG_FUNCTION_ARGS)
struct HashPageStat HashPageStat
static Page verify_hash_page(bytea *raw_page, int flags)
static void GetHashPageStatistics(Page page, HashPageStat *stat)
Datum hash_page_items(PG_FUNCTION_ARGS)
uint32 _hash_ovflblkno_to_bitno(HashMetaPage metap, BlockNumber ovflblkno)
void _hash_relbuf(Relation rel, Buffer buf)
Buffer _hash_getbuf(Relation rel, BlockNumber blkno, int access, int flags)
uint32 _hash_get_indextuple_hashkey(IndexTuple itup)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
void index_close(Relation relation, LOCKMODE lockmode)
#define ItemIdIsDead(itemId)
#define ItemIdIsValid(itemId)
IndexTupleData * IndexTuple
#define FirstOffsetNumber
Page get_page_from_raw(bytea *raw_page)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static Datum PointerGetDatum(const void *X)
static Datum BoolGetDatum(bool X)
static Datum ObjectIdGetDatum(Oid X)
static Datum Int32GetDatum(int32 X)
#define RelationGetRelationName(relation)
#define RELATION_IS_OTHER_TEMP(relation)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
AttInMetadata * attinmeta
MemoryContext multi_call_memory_ctx
BlockNumber hashm_mapp[HASH_MAX_BITMAPS]
RegProcedure hashm_procid
uint32 hashm_spares[HASH_MAX_SPLITPOINTS]
BlockNumber hasho_nextblkno
BlockNumber hasho_prevblkno
BlockNumber hasho_prevblkno
BlockNumber hasho_nextblkno
Datum bit(PG_FUNCTION_ARGS)
text * cstring_to_text(const char *s)