PostgreSQL Source Code git master
Loading...
Searching...
No Matches
rawpage.c File Reference
#include "postgres.h"
#include "access/htup_details.h"
#include "access/relation.h"
#include "catalog/namespace.h"
#include "catalog/pg_type.h"
#include "funcapi.h"
#include "miscadmin.h"
#include "pageinspect.h"
#include "storage/bufmgr.h"
#include "storage/checksum.h"
#include "utils/builtins.h"
#include "utils/pg_lsn.h"
#include "utils/rel.h"
#include "utils/varlena.h"
Include dependency graph for rawpage.c:

Go to the source code of this file.

Functions

 PG_MODULE_MAGIC_EXT (.name="pageinspect",.version=PG_VERSION)
 
static byteaget_raw_page_internal (text *relname, ForkNumber forknum, BlockNumber blkno)
 
 PG_FUNCTION_INFO_V1 (get_raw_page_1_9)
 
Datum get_raw_page_1_9 (PG_FUNCTION_ARGS)
 
 PG_FUNCTION_INFO_V1 (get_raw_page)
 
Datum get_raw_page (PG_FUNCTION_ARGS)
 
 PG_FUNCTION_INFO_V1 (get_raw_page_fork_1_9)
 
Datum get_raw_page_fork_1_9 (PG_FUNCTION_ARGS)
 
 PG_FUNCTION_INFO_V1 (get_raw_page_fork)
 
Datum get_raw_page_fork (PG_FUNCTION_ARGS)
 
Page get_page_from_raw (bytea *raw_page)
 
 PG_FUNCTION_INFO_V1 (page_header)
 
Datum page_header (PG_FUNCTION_ARGS)
 
 PG_FUNCTION_INFO_V1 (page_checksum_1_9)
 
 PG_FUNCTION_INFO_V1 (page_checksum)
 
static Datum page_checksum_internal (PG_FUNCTION_ARGS, enum pageinspect_version ext_version)
 
Datum page_checksum_1_9 (PG_FUNCTION_ARGS)
 
Datum page_checksum (PG_FUNCTION_ARGS)
 

Function Documentation

◆ get_page_from_raw()

Page get_page_from_raw ( bytea raw_page)

Definition at line 215 of file rawpage.c.

216{
217 Page page;
218 int raw_page_size;
219
221
222 if (raw_page_size != BLCKSZ)
225 errmsg("invalid page size"),
226 errdetail("Expected %d bytes, got %d.",
228
229 page = palloc(raw_page_size);
230
232
233 return page;
234}
PageData * Page
Definition bufpage.h:81
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
int errcode(int sqlerrcode)
Definition elog.c:874
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define ERROR
Definition elog.h:40
#define ereport(elevel,...)
Definition elog.h:152
void * palloc(Size size)
Definition mcxt.c:1387
static char * errmsg
static int fb(int x)
static Size VARSIZE_ANY_EXHDR(const void *PTR)
Definition varatt.h:472
static char * VARDATA_ANY(const void *PTR)
Definition varatt.h:486

References ereport, errcode(), errdetail(), errmsg, ERROR, fb(), memcpy(), palloc(), VARDATA_ANY(), and VARSIZE_ANY_EXHDR().

Referenced by brin_page_type(), bt_page_items_bytea(), fsm_page_contents(), gin_leafpage_items(), gin_metapage_info(), gin_page_opaque_info(), heap_page_items(), page_checksum_internal(), page_header(), verify_brin_page(), verify_gist_page(), and verify_hash_page().

◆ get_raw_page()

Datum get_raw_page ( PG_FUNCTION_ARGS  )

Definition at line 71 of file rawpage.c.

72{
74 uint32 blkno = PG_GETARG_UINT32(1);
76
77 /*
78 * We don't normally bother to check the number of arguments to a C
79 * function, but here it's needed for safety because early 8.4 beta
80 * releases mistakenly redefined get_raw_page() as taking three arguments.
81 */
82 if (PG_NARGS() != 2)
84 (errmsg("wrong number of arguments to get_raw_page()"),
85 errhint("Run the updated pageinspect.sql script.")));
86
88
90}
uint32_t uint32
Definition c.h:624
int errhint(const char *fmt,...) pg_attribute_printf(1
#define PG_GETARG_TEXT_PP(n)
Definition fmgr.h:310
#define PG_RETURN_BYTEA_P(x)
Definition fmgr.h:373
#define PG_GETARG_UINT32(n)
Definition fmgr.h:270
#define PG_NARGS()
Definition fmgr.h:203
NameData relname
Definition pg_class.h:40
static bytea * get_raw_page_internal(text *relname, ForkNumber forknum, BlockNumber blkno)
Definition rawpage.c:145
@ MAIN_FORKNUM
Definition relpath.h:58
Definition c.h:776

References ereport, errhint(), errmsg, ERROR, fb(), get_raw_page_internal(), MAIN_FORKNUM, PG_GETARG_TEXT_PP, PG_GETARG_UINT32, PG_NARGS, PG_RETURN_BYTEA_P, and relname.

◆ get_raw_page_1_9()

Datum get_raw_page_1_9 ( PG_FUNCTION_ARGS  )

Definition at line 49 of file rawpage.c.

50{
52 int64 blkno = PG_GETARG_INT64(1);
54
58 errmsg("invalid block number")));
59
61
63}
#define MaxBlockNumber
Definition block.h:35
int64_t int64
Definition c.h:621
#define PG_GETARG_INT64(n)
Definition fmgr.h:284

