mirror of
https://github.com/postgres/postgres.git
synced 2025-06-05 23:56:58 +03:00
pageinspect: Add tests
This commit is contained in:
parent
3a47c704fb
commit
adfb81d9e1
4
contrib/pageinspect/.gitignore
vendored
Normal file
4
contrib/pageinspect/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# Generated subdirectories
|
||||||
|
/log/
|
||||||
|
/results/
|
||||||
|
/tmp_check/
|
@ -11,6 +11,8 @@ DATA = pageinspect--1.5.sql pageinspect--1.4--1.5.sql \
|
|||||||
pageinspect--unpackaged--1.0.sql
|
pageinspect--unpackaged--1.0.sql
|
||||||
PGFILEDESC = "pageinspect - functions to inspect contents of database pages"
|
PGFILEDESC = "pageinspect - functions to inspect contents of database pages"
|
||||||
|
|
||||||
|
REGRESS = page btree brin gin
|
||||||
|
|
||||||
ifdef USE_PGXS
|
ifdef USE_PGXS
|
||||||
PG_CONFIG = pg_config
|
PG_CONFIG = pg_config
|
||||||
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
||||||
|
51
contrib/pageinspect/expected/brin.out
Normal file
51
contrib/pageinspect/expected/brin.out
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
CREATE TABLE test1 (a int, b text);
|
||||||
|
INSERT INTO test1 VALUES (1, 'one');
|
||||||
|
CREATE INDEX test1_a_idx ON test1 USING brin (a);
|
||||||
|
SELECT brin_page_type(get_raw_page('test1_a_idx', 0));
|
||||||
|
brin_page_type
|
||||||
|
----------------
|
||||||
|
meta
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT brin_page_type(get_raw_page('test1_a_idx', 1));
|
||||||
|
brin_page_type
|
||||||
|
----------------
|
||||||
|
revmap
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT brin_page_type(get_raw_page('test1_a_idx', 2));
|
||||||
|
brin_page_type
|
||||||
|
----------------
|
||||||
|
regular
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT * FROM brin_metapage_info(get_raw_page('test1_a_idx', 0));
|
||||||
|
magic | version | pagesperrange | lastrevmappage
|
||||||
|
------------+---------+---------------+----------------
|
||||||
|
0xA8109CFA | 1 | 128 | 1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT * FROM brin_metapage_info(get_raw_page('test1_a_idx', 1));
|
||||||
|
ERROR: page is not a BRIN page of type "metapage"
|
||||||
|
DETAIL: Expected special type 0000f091, got 0000f092.
|
||||||
|
SELECT * FROM brin_revmap_data(get_raw_page('test1_a_idx', 0)) LIMIT 5;
|
||||||
|
ERROR: page is not a BRIN page of type "revmap"
|
||||||
|
DETAIL: Expected special type 0000f092, got 0000f091.
|
||||||
|
SELECT * FROM brin_revmap_data(get_raw_page('test1_a_idx', 1)) LIMIT 5;
|
||||||
|
pages
|
||||||
|
-------
|
||||||
|
(2,1)
|
||||||
|
(0,0)
|
||||||
|
(0,0)
|
||||||
|
(0,0)
|
||||||
|
(0,0)
|
||||||
|
(5 rows)
|
||||||
|
|
||||||
|
SELECT * FROM brin_page_items(get_raw_page('test1_a_idx', 2), 'test1_a_idx')
|
||||||
|
ORDER BY blknum, attnum LIMIT 5;
|
||||||
|
itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | value
|
||||||
|
------------+--------+--------+----------+----------+-------------+----------
|
||||||
|
1 | 0 | 1 | f | f | f | {1 .. 1}
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
DROP TABLE test1;
|
45
contrib/pageinspect/expected/btree.out
Normal file
45
contrib/pageinspect/expected/btree.out
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
CREATE TABLE test1 (a int, b text);
|
||||||
|
INSERT INTO test1 VALUES (1, 'one');
|
||||||
|
CREATE INDEX test1_a_idx ON test1 USING btree (a);
|
||||||
|
\x
|
||||||
|
SELECT * FROM bt_metap('test1_a_idx');
|
||||||
|
-[ RECORD 1 ]-----
|
||||||
|
magic | 340322
|
||||||
|
version | 2
|
||||||
|
root | 1
|
||||||
|
level | 0
|
||||||
|
fastroot | 1
|
||||||
|
fastlevel | 0
|
||||||
|
|
||||||
|
SELECT * FROM bt_page_stats('test1_a_idx', 0);
|
||||||
|
ERROR: block 0 is a meta page
|
||||||
|
SELECT * FROM bt_page_stats('test1_a_idx', 1);
|
||||||
|
-[ RECORD 1 ]-+-----
|
||||||
|
blkno | 1
|
||||||
|
type | l
|
||||||
|
live_items | 1
|
||||||
|
dead_items | 0
|
||||||
|
avg_item_size | 16
|
||||||
|
page_size | 8192
|
||||||
|
free_size | 8128
|
||||||
|
btpo_prev | 0
|
||||||
|
btpo_next | 0
|
||||||
|
btpo | 0
|
||||||
|
btpo_flags | 3
|
||||||
|
|
||||||
|
SELECT * FROM bt_page_stats('test1_a_idx', 2);
|
||||||
|
ERROR: block number out of range
|
||||||
|
SELECT * FROM bt_page_items('test1_a_idx', 0);
|
||||||
|
ERROR: block 0 is a meta page
|
||||||
|
SELECT * FROM bt_page_items('test1_a_idx', 1);
|
||||||
|
-[ RECORD 1 ]-----------------------
|
||||||
|
itemoffset | 1
|
||||||
|
ctid | (0,1)
|
||||||
|
itemlen | 16
|
||||||
|
nulls | f
|
||||||
|
vars | f
|
||||||
|
data | 01 00 00 00 00 00 00 00
|
||||||
|
|
||||||
|
SELECT * FROM bt_page_items('test1_a_idx', 2);
|
||||||
|
ERROR: block number out of range
|
||||||
|
DROP TABLE test1;
|
30
contrib/pageinspect/expected/gin.out
Normal file
30
contrib/pageinspect/expected/gin.out
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
CREATE TABLE test1 (x int, y int[]);
|
||||||
|
INSERT INTO test1 VALUES (1, ARRAY[11, 111]);
|
||||||
|
CREATE INDEX test1_y_idx ON test1 USING gin (y);
|
||||||
|
\x
|
||||||
|
SELECT * FROM gin_metapage_info(get_raw_page('test1_y_idx', 0));
|
||||||
|
-[ RECORD 1 ]----+-----------
|
||||||
|
pending_head | 4294967295
|
||||||
|
pending_tail | 4294967295
|
||||||
|
tail_free_size | 0
|
||||||
|
n_pending_pages | 0
|
||||||
|
n_pending_tuples | 0
|
||||||
|
n_total_pages | 2
|
||||||
|
n_entry_pages | 1
|
||||||
|
n_data_pages | 0
|
||||||
|
n_entries | 2
|
||||||
|
version | 2
|
||||||
|
|
||||||
|
SELECT * FROM gin_metapage_info(get_raw_page('test1_y_idx', 1));
|
||||||
|
ERROR: input page is not a GIN metapage
|
||||||
|
DETAIL: Flags 0002, expected 0008
|
||||||
|
SELECT * FROM gin_page_opaque_info(get_raw_page('test1_y_idx', 1));
|
||||||
|
-[ RECORD 1 ]---------
|
||||||
|
rightlink | 4294967295
|
||||||
|
maxoff | 0
|
||||||
|
flags | {leaf}
|
||||||
|
|
||||||
|
SELECT * FROM gin_leafpage_items(get_raw_page('test1_y_idx', 1));
|
||||||
|
ERROR: input page is not a compressed GIN data leaf page
|
||||||
|
DETAIL: Flags 0002, expected 0083
|
||||||
|
DROP TABLE test1;
|
73
contrib/pageinspect/expected/page.out
Normal file
73
contrib/pageinspect/expected/page.out
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
CREATE EXTENSION pageinspect;
|
||||||
|
CREATE TABLE test1 (a int, b text);
|
||||||
|
INSERT INTO test1 VALUES (1, 'one');
|
||||||
|
VACUUM test1; -- set up FSM
|
||||||
|
-- The page contents can vary, so just test that it can be read
|
||||||
|
-- successfully, but don't keep the output.
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'main', 0)) AS main_0;
|
||||||
|
main_0
|
||||||
|
--------
|
||||||
|
8192
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'main', 1)) AS main_1;
|
||||||
|
ERROR: block number 1 is out of range for relation "test1"
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'fsm', 0)) AS fsm_0;
|
||||||
|
fsm_0
|
||||||
|
-------
|
||||||
|
8192
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'fsm', 1)) AS fsm_1;
|
||||||
|
fsm_1
|
||||||
|
-------
|
||||||
|
8192
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'vm', 0)) AS vm_0;
|
||||||
|
vm_0
|
||||||
|
------
|
||||||
|
8192
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'vm', 1)) AS vm_1;
|
||||||
|
ERROR: block number 1 is out of range for relation "test1"
|
||||||
|
SELECT octet_length(get_raw_page('xxx', 'main', 0));
|
||||||
|
ERROR: relation "xxx" does not exist
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'xxx', 0));
|
||||||
|
ERROR: invalid fork name
|
||||||
|
HINT: Valid fork names are "main", "fsm", "vm", and "init".
|
||||||
|
SELECT get_raw_page('test1', 0) = get_raw_page('test1', 'main', 0);
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT tuple_data_split('test1'::regclass, t_data, t_infomask, t_infomask2, t_bits)
|
||||||
|
FROM heap_page_items(get_raw_page('test1', 0));
|
||||||
|
tuple_data_split
|
||||||
|
-------------------------------
|
||||||
|
{"\\x01000000","\\x096f6e65"}
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
|
||||||
|
fsm_page_contents
|
||||||
|
-------------------
|
||||||
|
0: 254 +
|
||||||
|
1: 254 +
|
||||||
|
3: 254 +
|
||||||
|
7: 254 +
|
||||||
|
15: 254 +
|
||||||
|
31: 254 +
|
||||||
|
63: 254 +
|
||||||
|
127: 254 +
|
||||||
|
255: 254 +
|
||||||
|
511: 254 +
|
||||||
|
1023: 254 +
|
||||||
|
2047: 254 +
|
||||||
|
4095: 254 +
|
||||||
|
fp_next_slot: 0 +
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
DROP TABLE test1;
|
18
contrib/pageinspect/sql/brin.sql
Normal file
18
contrib/pageinspect/sql/brin.sql
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
CREATE TABLE test1 (a int, b text);
|
||||||
|
INSERT INTO test1 VALUES (1, 'one');
|
||||||
|
CREATE INDEX test1_a_idx ON test1 USING brin (a);
|
||||||
|
|
||||||
|
SELECT brin_page_type(get_raw_page('test1_a_idx', 0));
|
||||||
|
SELECT brin_page_type(get_raw_page('test1_a_idx', 1));
|
||||||
|
SELECT brin_page_type(get_raw_page('test1_a_idx', 2));
|
||||||
|
|
||||||
|
SELECT * FROM brin_metapage_info(get_raw_page('test1_a_idx', 0));
|
||||||
|
SELECT * FROM brin_metapage_info(get_raw_page('test1_a_idx', 1));
|
||||||
|
|
||||||
|
SELECT * FROM brin_revmap_data(get_raw_page('test1_a_idx', 0)) LIMIT 5;
|
||||||
|
SELECT * FROM brin_revmap_data(get_raw_page('test1_a_idx', 1)) LIMIT 5;
|
||||||
|
|
||||||
|
SELECT * FROM brin_page_items(get_raw_page('test1_a_idx', 2), 'test1_a_idx')
|
||||||
|
ORDER BY blknum, attnum LIMIT 5;
|
||||||
|
|
||||||
|
DROP TABLE test1;
|
17
contrib/pageinspect/sql/btree.sql
Normal file
17
contrib/pageinspect/sql/btree.sql
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
CREATE TABLE test1 (a int, b text);
|
||||||
|
INSERT INTO test1 VALUES (1, 'one');
|
||||||
|
CREATE INDEX test1_a_idx ON test1 USING btree (a);
|
||||||
|
|
||||||
|
\x
|
||||||
|
|
||||||
|
SELECT * FROM bt_metap('test1_a_idx');
|
||||||
|
|
||||||
|
SELECT * FROM bt_page_stats('test1_a_idx', 0);
|
||||||
|
SELECT * FROM bt_page_stats('test1_a_idx', 1);
|
||||||
|
SELECT * FROM bt_page_stats('test1_a_idx', 2);
|
||||||
|
|
||||||
|
SELECT * FROM bt_page_items('test1_a_idx', 0);
|
||||||
|
SELECT * FROM bt_page_items('test1_a_idx', 1);
|
||||||
|
SELECT * FROM bt_page_items('test1_a_idx', 2);
|
||||||
|
|
||||||
|
DROP TABLE test1;
|
14
contrib/pageinspect/sql/gin.sql
Normal file
14
contrib/pageinspect/sql/gin.sql
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
CREATE TABLE test1 (x int, y int[]);
|
||||||
|
INSERT INTO test1 VALUES (1, ARRAY[11, 111]);
|
||||||
|
CREATE INDEX test1_y_idx ON test1 USING gin (y);
|
||||||
|
|
||||||
|
\x
|
||||||
|
|
||||||
|
SELECT * FROM gin_metapage_info(get_raw_page('test1_y_idx', 0));
|
||||||
|
SELECT * FROM gin_metapage_info(get_raw_page('test1_y_idx', 1));
|
||||||
|
|
||||||
|
SELECT * FROM gin_page_opaque_info(get_raw_page('test1_y_idx', 1));
|
||||||
|
|
||||||
|
SELECT * FROM gin_leafpage_items(get_raw_page('test1_y_idx', 1));
|
||||||
|
|
||||||
|
DROP TABLE test1;
|
30
contrib/pageinspect/sql/page.sql
Normal file
30
contrib/pageinspect/sql/page.sql
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
CREATE EXTENSION pageinspect;
|
||||||
|
|
||||||
|
CREATE TABLE test1 (a int, b text);
|
||||||
|
INSERT INTO test1 VALUES (1, 'one');
|
||||||
|
|
||||||
|
VACUUM test1; -- set up FSM
|
||||||
|
|
||||||
|
-- The page contents can vary, so just test that it can be read
|
||||||
|
-- successfully, but don't keep the output.
|
||||||
|
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'main', 0)) AS main_0;
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'main', 1)) AS main_1;
|
||||||
|
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'fsm', 0)) AS fsm_0;
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'fsm', 1)) AS fsm_1;
|
||||||
|
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'vm', 0)) AS vm_0;
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'vm', 1)) AS vm_1;
|
||||||
|
|
||||||
|
SELECT octet_length(get_raw_page('xxx', 'main', 0));
|
||||||
|
SELECT octet_length(get_raw_page('test1', 'xxx', 0));
|
||||||
|
|
||||||
|
SELECT get_raw_page('test1', 0) = get_raw_page('test1', 'main', 0);
|
||||||
|
|
||||||
|
SELECT tuple_data_split('test1'::regclass, t_data, t_infomask, t_infomask2, t_bits)
|
||||||
|
FROM heap_page_items(get_raw_page('test1', 0));
|
||||||
|
|
||||||
|
SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
|
||||||
|
|
||||||
|
DROP TABLE test1;
|
Loading…
x
Reference in New Issue
Block a user