postgresql/contrib/pageinspect
Tom Lane 6889303531 Redefine the lp_flags field of item pointers as having four states, rather
than two independent bits (one of which was never used in heap pages anyway,
or at least hadn't been in a very long time).  This gives us flexibility to
add the HOT notions of redirected and dead item pointers without requiring
anything so klugy as magic values of lp_off and lp_len.  The state values
are chosen so that for the states currently in use (pre-HOT) there is no
change in the physical representation.
2007-09-12 22:10:26 +00:00
..
btreefuncs.c Redefine the lp_flags field of item pointers as having four states, rather 2007-09-12 22:10:26 +00:00
heapfuncs.c Redefine the lp_flags field of item pointers as having four states, rather 2007-09-12 22:10:26 +00:00
Makefile
pageinspect.sql.in Code review for btreefuncs additions: restrict to superusers to avoid 2007-08-26 23:22:49 +00:00
rawpage.c
README.pageinspect Code review for btreefuncs additions: restrict to superusers to avoid 2007-08-26 23:22:49 +00:00
uninstall_pageinspect.sql Code review for btreefuncs additions: restrict to superusers to avoid 2007-08-26 23:22:49 +00:00

The functions in this module allow you to inspect the contents of data pages
at a low level, for debugging purposes.  All of these functions may be used
only by superusers.

1. Installation

    $ make
    $ make install
    $ psql -e -f /usr/local/pgsql/share/contrib/pageinspect.sql test

2. Functions included:

    get_raw_page
    ------------
    get_raw_page reads one block of the named table and returns a copy as a
    bytea field. This allows a single time-consistent copy of the block to be
    made.

    page_header
    -----------
    page_header shows fields which are common to all PostgreSQL heap and index
    pages.

    A page image obtained with get_raw_page should be passed as argument:

        test=# SELECT * FROM page_header(get_raw_page('pg_class',0));
           lsn    | tli | flags | lower | upper | special | pagesize | version
        ----------+-----+-------+-------+-------+---------+----------+---------
         0/3C5614 |   1 |     1 |   216 |   256 |    8192 |     8192 |       4
        (1 row)

    The returned columns correspond to the fields in the PageHeaderData-struct,
    see src/include/storage/bufpage.h for more details.

    heap_page_items
    ---------------
    heap_page_items shows all line pointers on a heap page.  For those line
    pointers that are in use, tuple headers are also shown. All tuples are
    shown, whether or not the tuples were visible to an MVCC snapshot at the
    time the raw page was copied.

    A heap page image obtained with get_raw_page should be passed as argument:

        test=# SELECT * FROM heap_page_items(get_raw_page('pg_class',0));

    See src/include/storage/itemid.h and src/include/access/htup.h for
    explanations of the fields returned.

    bt_metap
    --------
    bt_metap() returns information about a btree index's metapage:

        test=> SELECT * FROM bt_metap('pg_cast_oid_index');
        -[ RECORD 1 ]-----
        magic     | 340322
        version   | 2
        root      | 1
        level     | 0
        fastroot  | 1
        fastlevel | 0

    bt_page_stats
    -------------
    bt_page_stats() shows information about single btree pages:

        test=> SELECT * FROM bt_page_stats('pg_cast_oid_index', 1);
        -[ RECORD 1 ]-+-----
        blkno         | 1
        type          | l
        live_items    | 256
        dead_items    | 0
        avg_item_size | 12
        page_size     | 8192
        free_size     | 4056
        btpo_prev     | 0
        btpo_next     | 0
        btpo          | 0
        btpo_flags    | 3

    bt_page_items
    -------------
    bt_page_items() returns information about specific items on btree pages:

        test=> SELECT * FROM bt_page_items('pg_cast_oid_index', 1);
         itemoffset |  ctid   | itemlen | nulls | vars |    data
        ------------+---------+---------+-------+------+-------------
                  1 | (0,1)   |      12 | f     | f    | 23 27 00 00
                  2 | (0,2)   |      12 | f     | f    | 24 27 00 00
                  3 | (0,3)   |      12 | f     | f    | 25 27 00 00
                  4 | (0,4)   |      12 | f     | f    | 26 27 00 00
                  5 | (0,5)   |      12 | f     | f    | 27 27 00 00
                  6 | (0,6)   |      12 | f     | f    | 28 27 00 00
                  7 | (0,7)   |      12 | f     | f    | 29 27 00 00
                  8 | (0,8)   |      12 | f     | f    | 2a 27 00 00