References ereport, errcode(), errmsg, ERROR, fb(), get_raw_page_internal(), MAIN_FORKNUM, MaxBlockNumber, PG_GETARG_INT64, PG_GETARG_TEXT_PP, PG_RETURN_BYTEA_P, and relname.

◆ get_raw_page_fork()

Datum get_raw_page_fork ( PG_FUNCTION_ARGS  )

Definition at line 126 of file rawpage.c.

127{
130 uint32 blkno = PG_GETARG_UINT32(2);
132 ForkNumber forknum;
133
135
136 raw_page = get_raw_page_internal(relname, forknum, blkno);
137
139}
ForkNumber forkname_to_number(const char *forkName)
Definition relpath.c:50
ForkNumber
Definition relpath.h:56
char * text_to_cstring(const text *t)
Definition varlena.c:217

References fb(), forkname_to_number(), get_raw_page_internal(), PG_GETARG_TEXT_PP, PG_GETARG_UINT32, PG_RETURN_BYTEA_P, relname, and text_to_cstring().

◆ get_raw_page_fork_1_9()

◆ get_raw_page_internal()

static bytea * get_raw_page_internal ( text relname,
ForkNumber  forknum,
BlockNumber  blkno 
)
static

Definition at line 145 of file rawpage.c.

146{
149 Relation rel;
150 char *raw_page_data;
151 Buffer buf;
152
153 if (!superuser())
156 errmsg("must be superuser to use raw page functions")));
157
160
161 if (!RELKIND_HAS_STORAGE(rel->rd_rel->relkind))
164 errmsg("cannot get raw page from relation \"%s\"",
167
168 /*
169 * Reject attempts to read non-local temporary relations; we would be
170 * likely to get wrong data since we have no visibility into the owning
171 * session's local buffers.
172 */
173 if (RELATION_IS_OTHER_TEMP(rel))
176 errmsg("cannot access temporary tables of other sessions")));
177
178 if (blkno >= RelationGetNumberOfBlocksInFork(rel, forknum))
181 errmsg("block number %u is out of range for relation \"%s\"",
182 blkno, RelationGetRelationName(rel))));
183
184 /* Initialize buffer to copy to */
188
189 /* Take a verbatim copy of the page */
190
191 buf = ReadBufferExtended(rel, forknum, blkno, RBM_NORMAL, NULL);
193
195
197
199
200 return raw_page;
201}
int Buffer
Definition buf.h:23
BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, ForkNumber forkNum)
Definition bufmgr.c:4645
void UnlockReleaseBuffer(Buffer buffer)
Definition bufmgr.c:5603
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
Definition bufmgr.c:926
static Page BufferGetPage(Buffer buffer)
Definition bufmgr.h:468
@ BUFFER_LOCK_SHARE
Definition bufmgr.h:212
static void LockBuffer(Buffer buffer, BufferLockMode mode)
Definition bufmgr.h:334
@ RBM_NORMAL
Definition bufmgr.h:46
#define VARHDRSZ
Definition c.h:781
#define AccessShareLock
Definition lockdefs.h:36
RangeVar * makeRangeVarFromNameList(const List *names)
Definition namespace.c:3626
int errdetail_relkind_not_supported(char relkind)
Definition pg_class.c:24
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define RelationGetRelationName(relation)
Definition rel.h:550
#define RELATION_IS_OTHER_TEMP(relation)
Definition rel.h:669
void relation_close(Relation relation, LOCKMODE lockmode)
Definition relation.c:206
Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode)
Definition relation.c:138
Form_pg_class rd_rel
Definition rel.h:111
bool superuser(void)
Definition superuser.c:47
static char * VARDATA(const void *PTR)
Definition varatt.h:305
static void SET_VARSIZE(void *PTR, Size len)
Definition varatt.h:432
List * textToQualifiedNameList(text *textval)
Definition varlena.c:2719

