PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
rawpage.c File Reference
#include "postgres.h"
#include "pageinspect.h"
#include "access/htup_details.h"
#include "catalog/catalog.h"
#include "catalog/namespace.h"
#include "catalog/pg_type.h"
#include "funcapi.h"
#include "miscadmin.h"
#include "storage/bufmgr.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

static byteaget_raw_page_internal (text *relname, ForkNumber forknum, BlockNumber blkno)
 
 PG_FUNCTION_INFO_V1 (get_raw_page)
 
Datum get_raw_page (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)
 

Variables

 PG_MODULE_MAGIC
 

Function Documentation

Page get_page_from_raw ( bytea raw_page)

Definition at line 177 of file rawpage.c.

References ereport, errcode(), errdetail(), errmsg(), ERROR, palloc(), VARDATA, VARHDRSZ, and VARSIZE.

Referenced by gin_leafpage_items(), gin_metapage_info(), gin_page_opaque_info(), and verify_hash_page().

178 {
179  Page page;
180  int raw_page_size;
181 
182  raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
183 
184  if (raw_page_size != BLCKSZ)
185  ereport(ERROR,
186  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
187  errmsg("invalid page size"),
188  errdetail("Expected %d bytes, got %d.",
189  BLCKSZ, raw_page_size)));
190 
191  page = palloc(raw_page_size);
192 
193  memcpy(page, VARDATA(raw_page), raw_page_size);
194 
195  return page;
196 }
#define VARDATA(PTR)
Definition: postgres.h:305
#define VARSIZE(PTR)
Definition: postgres.h:306
#define VARHDRSZ
Definition: c.h:441
int errcode(int sqlerrcode)
Definition: elog.c:575
#define ERROR
Definition: elog.h:43
int errdetail(const char *fmt,...)
Definition: elog.c:873
#define ereport(elevel, rest)
Definition: elog.h:122
Page page
Definition: btreefuncs.c:252
void * palloc(Size size)
Definition: mcxt.c:891
int errmsg(const char *fmt,...)
Definition: elog.c:797
Pointer Page
Definition: bufpage.h:74
Datum get_raw_page ( PG_FUNCTION_ARGS  )

Definition at line 46 of file rawpage.c.

References ereport, errhint(), errmsg(), ERROR, get_raw_page_internal(), MAIN_FORKNUM, PG_GETARG_TEXT_P, PG_GETARG_UINT32, PG_NARGS, and PG_RETURN_BYTEA_P.

47 {
48  text *relname = PG_GETARG_TEXT_P(0);
49  uint32 blkno = PG_GETARG_UINT32(1);
50  bytea *raw_page;
51 
52  /*
53  * We don't normally bother to check the number of arguments to a C
54  * function, but here it's needed for safety because early 8.4 beta
55  * releases mistakenly redefined get_raw_page() as taking three arguments.
56  */
57  if (PG_NARGS() != 2)
58  ereport(ERROR,
59  (errmsg("wrong number of arguments to get_raw_page()"),
60  errhint("Run the updated pageinspect.sql script.")));
61 
62  raw_page = get_raw_page_internal(relname, MAIN_FORKNUM, blkno);
63 
64  PG_RETURN_BYTEA_P(raw_page);
65 }
#define PG_GETARG_UINT32(n)
Definition: fmgr.h:226
int errhint(const char *fmt,...)
Definition: elog.c:987
static bytea * get_raw_page_internal(text *relname, ForkNumber forknum, BlockNumber blkno)
Definition: rawpage.c:94
#define PG_RETURN_BYTEA_P(x)
Definition: fmgr.h:313
#define ERROR
Definition: elog.h:43
unsigned int uint32
Definition: c.h:265
#define ereport(elevel, rest)
Definition: elog.h:122
#define PG_NARGS()
Definition: fmgr.h:160
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define PG_GETARG_TEXT_P(n)
Definition: fmgr.h:269
Definition: c.h:435
Datum get_raw_page_fork ( PG_FUNCTION_ARGS  )

Definition at line 75 of file rawpage.c.

