Re: [HACKERS] GIN pageinspect functions
On Fri, Nov 21, 2014 at 2:04 AM, Heikki Linnakangas hlinnakan...@vmware.com wrote: On 11/20/2014 05:52 AM, Michael Paquier wrote: On Wed, Nov 19, 2014 at 7:01 AM, Peter Geoghegan p...@heroku.com wrote: On Tue, Nov 4, 2014 at 7:26 AM, Amit Kapila amit.kapil...@gmail.com wrote: 1. Documentation seems to be missing, other API's exposed via pageinspect are documented at: http://www.postgresql.org/docs/devel/static/pageinspect.html Done. 2. +CREATE FUNCTION gin_metapage(IN page bytea, +OUT pending_head bigint, +OUT pending_tail bigint, +OUT version int4) +AS 'MODULE_PATHNAME', 'gin_metapage' +LANGUAGE C STRICT; a. Isn't it better to name the function as gin_metap(..) similar to existing function bt_metap(..)? I actually liked more gin_metapage_info, a name similar to the newly-introduced brin indexes. b. Can this function have a similar signature as bt_metap() which means it should take input as relname? That's mostly a matter of taste but I think we should definitely pass a raw page to it as it is now. This has the advantage to add an extra check if the page passed is really a meta page of not, something useful for development. 3. Can gin_dataleafpage() API have similar name and signature as API bt_page_items() exposed for btree? What about gin_leafpage_items then? The signature of bt_page_items() isn't a good example to follow. It existed before the get_raw_page() function, and the other functions that are designed to work with that, was added. gin_leafpage_items() name seems fine to me. When I call gin_leafpage_items on a {leaf} page, I get the ERROR: ERROR: input page is not a compressed GIN data leaf page DETAIL: Flags 0002, expected 0083 I'm don't know why it won't work on an uncompressed leaf page (or for that matter, why my index pages are not compressed), but the docs should probably note the restriction. Cheers, Jeff pageinspect_gin_leaf.patch Description: Binary data -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GIN pageinspect functions
On 11/20/2014 05:52 AM, Michael Paquier wrote: On Wed, Nov 19, 2014 at 7:01 AM, Peter Geoghegan p...@heroku.com wrote: On Tue, Nov 4, 2014 at 7:26 AM, Amit Kapila amit.kapil...@gmail.com wrote: 1. Documentation seems to be missing, other API's exposed via pageinspect are documented at: http://www.postgresql.org/docs/devel/static/pageinspect.html Done. 2. +CREATE FUNCTION gin_metapage(IN page bytea, +OUT pending_head bigint, +OUT pending_tail bigint, +OUT version int4) +AS 'MODULE_PATHNAME', 'gin_metapage' +LANGUAGE C STRICT; a. Isn't it better to name the function as gin_metap(..) similar to existing function bt_metap(..)? I actually liked more gin_metapage_info, a name similar to the newly-introduced brin indexes. b. Can this function have a similar signature as bt_metap() which means it should take input as relname? That's mostly a matter of taste but I think we should definitely pass a raw page to it as it is now. This has the advantage to add an extra check if the page passed is really a meta page of not, something useful for development. 3. Can gin_dataleafpage() API have similar name and signature as API bt_page_items() exposed for btree? What about gin_leafpage_items then? The signature of bt_page_items() isn't a good example to follow. It existed before the get_raw_page() function, and the other functions that are designed to work with that, was added. gin_leafpage_items() name seems fine to me. 4. Can we have any better name for gin_pageopaq (other API name's in this module are self explanatory)? gin_page_opaque_info? Because we get back information about the opaque portion of the page. Feel free if you have any better idea. Updated patch, with some more things improved and cleaned up (addition of header of ginfuncs.c, addition of array of decoded item pointers for compressed data leaf pages), is attached. This is why I love open source - I post something half-baked, and others pop up and finish the work ;-). Committed with minor fixes, many thanks! One last thing not only interesting for this patch: it may be good to expose DatumGetItemPointer and ItemPointerGetDatum in for extensions analyzing content of pages. I am not sure where though, a place like utils/*.h may be useful. Thoughts? Yeah, maybe. I'll leave that to the next patch that needs it, as long as there's only one user of it, it doesn't seem worth it. - Heikki -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GIN pageinspect functions
On Wed, Nov 19, 2014 at 7:01 AM, Peter Geoghegan p...@heroku.com wrote: On Tue, Nov 4, 2014 at 7:26 AM, Amit Kapila amit.kapil...@gmail.com wrote: I think these functions will be quite useful for debugging purpose and we already have similar function's for other index (btree). This patch has bitrotted. I attach rebased revision, for the convenience of others - V1.3 of pageinspect will now incorporate both GIN stuff, and BRIN stuff. Seems like this patch was affected by the recent problems with header includes - that's fixed. Thanks for the updated version! That's a cool timing, I wanted to move this patch forward these days... I think as well that it would be a useful addition for pageinspect (and I was in need of them yesterday, and soon today btw). Amit wrote: 1. Documentation seems to be missing, other API's exposed via pageinspect are documented at: http://www.postgresql.org/docs/devel/static/pageinspect.html Done. 2. +CREATE FUNCTION gin_metapage(IN page bytea, +OUT pending_head bigint, +OUT pending_tail bigint, +OUT version int4) +AS 'MODULE_PATHNAME', 'gin_metapage' +LANGUAGE C STRICT; a. Isn't it better to name the function as gin_metap(..) similar to existing function bt_metap(..)? I actually liked more gin_metapage_info, a name similar to the newly-introduced brin indexes. b. Can this function have a similar signature as bt_metap() which means it should take input as relname? That's mostly a matter of taste but I think we should definitely pass a raw page to it as it is now. This has the advantage to add an extra check if the page passed is really a meta page of not, something useful for development. 3. Can gin_dataleafpage() API have similar name and signature as API bt_page_items() exposed for btree? What about gin_leafpage_items then? 4. Can we have any better name for gin_pageopaq (other API name's in this module are self explanatory)? gin_page_opaque_info? Because we get back information about the opaque portion of the page. Feel free if you have any better idea. Updated patch, with some more things improved and cleaned up (addition of header of ginfuncs.c, addition of array of decoded item pointers for compressed data leaf pages), is attached. One last thing not only interesting for this patch: it may be good to expose DatumGetItemPointer and ItemPointerGetDatum in for extensions analyzing content of pages. I am not sure where though, a place like utils/*.h may be useful. Thoughts? Regards, -- Michael diff --git a/contrib/pageinspect/Makefile b/contrib/pageinspect/Makefile index a59de8a..aec5258 100644 --- a/contrib/pageinspect/Makefile +++ b/contrib/pageinspect/Makefile @@ -1,12 +1,13 @@ # contrib/pageinspect/Makefile MODULE_big = pageinspect -OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o brinfuncs.o $(WIN32RES) +OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o \ + brinfuncs.o ginfuncs.o $(WIN32RES) EXTENSION = pageinspect -DATA = pageinspect--1.3.sql pageinspect--1.0--1.1.sql \ - pageinspect--1.2--1.3.sql \ - pageinspect--1.1--1.2.sql pageinspect--unpackaged--1.0.sql +DATA = pageinspect--1.3.sql pageinspect--1.2--1.3.sql \ + pageinspect--1.1--1.2.sql pageinspect--1.0--1.1.sql \ + pageinspect--unpackaged--1.0.sql PGFILEDESC = pageinspect - functions to inspect contents of database pages ifdef USE_PGXS diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c new file mode 100644 index 000..8927951 --- /dev/null +++ b/contrib/pageinspect/ginfuncs.c @@ -0,0 +1,280 @@ +/* + * ginfuncs.c + * Functions to investigate the content of GIN indexes + * + * Copyright (c) 2014, PostgreSQL Global Development Group + * + * IDENTIFICATION + * contrib/pageinspect/ginfuncs.c + */ +#include postgres.h + +#include access/gin.h +#include access/gin_private.h +#include access/htup_details.h +#include catalog/namespace.h +#include catalog/pg_type.h +#include funcapi.h +#include miscadmin.h +#include utils/array.h +#include utils/builtins.h +#include utils/rel.h + +#define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X)) +#define ItemPointerGetDatum(X) PointerGetDatum(X) + + +PG_FUNCTION_INFO_V1(gin_metapage_info); +PG_FUNCTION_INFO_V1(gin_page_opaque_info); +PG_FUNCTION_INFO_V1(gin_leafpage_items); + +typedef struct gin_leafpage_items_state +{ + TupleDesc tupd; + GinPostingList *seg; + GinPostingList *lastseg; +} gin_leafpage_items_state; + + +Datum +gin_metapage_info(PG_FUNCTION_ARGS) +{ + bytea *raw_page = PG_GETARG_BYTEA_P(0); + int raw_page_size; + TupleDesc tupdesc; + Page page; + GinPageOpaque opaq; + GinMetaPageData *metadata; + HeapTuple resultTuple; + Datum values[10]; + bool nulls[10]; + + 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), +
Re: [HACKERS] GIN pageinspect functions
On Tue, Nov 4, 2014 at 7:26 AM, Amit Kapila amit.kapil...@gmail.com wrote: I think these functions will be quite useful for debugging purpose and we already have similar function's for other index (btree). This patch has bitrotted. I attach rebased revision, for the convenience of others - V1.3 of pageinspect will now incorporate both GIN stuff, and BRIN stuff. Seems like this patch was affected by the recent problems with header includes - that's fixed. Do you intend to fix this up? + /* TODO: array of decoded item pointers */ + nulls[2] = true; -- Peter Geoghegan From 5d10bfe4f6db5e37dcf087d62f42cbc6c9423c26 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan p...@heroku.com Date: Tue, 18 Nov 2014 13:38:12 -0800 Subject: [PATCH] Add pageinspect functions for inspecting GIN indexes. --- contrib/pageinspect/Makefile | 2 +- contrib/pageinspect/ginfuncs.c| 265 ++ contrib/pageinspect/pageinspect--1.2--1.3.sql | 37 contrib/pageinspect/pageinspect--1.3.sql | 42 4 files changed, 345 insertions(+), 1 deletion(-) create mode 100644 contrib/pageinspect/ginfuncs.c diff --git a/contrib/pageinspect/Makefile b/contrib/pageinspect/Makefile index a59de8a..e651543 100644 --- a/contrib/pageinspect/Makefile +++ b/contrib/pageinspect/Makefile @@ -1,7 +1,7 @@ # contrib/pageinspect/Makefile MODULE_big = pageinspect -OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o brinfuncs.o $(WIN32RES) +OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o brinfuncs.o ginfuncs.o $(WIN32RES) EXTENSION = pageinspect DATA = pageinspect--1.3.sql pageinspect--1.0--1.1.sql \ diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c new file mode 100644 index 000..0602873 --- /dev/null +++ b/contrib/pageinspect/ginfuncs.c @@ -0,0 +1,265 @@ +/* + * contrib/pageinspect/ginfuncs.c + */ + +#include postgres.h + +#include access/gin.h +#include access/gin_private.h +#include access/htup_details.h +#include catalog/namespace.h +#include catalog/pg_type.h +#include funcapi.h +#include miscadmin.h +#include utils/array.h +#include utils/builtins.h +#include utils/rel.h + +#define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X)) +#define ItemPointerGetDatum(X) PointerGetDatum(X) + +PG_FUNCTION_INFO_V1(gin_metapage); +PG_FUNCTION_INFO_V1(gin_pageopaq); +PG_FUNCTION_INFO_V1(gin_dataleafpage); + +Datum +gin_metapage(PG_FUNCTION_ARGS) +{ + bytea *raw_page = PG_GETARG_BYTEA_P(0); + int raw_page_size; + TupleDesc tupdesc; + Page page; + GinPageOpaque opaq; + GinMetaPageData *metadata; + HeapTuple resultTuple; + Datum values[10]; + bool nulls[10]; + + 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 (%d bytes), raw_page_size))); + page = VARDATA(raw_page); + + opaq = (GinPageOpaque) PageGetSpecialPointer(page); + if (opaq-flags != GIN_META) + ereport(ERROR, +(errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg(input page is not a GIN metapage), + errdetail(Flags %04X, expected %04X, + opaq-flags, GIN_META))); + + /* Build a tuple descriptor for our result type */ + if (get_call_result_type(fcinfo, NULL, tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, return type must be a row type); + + metadata = GinPageGetMeta(page); + + memset(nulls, 0, sizeof(nulls)); + + values[0] = Int64GetDatum(metadata-head); + values[1] = Int64GetDatum(metadata-tail); + values[2] = Int32GetDatum(metadata-tailFreeSize); + values[3] = Int64GetDatum(metadata-nPendingPages); + values[4] = Int64GetDatum(metadata-nPendingHeapTuples); + + /* statistics, updated by VACUUM */ + values[5] = Int64GetDatum(metadata-nTotalPages); + values[6] = Int64GetDatum(metadata-nEntryPages); + values[7] = Int64GetDatum(metadata-nDataPages); + values[8] = Int64GetDatum(metadata-nEntries); + + values[9] = Int32GetDatum(metadata-ginVersion); + + /* Build and return the result tuple. */ + resultTuple = heap_form_tuple(tupdesc, values, nulls); + + return HeapTupleGetDatum(resultTuple); +} + + +Datum +gin_pageopaq(PG_FUNCTION_ARGS) +{ + bytea *raw_page = PG_GETARG_BYTEA_P(0); + int raw_page_size; + TupleDesc tupdesc; + Page page; + GinPageOpaque opaq; + HeapTuple resultTuple; + Datum values[3]; + bool nulls[10]; + Datum flags[16]; + int nflags = 0; + uint16 flagbits; + + 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 (%d bytes), raw_page_size))); + page = VARDATA(raw_page); + + opaq = (GinPageOpaque)
Re: [HACKERS] GIN pageinspect functions
On Tue, Nov 18, 2014 at 2:01 PM, Peter Geoghegan p...@heroku.com wrote: Do you intend to fix this up? BTW, how do you feel about the B-Tree check extension [1]? It's very much related to pageinspect -- it's more or less a derivative. I don't think I'm going to have time (or that there is sufficient review bandwidth available) to get it into 9.5, but I should post a revision soon, so it's at least something that's available for use by an expert. I did some clean-up work on it that is unpublished. It'll become a more generic extension - amcheck, per Robert's suggestion. One unpublished additional feature (that I have to fix a bug in) that isn't included in [1] is the idea of checking invariants across B-Tree pages. So, a scankey should indicate that the greatest (non-highkey) item on a non-rightmost page comports with the page that it has a right link to. Without race conditions. I don't have that swapped into my head at the moment, and so I don't have a good sense of how hard it'll be to fix the problem I found... [1] http://www.postgresql.org/message-id/cam3swzrtv+xmrwlwq6c-x7czvwavfdwfi4st1zz4ddgfh4y...@mail.gmail.com -- Peter Geoghegan -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GIN pageinspect functions
On Tue, Oct 7, 2014 at 10:33 PM, Heikki Linnakangas hlinnakan...@vmware.com wrote: Some time ago, when debugging a GIN bug, I wrote these pageinspect functions to inspect GIN indexes. They were very useful; we should add them. I think these functions will be quite useful for debugging purpose and we already have similar function's for other index (btree). Few suggestions for patch: 1. Documentation seems to be missing, other API's exposed via pageinspect are documented at: http://www.postgresql.org/docs/devel/static/pageinspect.html 2. +CREATE FUNCTION gin_metapage(IN page bytea, +OUT pending_head bigint, +OUT pending_tail bigint, + OUT tail_free_size int4, +OUT n_pending_pages bigint, +OUT n_pending_tuples bigint, +OUT n_total_pages bigint, +OUT n_entry_pages bigint, +OUT n_data_pages bigint, +OUT n_entries bigint, + OUT version int4) +AS 'MODULE_PATHNAME', 'gin_metapage' +LANGUAGE C STRICT; a. Isn't it better to name the function as gin_metap(..) similar to existing function bt_metap(..)? b. Can this function have a similar signature as bt_metap() which means it should take input as relname? 3. Can gin_dataleafpage() API have similar name and signature as API bt_page_items() exposed for btree? 4. Can we have any better name for gin_pageopaq (other API name's in this module are self explanatory)? With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com
[HACKERS] GIN pageinspect functions
Some time ago, when debugging a GIN bug, I wrote these pageinspect functions to inspect GIN indexes. They were very useful; we should add them. - Heikki From 91ef58aab11e9077ab6a38268a1120806e42f2dd Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas heikki.linnakan...@iki.fi Date: Fri, 12 Sep 2014 13:36:30 +0300 Subject: [PATCH 1/1] Add pageinspect functions for inspecting GIN indexes. --- contrib/pageinspect/Makefile | 7 +- contrib/pageinspect/ginfuncs.c| 264 ++ contrib/pageinspect/pageinspect--1.2--1.3.sql | 42 contrib/pageinspect/pageinspect--1.3.sql | 149 +++ contrib/pageinspect/pageinspect.control | 2 +- 5 files changed, 460 insertions(+), 4 deletions(-) create mode 100644 contrib/pageinspect/ginfuncs.c create mode 100644 contrib/pageinspect/pageinspect--1.2--1.3.sql create mode 100644 contrib/pageinspect/pageinspect--1.3.sql diff --git a/contrib/pageinspect/Makefile b/contrib/pageinspect/Makefile index f10229d..1a8b060 100644 --- a/contrib/pageinspect/Makefile +++ b/contrib/pageinspect/Makefile @@ -1,11 +1,12 @@ # contrib/pageinspect/Makefile MODULE_big = pageinspect -OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o $(WIN32RES) +OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o ginfuncs.o $(WIN32RES) EXTENSION = pageinspect -DATA = pageinspect--1.2.sql pageinspect--1.0--1.1.sql \ - pageinspect--1.1--1.2.sql pageinspect--unpackaged--1.0.sql +DATA = pageinspect--1.3.sql pageinspect--1.0--1.1.sql \ + pageinspect--1.1--1.2.sql pageinspect--1.2--1.3.sql \ +pageinspect--unpackaged--1.0.sql PGFILEDESC = pageinspect - functions to inspect contents of database pages ifdef USE_PGXS diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c new file mode 100644 index 000..949d19d --- /dev/null +++ b/contrib/pageinspect/ginfuncs.c @@ -0,0 +1,264 @@ +/* + * contrib/pageinspect/ginfuncs.c + */ + +#include postgres.h + +#include access/gin.h +#include access/gin_private.h +#include access/htup_details.h +#include catalog/namespace.h +#include catalog/pg_type.h +#include funcapi.h +#include miscadmin.h +#include utils/builtins.h +#include utils/rel.h + +#define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X)) +#define ItemPointerGetDatum(X) PointerGetDatum(X) + +PG_FUNCTION_INFO_V1(gin_metapage); +PG_FUNCTION_INFO_V1(gin_pageopaq); +PG_FUNCTION_INFO_V1(gin_dataleafpage); + +Datum +gin_metapage(PG_FUNCTION_ARGS) +{ + bytea *raw_page = PG_GETARG_BYTEA_P(0); + int raw_page_size; + TupleDesc tupdesc; + Page page; + GinPageOpaque opaq; + GinMetaPageData *metadata; + HeapTuple resultTuple; + Datum values[10]; + bool nulls[10]; + + 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 (%d bytes), raw_page_size))); + page = VARDATA(raw_page); + + opaq = (GinPageOpaque) PageGetSpecialPointer(page); + if (opaq-flags != GIN_META) + ereport(ERROR, +(errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg(input page is not a GIN metapage), + errdetail(Flags %04X, expected %04X, + opaq-flags, GIN_META))); + + /* Build a tuple descriptor for our result type */ + if (get_call_result_type(fcinfo, NULL, tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, return type must be a row type); + + metadata = GinPageGetMeta(page); + + memset(nulls, 0, sizeof(nulls)); + + values[0] = Int64GetDatum(metadata-head); + values[1] = Int64GetDatum(metadata-tail); + values[2] = Int32GetDatum(metadata-tailFreeSize); + values[3] = Int64GetDatum(metadata-nPendingPages); + values[4] = Int64GetDatum(metadata-nPendingHeapTuples); + + /* statistics, updated by VACUUM */ + values[5] = Int64GetDatum(metadata-nTotalPages); + values[6] = Int64GetDatum(metadata-nEntryPages); + values[7] = Int64GetDatum(metadata-nDataPages); + values[8] = Int64GetDatum(metadata-nEntries); + + values[9] = Int32GetDatum(metadata-ginVersion); + + /* Build and return the result tuple. */ + resultTuple = heap_form_tuple(tupdesc, values, nulls); + + return HeapTupleGetDatum(resultTuple); +} + + +Datum +gin_pageopaq(PG_FUNCTION_ARGS) +{ + bytea *raw_page = PG_GETARG_BYTEA_P(0); + int raw_page_size; + TupleDesc tupdesc; + Page page; + GinPageOpaque opaq; + HeapTuple resultTuple; + Datum values[3]; + bool nulls[10]; + Datum flags[16]; + int nflags = 0; + uint16 flagbits; + + 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 (%d bytes), raw_page_size))); + page
Re: [HACKERS] GIN pageinspect functions
On Tue, Oct 7, 2014 at 9:03 PM, Heikki Linnakangas hlinnakan...@vmware.com wrote: Some time ago, when debugging a GIN bug, I wrote these pageinspect functions to inspect GIN indexes. They were very useful; we should add them. May be we can merge it with contrib/gevel, which we use many years for development and debug purposes ? Have you seen it ? - Heikki -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] GIN pageinspect functions
On 10/07/2014 08:36 PM, Oleg Bartunov wrote: On Tue, Oct 7, 2014 at 9:03 PM, Heikki Linnakangas hlinnakan...@vmware.com wrote: Some time ago, when debugging a GIN bug, I wrote these pageinspect functions to inspect GIN indexes. They were very useful; we should add them. May be we can merge it with contrib/gevel, which we use many years for development and debug purposes ? Have you seen it ? I remember downloading it many years ago, but that's all I remember. Where's the latest version? - Heikki -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers