From: Peter Geoghegan Date: Mon, 15 Feb 2021 04:11:11 +0000 (-0800) Subject: Add "LP_DEAD item?" column to GiST pageinspect functions X-Git-Tag: REL_14_BETA1~760 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=9e596b65f430fcb942685b41860b323398a88873;p=postgresql.git Add "LP_DEAD item?" column to GiST pageinspect functions This brings gist_page_items() and gist_page_items_bytea() in line with nbtree's bt_page_items() function. Minor follow-up to commit 756ab291, which added the GiST functions. Author: Andrey Borodin Discussion: https://postgr.es/m/E0794687-7315-4C29-A9C7-EC54D448596D@yandex-team.ru --- diff --git a/contrib/pageinspect/expected/gist.out b/contrib/pageinspect/expected/gist.out index 5f7d8cea71b..86c9e9caa9d 100644 --- a/contrib/pageinspect/expected/gist.out +++ b/contrib/pageinspect/expected/gist.out @@ -31,25 +31,25 @@ SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 2)); COMMIT; SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gist_idx'); - itemoffset | ctid | itemlen | keys -------------+-----------+---------+------------------- - 1 | (1,65535) | 40 | (p)=((166,166)) - 2 | (2,65535) | 40 | (p)=((332,332)) - 3 | (3,65535) | 40 | (p)=((498,498)) - 4 | (4,65535) | 40 | (p)=((664,664)) - 5 | (5,65535) | 40 | (p)=((830,830)) - 6 | (6,65535) | 40 | (p)=((996,996)) - 7 | (7,65535) | 40 | (p)=((1000,1000)) + itemoffset | ctid | itemlen | dead | keys +------------+-----------+---------+------+------------------- + 1 | (1,65535) | 40 | f | (p)=((166,166)) + 2 | (2,65535) | 40 | f | (p)=((332,332)) + 3 | (3,65535) | 40 | f | (p)=((498,498)) + 4 | (4,65535) | 40 | f | (p)=((664,664)) + 5 | (5,65535) | 40 | f | (p)=((830,830)) + 6 | (6,65535) | 40 | f | (p)=((996,996)) + 7 | (7,65535) | 40 | f | (p)=((1000,1000)) (7 rows) SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 1), 'test_gist_idx') LIMIT 5; - itemoffset | ctid | itemlen | keys -------------+-------+---------+------------- - 1 | (0,1) | 40 | (p)=((1,1)) - 2 | (0,2) | 40 | (p)=((2,2)) - 3 | (0,3) | 40 | (p)=((3,3)) - 4 | (0,4) | 40 | (p)=((4,4)) - 5 | (0,5) | 40 | (p)=((5,5)) + itemoffset | ctid | itemlen | dead | keys +------------+-------+---------+------+------------- + 1 | (0,1) | 40 | f | (p)=((1,1)) + 2 | (0,2) | 40 | f | (p)=((2,2)) + 3 | (0,3) | 40 | f | (p)=((3,3)) + 4 | (0,4) | 40 | f | (p)=((4,4)) + 5 | (0,5) | 40 | f | (p)=((5,5)) (5 rows) -- gist_page_items_bytea prints the raw key data as a bytea. The output of that is diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c index 66a7f5562f2..eb9f6303df6 100644 --- a/contrib/pageinspect/gistfuncs.c +++ b/contrib/pageinspect/gistfuncs.c @@ -146,8 +146,8 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) offset <= maxoff; offset++) { - Datum values[4]; - bool nulls[4]; + Datum values[5]; + bool nulls[5]; ItemId id; IndexTuple itup; bytea *tuple_bytea; @@ -170,7 +170,8 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) tuple_bytea = (bytea *) palloc(tuple_len + VARHDRSZ); SET_VARSIZE(tuple_bytea, tuple_len + VARHDRSZ); memcpy(VARDATA(tuple_bytea), itup, tuple_len); - values[3] = PointerGetDatum(tuple_bytea); + values[3] = BoolGetDatum(ItemIdIsDead(id)); + values[4] = PointerGetDatum(tuple_bytea); tuplestore_putvalues(tupstore, tupdesc, values, nulls); } @@ -237,8 +238,8 @@ gist_page_items(PG_FUNCTION_ARGS) offset <= maxoff; offset++) { - Datum values[4]; - bool nulls[4]; + Datum values[5]; + bool nulls[5]; ItemId id; IndexTuple itup; Datum itup_values[INDEX_MAX_KEYS]; @@ -260,14 +261,15 @@ gist_page_items(PG_FUNCTION_ARGS) values[0] = DatumGetInt16(offset); values[1] = ItemPointerGetDatum(&itup->t_tid); values[2] = Int32GetDatum((int) IndexTupleSize(itup)); + values[3] = BoolGetDatum(ItemIdIsDead(id)); key_desc = BuildIndexValueDescription(indexRel, itup_values, itup_isnull); if (key_desc) - values[3] = CStringGetTextDatum(key_desc); + values[4] = CStringGetTextDatum(key_desc); else { - values[3] = (Datum) 0; - nulls[3] = true; + values[4] = (Datum) 0; + nulls[4] = true; } tuplestore_putvalues(tupstore, tupdesc, values, nulls); diff --git a/contrib/pageinspect/pageinspect--1.8--1.9.sql b/contrib/pageinspect/pageinspect--1.8--1.9.sql index b4248d791f0..79a42a7b11e 100644 --- a/contrib/pageinspect/pageinspect--1.8--1.9.sql +++ b/contrib/pageinspect/pageinspect--1.8--1.9.sql @@ -22,6 +22,7 @@ CREATE FUNCTION gist_page_items_bytea(IN page bytea, OUT itemoffset smallint, OUT ctid tid, OUT itemlen smallint, + OUT dead boolean, OUT key_data bytea) RETURNS SETOF record AS 'MODULE_PATHNAME', 'gist_page_items_bytea' @@ -35,6 +36,7 @@ CREATE FUNCTION gist_page_items(IN page bytea, OUT itemoffset smallint, OUT ctid tid, OUT itemlen smallint, + OUT dead boolean, OUT keys text) RETURNS SETOF record AS 'MODULE_PATHNAME', 'gist_page_items' diff --git a/doc/src/sgml/pageinspect.sgml b/doc/src/sgml/pageinspect.sgml index a0be779940d..c7333419848 100644 --- a/doc/src/sgml/pageinspect.sgml +++ b/doc/src/sgml/pageinspect.sgml @@ -714,15 +714,15 @@ test=# SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 2)); the data stored in a page of a GiST index. For example: test=# SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gist_idx'); - itemoffset | ctid | itemlen | keys -------------+-----------+---------+------------------- - 1 | (1,65535) | 40 | (p)=((166,166)) - 2 | (2,65535) | 40 | (p)=((332,332)) - 3 | (3,65535) | 40 | (p)=((498,498)) - 4 | (4,65535) | 40 | (p)=((664,664)) - 5 | (5,65535) | 40 | (p)=((830,830)) - 6 | (6,65535) | 40 | (p)=((996,996)) - 7 | (7,65535) | 40 | (p)=((1000,1000)) + itemoffset | ctid | itemlen | dead | keys +------------+-----------+---------+------+------------------- + 1 | (1,65535) | 40 | f | (p)=((166,166)) + 2 | (2,65535) | 40 | f | (p)=((332,332)) + 3 | (3,65535) | 40 | f | (p)=((498,498)) + 4 | (4,65535) | 40 | f | (p)=((664,664)) + 5 | (5,65535) | 40 | f | (p)=((830,830)) + 6 | (6,65535) | 40 | f | (p)=((996,996)) + 7 | (7,65535) | 40 | f | (p)=((1000,1000)) (7 rows) @@ -745,15 +745,15 @@ test=# SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gis example: test=# SELECT * FROM gist_page_items_bytea(get_raw_page('test_gist_idx', 0)); - itemoffset | ctid | itemlen | key_data -------------+-----------+---------+-------------------------------------------&zwsp;----------------------------------------- - 1 | (1,65535) | 40 | \x00000100ffff28000000000000c0644000000000&zwsp;00c06440000000000000f03f000000000000f03f - 2 | (2,65535) | 40 | \x00000200ffff28000000000000c0744000000000&zwsp;00c074400000000000e064400000000000e06440 - 3 | (3,65535) | 40 | \x00000300ffff28000000000000207f4000000000&zwsp;00207f400000000000d074400000000000d07440 - 4 | (4,65535) | 40 | \x00000400ffff28000000000000c0844000000000&zwsp;00c084400000000000307f400000000000307f40 - 5 | (5,65535) | 40 | \x00000500ffff28000000000000f0894000000000&zwsp;00f089400000000000c884400000000000c88440 - 6 | (6,65535) | 40 | \x00000600ffff28000000000000208f4000000000&zwsp;00208f400000000000f889400000000000f88940 - 7 | (7,65535) | 40 | \x00000700ffff28000000000000408f4000000000&zwsp;00408f400000000000288f400000000000288f40 + itemoffset | ctid | itemlen | dead | key_data +------------+-----------+---------+------+-----------------------------------------&zwsp;------------------------------------------- + 1 | (1,65535) | 40 | f | \x00000100ffff28000000000000c0644000000000&zwsp;00c06440000000000000f03f000000000000f03f + 2 | (2,65535) | 40 | f | \x00000200ffff28000000000000c0744000000000&zwsp;00c074400000000000e064400000000000e06440 + 3 | (3,65535) | 40 | f | \x00000300ffff28000000000000207f4000000000&zwsp;00207f400000000000d074400000000000d07440 + 4 | (4,65535) | 40 | f | \x00000400ffff28000000000000c0844000000000&zwsp;00c084400000000000307f400000000000307f40 + 5 | (5,65535) | 40 | f | \x00000500ffff28000000000000f0894000000000&zwsp;00f089400000000000c884400000000000c88440 + 6 | (6,65535) | 40 | f | \x00000600ffff28000000000000208f4000000000&zwsp;00208f400000000000f889400000000000f88940 + 7 | (7,65535) | 40 | f | \x00000700ffff28000000000000408f4000000000&zwsp;00408f400000000000288f400000000000288f40 (7 rows)