References AccessShareLock, buf, BUFFER_LOCK_SHARE, BufferGetPage(), ereport, errcode(), errdetail_relkind_not_supported(), errmsg, ERROR, fb(), LockBuffer(), makeRangeVarFromNameList(), memcpy(), palloc(), RBM_NORMAL, RelationData::rd_rel, ReadBufferExtended(), relation_close(), RELATION_IS_OTHER_TEMP, relation_openrv(), RelationGetNumberOfBlocksInFork(), RelationGetRelationName, relname, SET_VARSIZE(), superuser(), textToQualifiedNameList(), UnlockReleaseBuffer(), VARDATA(), and VARHDRSZ.

Referenced by get_raw_page(), get_raw_page_1_9(), get_raw_page_fork(), and get_raw_page_fork_1_9().

◆ page_checksum()

Datum page_checksum ( PG_FUNCTION_ARGS  )

Definition at line 373 of file rawpage.c.

374{
376}
@ PAGEINSPECT_V1_8
Definition pageinspect.h:23
static Datum page_checksum_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version)
Definition rawpage.c:339

References page_checksum_internal(), and PAGEINSPECT_V1_8.

◆ page_checksum_1_9()

Datum page_checksum_1_9 ( PG_FUNCTION_ARGS  )

Definition at line 364 of file rawpage.c.

365{
367}
@ PAGEINSPECT_V1_9
Definition pageinspect.h:24

References page_checksum_internal(), and PAGEINSPECT_V1_9.

◆ page_checksum_internal()

static Datum page_checksum_internal ( PG_FUNCTION_ARGS  ,
enum pageinspect_version  ext_version 
)
static

Definition at line 339 of file rawpage.c.

340{
343 Page page;
344
345 if (!superuser())
348 errmsg("must be superuser to use raw page functions")));
349
353 errmsg("invalid block number")));
354
356
357 if (PageIsNew(page))
359
360 PG_RETURN_INT16(pg_checksum_page(page, blkno));
361}
static bool PageIsNew(const PageData *page)
Definition bufpage.h:258
uint16 pg_checksum_page(char *page, BlockNumber blkno)
#define PG_RETURN_NULL()
Definition fmgr.h:346
#define PG_RETURN_INT16(x)
Definition fmgr.h:357
#define PG_GETARG_BYTEA_P(n)
Definition fmgr.h:336
Page get_page_from_raw(bytea *raw_page)
Definition rawpage.c:215

References ereport, errcode(), errmsg, ERROR, fb(), get_page_from_raw(), MaxBlockNumber, PAGEINSPECT_V1_8, PageIsNew(), pg_checksum_page(), PG_GETARG_BYTEA_P, PG_GETARG_INT64, PG_GETARG_UINT32, PG_RETURN_INT16, PG_RETURN_NULL, and superuser().

Referenced by page_checksum(), and page_checksum_1_9().

◆ page_header()

Datum page_header ( PG_FUNCTION_ARGS  )

Definition at line 246 of file rawpage.c.

