Exemple #1
0
/*
 * 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;
}
Exemple #2
0
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));
}