Add "LP_DEAD item?" column to GiST pageinspect functions
authorPeter Geoghegan <[email protected]>
Mon, 15 Feb 2021 04:11:11 +0000 (20:11 -0800)
committerPeter Geoghegan <[email protected]>
Mon, 15 Feb 2021 04:11:11 +0000 (20:11 -0800)
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 <[email protected]>
Discussion: https://postgr.es/m/E0794687-7315-4C29-A9C7-EC54D448596D@yandex-team.ru

contrib/pageinspect/expected/gist.out
contrib/pageinspect/gistfuncs.c
contrib/pageinspect/pageinspect--1.8--1.9.sql
doc/src/sgml/pageinspect.sgml

index 5f7d8cea71b83342866258d0dc0665462c25cab9..86c9e9caa9dcecba9ce6328c63195b4aaa416d85 100644 (file)
@@ -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
index 66a7f5562f2955b9586141d6a9b13dd263f38ab5..eb9f6303df63f43f7d9db8349414f18521f78cad 100644 (file)
@@ -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);
index b4248d791f0d19682ee48aa34def281e340b80f6..79a42a7b11e03caff64e67f80390a38b0559058f 100644 (file)
@@ -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'
index a0be779940d667dc2ef5172fbf8ff1f239f07911..c733341984843f8c0663123c6e5fa286783625c5 100644 (file)
@@ -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 <acronym>GiST</acronym> index.  For example:
 <screen>
 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)
 </screen>
      </para>
@@ -745,15 +745,15 @@ test=# SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gis
       example:
 <screen>
 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)
 </screen>
      </para>