247{
249
250 TupleDesc tupdesc;
251
253 HeapTuple tuple;
254 Datum values[9];
255 bool nulls[9];
256
257 Page page;
259 XLogRecPtr lsn;
260
261 if (!superuser())
264 errmsg("must be superuser to use raw page functions")));
265
267 pageheader = (PageHeader) page;
268
269 /* Build a tuple descriptor for our result type */
270 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
271 elog(ERROR, "return type must be a row type");
272
273 /* Extract information from the page header */
274
275 lsn = PageGetLSN(page);
276
277 /* pageinspect >= 1.2 uses pg_lsn instead of text for the LSN field. */
278 if (TupleDescAttr(tupdesc, 0)->atttypid == TEXTOID)
279 {
280 char lsnchar[64];
281
282 snprintf(lsnchar, sizeof(lsnchar), "%X/%08X", LSN_FORMAT_ARGS(lsn));
284 }
285 else
286 values[0] = LSNGetDatum(lsn);
287 values[1] = UInt16GetDatum(pageheader->pd_checksum);
288 values[2] = UInt16GetDatum(pageheader->pd_flags);
289
290 /* pageinspect >= 1.10 uses int4 instead of int2 for those fields */
291 switch (TupleDescAttr(tupdesc, 3)->atttypid)
292 {
293 case INT2OID:
294 Assert(TupleDescAttr(tupdesc, 4)->atttypid == INT2OID &&
295 TupleDescAttr(tupdesc, 5)->atttypid == INT2OID &&
296 TupleDescAttr(tupdesc, 6)->atttypid == INT2OID);
297 values[3] = UInt16GetDatum(pageheader->pd_lower);
298 values[4] = UInt16GetDatum(pageheader->pd_upper);
299 values[5] = UInt16GetDatum(pageheader->pd_special);
301 break;
302 case INT4OID:
303 Assert(TupleDescAttr(tupdesc, 4)->atttypid == INT4OID &&
304 TupleDescAttr(tupdesc, 5)->atttypid == INT4OID &&
305 TupleDescAttr(tupdesc, 6)->atttypid == INT4OID);
306 values[3] = Int32GetDatum(pageheader->pd_lower);
307 values[4] = Int32GetDatum(pageheader->pd_upper);
308 values[5] = Int32GetDatum(pageheader->pd_special);
310 break;
311 default:
312 elog(ERROR, "incorrect output types");
313 break;
314 }
315
317 values[8] = TransactionIdGetDatum(pageheader->pd_prune_xid);
318
319 /* Build and return the tuple. */
320
321 memset(nulls, 0, sizeof(nulls));
322
323 tuple = heap_form_tuple(tupdesc, values, nulls);
324 result = HeapTupleGetDatum(tuple);
325
327}
static Datum values[MAXATTR]
Definition bootstrap.c:190
PageHeaderData * PageHeader
Definition bufpage.h:199
static Size PageGetPageSize(const PageData *page)
Definition bufpage.h:301
static uint8 PageGetPageLayoutVersion(const PageData *page)
Definition bufpage.h:311
static XLogRecPtr PageGetLSN(const PageData *page)
Definition bufpage.h:410
#define CStringGetTextDatum(s)
Definition builtins.h:98
#define Assert(condition)
Definition c.h:943
uint32 result
#define elog(elevel,...)
Definition elog.h:228
#define PG_RETURN_DATUM(x)
Definition fmgr.h:354
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
Definition funcapi.c:276
@ TYPEFUNC_COMPOSITE
Definition funcapi.h:149
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
Definition funcapi.h:230
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
Definition heaptuple.c:1025
static Datum LSNGetDatum(XLogRecPtr X)
Definition pg_lsn.h:31
#define snprintf
Definition port.h:260
static Datum TransactionIdGetDatum(TransactionId X)
Definition postgres.h:292
static Datum UInt16GetDatum(uint16 X)
Definition postgres.h:192
uint64_t Datum
Definition postgres.h:70
static Datum Int32GetDatum(int32 X)
Definition postgres.h:212
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Definition tupdesc.h:178
#define LSN_FORMAT_ARGS(lsn)
Definition xlogdefs.h:47
uint64 XLogRecPtr
Definition xlogdefs.h:21

References Assert, CStringGetTextDatum, elog, ereport, errcode(), errmsg, ERROR, fb(), get_call_result_type(), get_page_from_raw(), heap_form_tuple(), HeapTupleGetDatum(), Int32GetDatum(), LSN_FORMAT_ARGS, LSNGetDatum(), PageGetLSN(), PageGetPageLayoutVersion(), PageGetPageSize(), PG_GETARG_BYTEA_P, PG_RETURN_DATUM, result, snprintf, superuser(), TransactionIdGetDatum(), TupleDescAttr(), TYPEFUNC_COMPOSITE, UInt16GetDatum(), and values.

◆ PG_FUNCTION_INFO_V1() [1/7]

PG_FUNCTION_INFO_V1 ( get_raw_page  )

◆ PG_FUNCTION_INFO_V1() [2/7]

PG_FUNCTION_INFO_V1 ( get_raw_page_1_9  )

◆ PG_FUNCTION_INFO_V1() [3/7]

PG_FUNCTION_INFO_V1 ( get_raw_page_fork  )

◆ PG_FUNCTION_INFO_V1() [4/7]

PG_FUNCTION_INFO_V1 ( get_raw_page_fork_1_9  )

◆ PG_FUNCTION_INFO_V1() [5/7]

PG_FUNCTION_INFO_V1 ( page_checksum  )

◆ PG_FUNCTION_INFO_V1() [6/7]

PG_FUNCTION_INFO_V1 ( page_checksum_1_9  )

◆ PG_FUNCTION_INFO_V1() [7/7]

PG_FUNCTION_INFO_V1 ( page_header  )

◆ PG_MODULE_MAGIC_EXT()

PG_MODULE_MAGIC_EXT ( name = "pageinspect",
version = PG_VERSION 
)