References forkname_to_number(), get_raw_page_internal(), PG_GETARG_TEXT_P, PG_GETARG_UINT32, PG_RETURN_BYTEA_P, and text_to_cstring().

76 {
77  text *relname = PG_GETARG_TEXT_P(0);
78  text *forkname = PG_GETARG_TEXT_P(1);
79  uint32 blkno = PG_GETARG_UINT32(2);
80  bytea *raw_page;
81  ForkNumber forknum;
82 
83  forknum = forkname_to_number(text_to_cstring(forkname));
84 
85  raw_page = get_raw_page_internal(relname, forknum, blkno);
86 
87  PG_RETURN_BYTEA_P(raw_page);
88 }
#define PG_GETARG_UINT32(n)
Definition: fmgr.h:226
static bytea * get_raw_page_internal(text *relname, ForkNumber forknum, BlockNumber blkno)
Definition: rawpage.c:94
#define PG_RETURN_BYTEA_P(x)
Definition: fmgr.h:313
ForkNumber forkname_to_number(const char *forkName)
Definition: relpath.c:48
unsigned int uint32
Definition: c.h:265
ForkNumber
Definition: relpath.h:24
char * text_to_cstring(const text *t)
Definition: varlena.c:184
#define PG_GETARG_TEXT_P(n)
Definition: fmgr.h:269
Definition: c.h:435
static bytea * get_raw_page_internal ( text relname,
ForkNumber  forknum,
BlockNumber  blkno 
)
static

Definition at line 94 of file rawpage.c.

References AccessShareLock, buf, BUFFER_LOCK_SHARE, BUFFER_LOCK_UNLOCK, BufferGetPage, ereport, errcode(), errmsg(), ERROR, LockBuffer(), makeRangeVarFromNameList(), NULL, palloc(), RBM_NORMAL, RelationData::rd_rel, ReadBufferExtended(), relation_close(), RELATION_IS_OTHER_TEMP, relation_openrv(), RelationGetNumberOfBlocksInFork(), RelationGetRelationName, ReleaseBuffer(), RELKIND_COMPOSITE_TYPE, RELKIND_FOREIGN_TABLE, RELKIND_VIEW, SET_VARSIZE, superuser(), textToQualifiedNameList(), VARDATA, and VARHDRSZ.

Referenced by get_raw_page(), and get_raw_page_fork().

