/* * Verify that the given bytea contains a BRIN page of the indicated page * type, or die in the attempt. A pointer to the page is returned. */ static Page verify_brin_page(bytea *raw_page, uint16 type, const char *strtype) { Page page; int raw_page_size; raw_page_size = VARSIZE(raw_page) - VARHDRSZ; if (raw_page_size < SizeOfPageHeaderData) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("input page too small"), errdetail("Expected size %d, got %d", raw_page_size, BLCKSZ))); page = VARDATA(raw_page); /* verify the special space says this page is what we want */ if (BrinPageType(page) != type) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("page is not a BRIN page of type \"%s\"", strtype), errdetail("Expected special type %08x, got %08x.", type, BrinPageType(page)))); return page; }
Datum brin_page_type(PG_FUNCTION_ARGS) { bytea *raw_page = PG_GETARG_BYTEA_P(0); Page page = VARDATA(raw_page); char *type; switch (BrinPageType(page)) { case BRIN_PAGETYPE_META: type = "meta"; break; case BRIN_PAGETYPE_REVMAP: type = "revmap"; break; case BRIN_PAGETYPE_REGULAR: type = "regular"; break; default: type = psprintf("unknown (%02x)", BrinPageType(page)); break; } PG_RETURN_TEXT_P(cstring_to_text(type)); }
/* * Initialize a page with the given type. * * Caller is responsible for marking it dirty, as appropriate. */ void brin_page_init(Page page, uint16 type) { PageInit(page, BLCKSZ, sizeof(BrinSpecialSpace)); BrinPageType(page) = type; }
Datum brin_page_type(PG_FUNCTION_ARGS) { bytea *raw_page = PG_GETARG_BYTEA_P(0); Page page = VARDATA(raw_page); int raw_page_size; char *type; if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), (errmsg("must be superuser to use raw page functions")))); raw_page_size = VARSIZE(raw_page) - VARHDRSZ; if (raw_page_size != BLCKSZ) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("input page too small"), errdetail("Expected size %d, got %d", BLCKSZ, raw_page_size))); switch (BrinPageType(page)) { case BRIN_PAGETYPE_META: type = "meta"; break; case BRIN_PAGETYPE_REVMAP: type = "revmap"; break; case BRIN_PAGETYPE_REGULAR: type = "regular"; break; default: type = psprintf("unknown (%02x)", BrinPageType(page)); break; } PG_RETURN_TEXT_P(cstring_to_text(type)); }