diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index 000dcd8f5d..a781f26551 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -201,8 +201,8 @@ brin_page_items(PG_FUNCTION_ARGS) dtup = NULL; for (;;) { - Datum values[7]; - bool nulls[7] = {0}; + Datum values[8]; + bool nulls[8] = {0}; /* * This loop is called once for every attribute of every tuple in the @@ -239,6 +239,7 @@ brin_page_items(PG_FUNCTION_ARGS) nulls[4] = true; nulls[5] = true; nulls[6] = true; + nulls[7] = true; } else { @@ -261,6 +262,7 @@ brin_page_items(PG_FUNCTION_ARGS) values[3] = BoolGetDatum(dtup->bt_columns[att].bv_allnulls); values[4] = BoolGetDatum(dtup->bt_columns[att].bv_hasnulls); values[5] = BoolGetDatum(dtup->bt_placeholder); + values[6] = BoolGetDatum(dtup->bt_empty_range); if (!dtup->bt_columns[att].bv_allnulls) { BrinValues *bvalues = &dtup->bt_columns[att]; @@ -286,12 +288,12 @@ brin_page_items(PG_FUNCTION_ARGS) } appendStringInfoChar(&s, '}'); - values[6] = CStringGetTextDatum(s.data); + values[7] = CStringGetTextDatum(s.data); pfree(s.data); } else { - nulls[6] = true; + nulls[7] = true; } } diff --git a/contrib/pageinspect/expected/brin.out b/contrib/pageinspect/expected/brin.out index e12fbeb477..098ddc202f 100644 --- a/contrib/pageinspect/expected/brin.out +++ b/contrib/pageinspect/expected/brin.out @@ -43,9 +43,9 @@ 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; - itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | value -------------+--------+--------+----------+----------+-------------+---------- - 1 | 0 | 1 | f | f | f | {1 .. 1} + itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | empty | value +------------+--------+--------+----------+----------+-------------+-------+---------- + 1 | 0 | 1 | f | f | f | f | {1 .. 1} (1 row) -- Mask DETAIL messages as these are not portable across architectures. diff --git a/contrib/pageinspect/pageinspect--1.11--1.12.sql b/contrib/pageinspect/pageinspect--1.11--1.12.sql index 70c3abccf5..a20d67a9e8 100644 --- a/contrib/pageinspect/pageinspect--1.11--1.12.sql +++ b/contrib/pageinspect/pageinspect--1.11--1.12.sql @@ -21,3 +21,20 @@ CREATE FUNCTION bt_multi_page_stats(IN relname text, IN blkno int8, IN blk_count RETURNS SETOF record AS 'MODULE_PATHNAME', 'bt_multi_page_stats' LANGUAGE C STRICT PARALLEL RESTRICTED; + +-- +-- add information about BRIN empty ranges +-- +DROP FUNCTION brin_page_items(IN page bytea, IN index_oid regclass); +CREATE FUNCTION brin_page_items(IN page bytea, IN index_oid regclass, + OUT itemoffset int, + OUT blknum int8, + OUT attnum int, + OUT allnulls bool, + OUT hasnulls bool, + OUT placeholder bool, + OUT empty bool, + OUT value text) +RETURNS SETOF record +AS 'MODULE_PATHNAME', 'brin_page_items' +LANGUAGE C STRICT PARALLEL RESTRICTED; diff --git a/doc/src/sgml/pageinspect.sgml b/doc/src/sgml/pageinspect.sgml index 01f1e96204..e4225ecd48 100644 --- a/doc/src/sgml/pageinspect.sgml +++ b/doc/src/sgml/pageinspect.sgml @@ -613,14 +613,14 @@ test=# SELECT * FROM brin_revmap_data(get_raw_page('brinidx', 2)) LIMIT 5; test=# SELECT * FROM brin_page_items(get_raw_page('brinidx', 5), 'brinidx') ORDER BY blknum, attnum LIMIT 6; - itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | value -------------+--------+--------+----------+----------+-------------+-------------- - 137 | 0 | 1 | t | f | f | - 137 | 0 | 2 | f | f | f | {1 .. 88} - 138 | 4 | 1 | t | f | f | - 138 | 4 | 2 | f | f | f | {89 .. 176} - 139 | 8 | 1 | t | f | f | - 139 | 8 | 2 | f | f | f | {177 .. 264} + itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | empty | value +------------+--------+--------+----------+----------+-------------+-------+-------------- + 137 | 0 | 1 | t | f | f | f | + 137 | 0 | 2 | f | f | f | f | {1 .. 88} + 138 | 4 | 1 | t | f | f | f | + 138 | 4 | 2 | f | f | f | f | {89 .. 176} + 139 | 8 | 1 | t | f | f | f | + 139 | 8 | 2 | f | f | f | f | {177 .. 264} The returned columns correspond to the fields in the BrinMemTuple and BrinValues structs. diff --git a/src/test/modules/brin/expected/summarization-and-inprogress-insertion.out b/src/test/modules/brin/expected/summarization-and-inprogress-insertion.out index 584ac2602f..201786c82c 100644 --- a/src/test/modules/brin/expected/summarization-and-inprogress-insertion.out +++ b/src/test/modules/brin/expected/summarization-and-inprogress-insertion.out @@ -2,9 +2,9 @@ Parsed test spec with 2 sessions starting permutation: s2check s1b s2b s1i s2summ s1c s2c s2check step s2check: SELECT * FROM brin_page_items(get_raw_page('brinidx', 2), 'brinidx'::regclass); -itemoffset|blknum|attnum|allnulls|hasnulls|placeholder|value -----------+------+------+--------+--------+-----------+-------- - 1| 0| 1|f |t |f |{1 .. 1} +itemoffset|blknum|attnum|allnulls|hasnulls|placeholder|empty|value +----------+------+------+--------+--------+-----------+-----+-------- + 1| 0| 1|f |t |f |f |{1 .. 1} (1 row) step s1b: BEGIN ISOLATION LEVEL REPEATABLE READ; @@ -24,18 +24,18 @@ brin_summarize_new_values step s1c: COMMIT; step s2c: COMMIT; step s2check: SELECT * FROM brin_page_items(get_raw_page('brinidx', 2), 'brinidx'::regclass); -itemoffset|blknum|attnum|allnulls|hasnulls|placeholder|value -----------+------+------+--------+--------+-----------+----------- - 1| 0| 1|f |t |f |{1 .. 1} - 2| 1| 1|f |f |f |{1 .. 1000} +itemoffset|blknum|attnum|allnulls|hasnulls|placeholder|empty|value +----------+------+------+--------+--------+-----------+-----+----------- + 1| 0| 1|f |t |f |f |{1 .. 1} + 2| 1| 1|f |f |f |f |{1 .. 1000} (2 rows) starting permutation: s2check s1b s1i s2vacuum s1c s2check step s2check: SELECT * FROM brin_page_items(get_raw_page('brinidx', 2), 'brinidx'::regclass); -itemoffset|blknum|attnum|allnulls|hasnulls|placeholder|value -----------+------+------+--------+--------+-----------+-------- - 1| 0| 1|f |t |f |{1 .. 1} +itemoffset|blknum|attnum|allnulls|hasnulls|placeholder|empty|value +----------+------+------+--------+--------+-----------+-----+-------- + 1| 0| 1|f |t |f |f |{1 .. 1} (1 row) step s1b: BEGIN ISOLATION LEVEL REPEATABLE READ; @@ -43,9 +43,9 @@ step s1i: INSERT INTO brin_iso VALUES (1000); step s2vacuum: VACUUM brin_iso; step s1c: COMMIT; step s2check: SELECT * FROM brin_page_items(get_raw_page('brinidx', 2), 'brinidx'::regclass); -itemoffset|blknum|attnum|allnulls|hasnulls|placeholder|value -----------+------+------+--------+--------+-----------+----------- - 1| 0| 1|f |t |f |{1 .. 1} - 2| 1| 1|f |f |f |{1 .. 1000} +itemoffset|blknum|attnum|allnulls|hasnulls|placeholder|empty|value +----------+------+------+--------+--------+-----------+-----+----------- + 1| 0| 1|f |t |f |f |{1 .. 1} + 2| 1| 1|f |f |f |f |{1 .. 1000} (2 rows)