95 {
96  bytea *raw_page;
97  RangeVar *relrv;
98  Relation rel;
99  char *raw_page_data;
100  Buffer buf;
101 
102  if (!superuser())
103  ereport(ERROR,
104  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
105  (errmsg("must be superuser to use raw functions"))));
106 
108  rel = relation_openrv(relrv, AccessShareLock);
109 
110  /* Check that this relation has storage */
111  if (rel->rd_rel->relkind == RELKIND_VIEW)
112  ereport(ERROR,
113  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
114  errmsg("cannot get raw page from view \"%s\"",
115  RelationGetRelationName(rel))));
116  if (rel->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
117  ereport(ERROR,
118  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
119  errmsg("cannot get raw page from composite type \"%s\"",
120  RelationGetRelationName(rel))));
121  if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE)
122  ereport(ERROR,
123  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
124  errmsg("cannot get raw page from foreign table \"%s\"",
125  RelationGetRelationName(rel))));
126 
127  /*
128  * Reject attempts to read non-local temporary relations; we would be
129  * likely to get wrong data since we have no visibility into the owning
130  * session's local buffers.
131  */
132  if (RELATION_IS_OTHER_TEMP(rel))
133  ereport(ERROR,
134  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
135  errmsg("cannot access temporary tables of other sessions")));
136 
137  if (blkno >= RelationGetNumberOfBlocksInFork(rel, forknum))
138  ereport(ERROR,
139  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
140  errmsg("block number %u is out of range for relation \"%s\"",
141  blkno, RelationGetRelationName(rel))));
142 
143  /* Initialize buffer to copy to */
144  raw_page = (bytea *) palloc(BLCKSZ + VARHDRSZ);
145  SET_VARSIZE(raw_page, BLCKSZ + VARHDRSZ);
146  raw_page_data = VARDATA(raw_page);
147 
148  /* Take a verbatim copy of the page */
149 
150  buf = ReadBufferExtended(rel, forknum, blkno, RBM_NORMAL, NULL);
152 
153  memcpy(raw_page_data, BufferGetPage(buf), BLCKSZ);
154 
156  ReleaseBuffer(buf);
157 
159 
160  return raw_page;
161 }
Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode)
Definition: heapam.c:1195
#define BUFFER_LOCK_UNLOCK
Definition: bufmgr.h:87
#define VARDATA(PTR)
Definition: postgres.h:305
#define VARHDRSZ
Definition: c.h:441
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
Definition: bufmgr.c:640
#define AccessShareLock
Definition: lockdefs.h:36
int errcode(int sqlerrcode)
Definition: elog.c:575
bool superuser(void)
Definition: superuser.c:47
void relation_close(Relation relation, LOCKMODE lockmode)
Definition: heapam.c:1263
void ReleaseBuffer(Buffer buffer)
Definition: bufmgr.c:3292
RangeVar * makeRangeVarFromNameList(List *names)
Definition: namespace.c:2857
Form_pg_class rd_rel
Definition: rel.h:113
#define RELKIND_COMPOSITE_TYPE
Definition: pg_class.h:165
#define ERROR
Definition: elog.h:43
static char * buf
Definition: pg_test_fsync.c:65
#define RelationGetRelationName(relation)
Definition: rel.h:433
#define RELKIND_FOREIGN_TABLE
Definition: pg_class.h:166
#define BufferGetPage(buffer)
Definition: bufmgr.h:160
#define ereport(elevel, rest)
Definition: elog.h:122
List * textToQualifiedNameList(text *textval)
Definition: varlena.c:3071
void LockBuffer(Buffer buffer, int mode)
Definition: bufmgr.c:3529
BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, ForkNumber forkNum)
Definition: bufmgr.c:2771
#define NULL
Definition: c.h:226
#define RELATION_IS_OTHER_TEMP(relation)
Definition: rel.h:530
void * palloc(Size size)
Definition: mcxt.c:891
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define RELKIND_VIEW
Definition: pg_class.h:164
#define BUFFER_LOCK_SHARE
Definition: bufmgr.h:88
Definition: c.h:435
#define SET_VARSIZE(PTR, len)
Definition: postgres.h:330
int Buffer
Definition: buf.h:23
Datum page_header ( PG_FUNCTION_ARGS  )

Definition at line 208 of file rawpage.c.

References tupleDesc::attrs, CStringGetTextDatum, elog, ereport, errcode(), errmsg(), ERROR, get_call_result_type(), heap_form_tuple(), HeapTupleGetDatum, LSNGetDatum, NULL, PageGetLSN, PageGetPageLayoutVersion, PageGetPageSize, PageHeaderData::pd_checksum, PageHeaderData::pd_flags, PageHeaderData::pd_lower, PageHeaderData::pd_prune_xid, PageHeaderData::pd_special, PageHeaderData::pd_upper, PG_GETARG_BYTEA_P, PG_RETURN_DATUM, SizeOfPageHeaderData, snprintf(), superuser(), TEXTOID, TransactionIdGetDatum, TYPEFUNC_COMPOSITE, UInt16GetDatum, values, VARDATA, VARHDRSZ, and VARSIZE.

209 {
210  bytea *raw_page = PG_GETARG_BYTEA_P(0);
211  int raw_page_size;
212 
213  TupleDesc tupdesc;
214 
215  Datum result;
216  HeapTuple tuple;
217  Datum values[9];
218  bool nulls[9];
219 
221  XLogRecPtr lsn;
222 
223  if (!superuser())
224  ereport(ERROR,
225  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
226  (errmsg("must be superuser to use raw page functions"))));
227 
228  raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
229 
230  /*
231  * Check that enough data was supplied, so that we don't try to access
232  * fields outside the supplied buffer.
233  */
234  if (raw_page_size < SizeOfPageHeaderData)
235  ereport(ERROR,
236  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
237  errmsg("input page too small (%d bytes)", raw_page_size)));
238 
239  page = (PageHeader) VARDATA(raw_page);
240 
241  /* Build a tuple descriptor for our result type */
242  if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
243  elog(ERROR, "return type must be a row type");
244 
245  /* Extract information from the page header */
246 
247  lsn = PageGetLSN(page);
248 
249  /* pageinspect >= 1.2 uses pg_lsn instead of text for the LSN field. */
250  if (tupdesc->attrs[0]->atttypid == TEXTOID)
251  {
252  char lsnchar[64];
253 
254  snprintf(lsnchar, sizeof(lsnchar), "%X/%X",
255  (uint32) (lsn >> 32), (uint32) lsn);
256  values[0] = CStringGetTextDatum(lsnchar);
257  }
258  else
259  values[0] = LSNGetDatum(lsn);
260  values[1] = UInt16GetDatum(page->pd_checksum);
261  values[2] = UInt16GetDatum(page->pd_flags);
262  values[3] = UInt16GetDatum(page->pd_lower);
263  values[4] = UInt16GetDatum(page->pd_upper);
264  values[5] = UInt16GetDatum(page->pd_special);
265  values[6] = UInt16GetDatum(PageGetPageSize(page));
266  values[7] = UInt16GetDatum(PageGetPageLayoutVersion(page));
267  values[8] = TransactionIdGetDatum(page->pd_prune_xid);
268 
269  /* Build and return the tuple. */
270 
271  memset(nulls, 0, sizeof(nulls));
272 
273  tuple = heap_form_tuple(tupdesc, values, nulls);
274  result = HeapTupleGetDatum(tuple);
275 
276  PG_RETURN_DATUM(result);
277 }
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
Definition: funcapi.c:211
#define VARDATA(PTR)
Definition: postgres.h:305
uint16 pd_flags
Definition: bufpage.h:153
#define TEXTOID
Definition: pg_type.h:324
#define VARSIZE(PTR)
Definition: postgres.h:306
#define VARHDRSZ
Definition: c.h:441
Form_pg_attribute * attrs
Definition: tupdesc.h:74
int errcode(int sqlerrcode)
Definition: elog.c:575
#define LSNGetDatum(X)
Definition: pg_lsn.h:22
bool superuser(void)
Definition: superuser.c:47
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
Definition: heaptuple.c:692
#define SizeOfPageHeaderData
Definition: bufpage.h:213
uint16 pd_checksum
Definition: bufpage.h:152
#define PG_GETARG_BYTEA_P(n)
Definition: fmgr.h:267
#define ERROR
Definition: elog.h:43
#define PageGetPageLayoutVersion(page)
Definition: bufpage.h:272
#define PageGetPageSize(page)
Definition: bufpage.h:265
unsigned int uint32
Definition: c.h:265
#define ereport(elevel, rest)
Definition: elog.h:122
LocationIndex pd_special
Definition: bufpage.h:156
#define TransactionIdGetDatum(X)
Definition: postgres.h:529
uintptr_t Datum
Definition: postgres.h:374
#define PG_RETURN_DATUM(x)
Definition: fmgr.h:297
Page page
Definition: btreefuncs.c:252
PageHeaderData * PageHeader
Definition: bufpage.h:162
#define NULL
Definition: c.h:226
uint64 XLogRecPtr
Definition: xlogdefs.h:21
TransactionId pd_prune_xid
Definition: bufpage.h:158
#define HeapTupleGetDatum(tuple)
Definition: funcapi.h:222
#define PageGetLSN(page)
Definition: bufpage.h:363
static Datum values[MAXATTR]
Definition: bootstrap.c:162
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define CStringGetTextDatum(s)
Definition: builtins.h:90
Definition: c.h:435
#define elog
Definition: elog.h:219
LocationIndex pd_upper
Definition: bufpage.h:155
#define UInt16GetDatum(X)
Definition: postgres.h:473
LocationIndex pd_lower
Definition: bufpage.h:154
PG_FUNCTION_INFO_V1 ( get_raw_page  )
PG_FUNCTION_INFO_V1 ( get_raw_page_fork  )
PG_FUNCTION_INFO_V1 ( page_header  )

Variable Documentation

PG_MODULE_MAGIC

Definition at line 32 of file rawpage.c.