Skip to content

Commit adfb81d

Browse files
committed
pageinspect: Add tests
1 parent 3a47c70 commit adfb81d

File tree

10 files changed

+284
-0
lines changed

10 files changed

+284
-0
lines changed

contrib/pageinspect/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Generated subdirectories
2+
/log/
3+
/results/
4+
/tmp_check/

contrib/pageinspect/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ DATA = pageinspect--1.5.sql pageinspect--1.4--1.5.sql \
1111
pageinspect--unpackaged--1.0.sql
1212
PGFILEDESC = "pageinspect - functions to inspect contents of database pages"
1313

14+
REGRESS = page btree brin gin
15+
1416
ifdef USE_PGXS
1517
PG_CONFIG = pg_config
1618
PGXS := $(shell $(PG_CONFIG) --pgxs)

contrib/pageinspect/expected/brin.out

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
CREATE TABLE test1 (a int, b text);
2+
INSERT INTO test1 VALUES (1, 'one');
3+
CREATE INDEX test1_a_idx ON test1 USING brin (a);
4+
SELECT brin_page_type(get_raw_page('test1_a_idx', 0));
5+
brin_page_type
6+
----------------
7+
meta
8+
(1 row)
9+
10+
SELECT brin_page_type(get_raw_page('test1_a_idx', 1));
11+
brin_page_type
12+
----------------
13+
revmap
14+
(1 row)
15+
16+
SELECT brin_page_type(get_raw_page('test1_a_idx', 2));
17+
brin_page_type
18+
----------------
19+
regular
20+
(1 row)
21+
22+
SELECT * FROM brin_metapage_info(get_raw_page('test1_a_idx', 0));
23+
magic | version | pagesperrange | lastrevmappage
24+
------------+---------+---------------+----------------
25+
0xA8109CFA | 1 | 128 | 1
26+
(1 row)
27+
28+
SELECT * FROM brin_metapage_info(get_raw_page('test1_a_idx', 1));
29+
ERROR: page is not a BRIN page of type "metapage"
30+
DETAIL: Expected special type 0000f091, got 0000f092.
31+
SELECT * FROM brin_revmap_data(get_raw_page('test1_a_idx', 0)) LIMIT 5;
32+
ERROR: page is not a BRIN page of type "revmap"
33+
DETAIL: Expected special type 0000f092, got 0000f091.
34+
SELECT * FROM brin_revmap_data(get_raw_page('test1_a_idx', 1)) LIMIT 5;
35+
pages
36+
-------
37+
(2,1)
38+
(0,0)
39+
(0,0)
40+
(0,0)
41+
(0,0)
42+
(5 rows)
43+
44+
SELECT * FROM brin_page_items(get_raw_page('test1_a_idx', 2), 'test1_a_idx')
45+
ORDER BY blknum, attnum LIMIT 5;
46+
itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | value
47+
------------+--------+--------+----------+----------+-------------+----------
48+
1 | 0 | 1 | f | f | f | {1 .. 1}
49+
(1 row)
50+
51+
DROP TABLE test1;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
CREATE TABLE test1 (a int, b text);
2+
INSERT INTO test1 VALUES (1, 'one');
3+
CREATE INDEX test1_a_idx ON test1 USING btree (a);
4+
\x
5+
SELECT * FROM bt_metap('test1_a_idx');
6+
-[ RECORD 1 ]-----
7+
magic | 340322
8+
version | 2
9+
root | 1
10+
level | 0
11+
fastroot | 1
12+
fastlevel | 0
13+
14+
SELECT * FROM bt_page_stats('test1_a_idx', 0);
15+
ERROR: block 0 is a meta page
16+
SELECT * FROM bt_page_stats('test1_a_idx', 1);
17+
-[ RECORD 1 ]-+-----
18+
blkno | 1
19+
type | l
20+
live_items | 1
21+
dead_items | 0
22+
avg_item_size | 16
23+
page_size | 8192
24+
free_size | 8128
25+
btpo_prev | 0
26+
btpo_next | 0
27+
btpo | 0
28+
btpo_flags | 3
29+
30+
SELECT * FROM bt_page_stats('test1_a_idx', 2);
31+
ERROR: block number out of range
32+
SELECT * FROM bt_page_items('test1_a_idx', 0);
33+
ERROR: block 0 is a meta page
34+
SELECT * FROM bt_page_items('test1_a_idx', 1);
35+
-[ RECORD 1 ]-----------------------
36+
itemoffset | 1
37+
ctid | (0,1)
38+
itemlen | 16
39+
nulls | f
40+
vars | f
41+
data | 01 00 00 00 00 00 00 00
42+
43+
SELECT * FROM bt_page_items('test1_a_idx', 2);
44+
ERROR: block number out of range
45+
DROP TABLE test1;

contrib/pageinspect/expected/gin.out

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
CREATE TABLE test1 (x int, y int[]);
2+
INSERT INTO test1 VALUES (1, ARRAY[11, 111]);
3+
CREATE INDEX test1_y_idx ON test1 USING gin (y);
4+
\x
5+
SELECT * FROM gin_metapage_info(get_raw_page('test1_y_idx', 0));
6+
-[ RECORD 1 ]----+-----------
7+
pending_head | 4294967295
8+
pending_tail | 4294967295
9+
tail_free_size | 0
10+
n_pending_pages | 0
11+
n_pending_tuples | 0
12+
n_total_pages | 2
13+
n_entry_pages | 1
14+
n_data_pages | 0
15+
n_entries | 2
16+
version | 2
17+
18+
SELECT * FROM gin_metapage_info(get_raw_page('test1_y_idx', 1));
19+
ERROR: input page is not a GIN metapage
20+
DETAIL: Flags 0002, expected 0008
21+
SELECT * FROM gin_page_opaque_info(get_raw_page('test1_y_idx', 1));
22+
-[ RECORD 1 ]---------
23+
rightlink | 4294967295
24+
maxoff | 0
25+
flags | {leaf}
26+
27+
SELECT * FROM gin_leafpage_items(get_raw_page('test1_y_idx', 1));
28+
ERROR: input page is not a compressed GIN data leaf page
29+
DETAIL: Flags 0002, expected 0083
30+
DROP TABLE test1;

contrib/pageinspect/expected/page.out

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
CREATE EXTENSION pageinspect;
2+
CREATE TABLE test1 (a int, b text);
3+
INSERT INTO test1 VALUES (1, 'one');
4+
VACUUM test1; -- set up FSM
5+
-- The page contents can vary, so just test that it can be read
6+
-- successfully, but don't keep the output.
7+
SELECT octet_length(get_raw_page('test1', 'main', 0)) AS main_0;
8+
main_0
9+
--------
10+
8192
11+
(1 row)
12+
13+
SELECT octet_length(get_raw_page('test1', 'main', 1)) AS main_1;
14+
ERROR: block number 1 is out of range for relation "test1"
15+
SELECT octet_length(get_raw_page('test1', 'fsm', 0)) AS fsm_0;
16+
fsm_0
17+
-------
18+
8192
19+
(1 row)
20+
21+
SELECT octet_length(get_raw_page('test1', 'fsm', 1)) AS fsm_1;
22+
fsm_1
23+
-------
24+
8192
25+
(1 row)
26+
27+
SELECT octet_length(get_raw_page('test1', 'vm', 0)) AS vm_0;
28+
vm_0
29+
------
30+
8192
31+
(1 row)
32+
33+
SELECT octet_length(get_raw_page('test1', 'vm', 1)) AS vm_1;
34+
ERROR: block number 1 is out of range for relation "test1"
35+
SELECT octet_length(get_raw_page('xxx', 'main', 0));
36+
ERROR: relation "xxx" does not exist
37+
SELECT octet_length(get_raw_page('test1', 'xxx', 0));
38+
ERROR: invalid fork name
39+
HINT: Valid fork names are "main", "fsm", "vm", and "init".
40+
SELECT get_raw_page('test1', 0) = get_raw_page('test1', 'main', 0);
41+
?column?
42+
----------
43+
t
44+
(1 row)
45+
46+
SELECT tuple_data_split('test1'::regclass, t_data, t_infomask, t_infomask2, t_bits)
47+
FROM heap_page_items(get_raw_page('test1', 0));
48+
tuple_data_split
49+
-------------------------------
50+
{"\\x01000000","\\x096f6e65"}
51+
(1 row)
52+
53+
SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
54+
fsm_page_contents
55+
-------------------
56+
0: 254 +
57+
1: 254 +
58+
3: 254 +
59+
7: 254 +
60+
15: 254 +
61+
31: 254 +
62+
63: 254 +
63+
127: 254 +
64+
255: 254 +
65+
511: 254 +
66+
1023: 254 +
67+
2047: 254 +
68+
4095: 254 +
69+
fp_next_slot: 0 +
70+
71+
(1 row)
72+
73+
DROP TABLE test1;

contrib/pageinspect/sql/brin.sql

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
CREATE TABLE test1 (a int, b text);
2+
INSERT INTO test1 VALUES (1, 'one');
3+
CREATE INDEX test1_a_idx ON test1 USING brin (a);
4+
5+
SELECT brin_page_type(get_raw_page('test1_a_idx', 0));
6+
SELECT brin_page_type(get_raw_page('test1_a_idx', 1));
7+
SELECT brin_page_type(get_raw_page('test1_a_idx', 2));
8+
9+
SELECT * FROM brin_metapage_info(get_raw_page('test1_a_idx', 0));
10+
SELECT * FROM brin_metapage_info(get_raw_page('test1_a_idx', 1));
11+
12+
SELECT * FROM brin_revmap_data(get_raw_page('test1_a_idx', 0)) LIMIT 5;
13+
SELECT * FROM brin_revmap_data(get_raw_page('test1_a_idx', 1)) LIMIT 5;
14+
15+
SELECT * FROM brin_page_items(get_raw_page('test1_a_idx', 2), 'test1_a_idx')
16+
ORDER BY blknum, attnum LIMIT 5;
17+
18+
DROP TABLE test1;

contrib/pageinspect/sql/btree.sql

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
CREATE TABLE test1 (a int, b text);
2+
INSERT INTO test1 VALUES (1, 'one');
3+
CREATE INDEX test1_a_idx ON test1 USING btree (a);
4+
5+
\x
6+
7+
SELECT * FROM bt_metap('test1_a_idx');
8+
9+
SELECT * FROM bt_page_stats('test1_a_idx', 0);
10+
SELECT * FROM bt_page_stats('test1_a_idx', 1);
11+
SELECT * FROM bt_page_stats('test1_a_idx', 2);
12+
13+
SELECT * FROM bt_page_items('test1_a_idx', 0);
14+
SELECT * FROM bt_page_items('test1_a_idx', 1);
15+
SELECT * FROM bt_page_items('test1_a_idx', 2);
16+
17+
DROP TABLE test1;

contrib/pageinspect/sql/gin.sql

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
CREATE TABLE test1 (x int, y int[]);
2+
INSERT INTO test1 VALUES (1, ARRAY[11, 111]);
3+
CREATE INDEX test1_y_idx ON test1 USING gin (y);
4+
5+
\x
6+
7+
SELECT * FROM gin_metapage_info(get_raw_page('test1_y_idx', 0));
8+
SELECT * FROM gin_metapage_info(get_raw_page('test1_y_idx', 1));
9+
10+
SELECT * FROM gin_page_opaque_info(get_raw_page('test1_y_idx', 1));
11+
12+
SELECT * FROM gin_leafpage_items(get_raw_page('test1_y_idx', 1));
13+
14+
DROP TABLE test1;

contrib/pageinspect/sql/page.sql

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
CREATE EXTENSION pageinspect;
2+
3+
CREATE TABLE test1 (a int, b text);
4+
INSERT INTO test1 VALUES (1, 'one');
5+
6+
VACUUM test1; -- set up FSM
7+
8+
-- The page contents can vary, so just test that it can be read
9+
-- successfully, but don't keep the output.
10+
11+
SELECT octet_length(get_raw_page('test1', 'main', 0)) AS main_0;
12+
SELECT octet_length(get_raw_page('test1', 'main', 1)) AS main_1;
13+
14+
SELECT octet_length(get_raw_page('test1', 'fsm', 0)) AS fsm_0;
15+
SELECT octet_length(get_raw_page('test1', 'fsm', 1)) AS fsm_1;
16+
17+
SELECT octet_length(get_raw_page('test1', 'vm', 0)) AS vm_0;
18+
SELECT octet_length(get_raw_page('test1', 'vm', 1)) AS vm_1;
19+
20+
SELECT octet_length(get_raw_page('xxx', 'main', 0));
21+
SELECT octet_length(get_raw_page('test1', 'xxx', 0));
22+
23+
SELECT get_raw_page('test1', 0) = get_raw_page('test1', 'main', 0);
24+
25+
SELECT tuple_data_split('test1'::regclass, t_data, t_infomask, t_infomask2, t_bits)
26+
FROM heap_page_items(get_raw_page('test1', 0));
27+
28+
SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
29+
30+
DROP TABLE test1;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy