1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-31 22:04:40 +03:00

Back-patch portability fixes for contrib/pageinspect/ginfuncs.c.

Back-patch commits 84ad68d64 and 367b99bbb.
This commit is contained in:
Tom Lane
2016-11-04 12:37:29 -04:00
parent ac6fc1b55c
commit 56d34ba5fb

View File

@ -28,11 +28,31 @@ PG_FUNCTION_INFO_V1(gin_metapage_info);
PG_FUNCTION_INFO_V1(gin_page_opaque_info); PG_FUNCTION_INFO_V1(gin_page_opaque_info);
PG_FUNCTION_INFO_V1(gin_leafpage_items); PG_FUNCTION_INFO_V1(gin_leafpage_items);
static Page
get_page_from_raw(bytea *raw_page)
{
int raw_page_size;
Page page;
raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
if (raw_page_size < BLCKSZ)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("input page too small (%d bytes)", raw_page_size)));
/* make a copy so that the page is properly aligned for struct access */
page = palloc(raw_page_size);
memcpy(page, VARDATA(raw_page), raw_page_size);
return page;
}
Datum Datum
gin_metapage_info(PG_FUNCTION_ARGS) gin_metapage_info(PG_FUNCTION_ARGS)
{ {
bytea *raw_page = PG_GETARG_BYTEA_P(0); bytea *raw_page = PG_GETARG_BYTEA_P(0);
int raw_page_size;
TupleDesc tupdesc; TupleDesc tupdesc;
Page page; Page page;
GinPageOpaque opaq; GinPageOpaque opaq;
@ -46,12 +66,7 @@ gin_metapage_info(PG_FUNCTION_ARGS)
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
(errmsg("must be superuser to use raw page functions")))); (errmsg("must be superuser to use raw page functions"))));
raw_page_size = VARSIZE(raw_page) - VARHDRSZ; page = get_page_from_raw(raw_page);
if (raw_page_size < BLCKSZ)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("input page too small (%d bytes)", raw_page_size)));
page = VARDATA(raw_page);
opaq = (GinPageOpaque) PageGetSpecialPointer(page); opaq = (GinPageOpaque) PageGetSpecialPointer(page);
if (opaq->flags != GIN_META) if (opaq->flags != GIN_META)
@ -94,7 +109,6 @@ Datum
gin_page_opaque_info(PG_FUNCTION_ARGS) gin_page_opaque_info(PG_FUNCTION_ARGS)
{ {
bytea *raw_page = PG_GETARG_BYTEA_P(0); bytea *raw_page = PG_GETARG_BYTEA_P(0);
int raw_page_size;
TupleDesc tupdesc; TupleDesc tupdesc;
Page page; Page page;
GinPageOpaque opaq; GinPageOpaque opaq;
@ -110,12 +124,7 @@ gin_page_opaque_info(PG_FUNCTION_ARGS)
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
(errmsg("must be superuser to use raw page functions")))); (errmsg("must be superuser to use raw page functions"))));
raw_page_size = VARSIZE(raw_page) - VARHDRSZ; page = get_page_from_raw(raw_page);
if (raw_page_size < BLCKSZ)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("input page too small (%d bytes)", raw_page_size)));
page = VARDATA(raw_page);
opaq = (GinPageOpaque) PageGetSpecialPointer(page); opaq = (GinPageOpaque) PageGetSpecialPointer(page);
@ -173,7 +182,6 @@ Datum
gin_leafpage_items(PG_FUNCTION_ARGS) gin_leafpage_items(PG_FUNCTION_ARGS)
{ {
bytea *raw_page = PG_GETARG_BYTEA_P(0); bytea *raw_page = PG_GETARG_BYTEA_P(0);
int raw_page_size;
FuncCallContext *fctx; FuncCallContext *fctx;
gin_leafpage_items_state *inter_call_data; gin_leafpage_items_state *inter_call_data;
@ -182,8 +190,6 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
(errmsg("must be superuser to use raw page functions")))); (errmsg("must be superuser to use raw page functions"))));
raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
if (SRF_IS_FIRSTCALL()) if (SRF_IS_FIRSTCALL())
{ {
TupleDesc tupdesc; TupleDesc tupdesc;
@ -191,11 +197,10 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
Page page; Page page;
GinPageOpaque opaq; GinPageOpaque opaq;
if (raw_page_size < BLCKSZ) fctx = SRF_FIRSTCALL_INIT();
ereport(ERROR, mctx = MemoryContextSwitchTo(fctx->multi_call_memory_ctx);
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("input page too small (%d bytes)", raw_page_size))); page = get_page_from_raw(raw_page);
page = VARDATA(raw_page);
if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GinPageOpaqueData))) if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GinPageOpaqueData)))
ereport(ERROR, ereport(ERROR,
@ -214,9 +219,6 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
opaq->flags, opaq->flags,
(GIN_DATA | GIN_LEAF | GIN_COMPRESSED)))); (GIN_DATA | GIN_LEAF | GIN_COMPRESSED))));
fctx = SRF_FIRSTCALL_INIT();
mctx = MemoryContextSwitchTo(fctx->multi_call_memory_ctx);
inter_call_data = palloc(sizeof(gin_leafpage_items_state)); inter_call_data = palloc(sizeof(gin_leafpage_items_state));
/* Build a tuple descriptor for our result type */ /* Build a tuple descriptor for our result type */