You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by re...@apache.org on 2025/02/26 13:51:04 UTC
(cloudberry) 05/10: brin ao/co: Assert range in/ex-clusion for scans
This is an automated email from the ASF dual-hosted git repository.
reshke pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit c57ec8017a8da610c0388daf07f7d1892c16ef6c
Author: Soumyadeep Chakraborty <so...@gmail.com>
AuthorDate: Fri May 12 09:28:02 2023 -0700
brin ao/co: Assert range in/ex-clusion for scans
This commit introduces a fault point in bringetbitmap(), where we add a
page into the output bitmap. We add additional coverage for scans now
across the existing tests.
By actually asserting what gets added in the output tidbitmap, we can
not only assert correctness, but we can ensure that extra ranges aren't
getting added unnecessarily, to prevent performance pitfalls.
---
src/backend/access/brin/brin.c | 2 +
src/test/isolation2/expected/brin_heap.out | 76 +++++++
src/test/isolation2/input/uao/brin.source | 140 ++++++++++++
src/test/isolation2/output/uao/brin.source | 338 +++++++++++++++++++++++++++++
src/test/isolation2/sql/brin_heap.sql | 32 +++
5 files changed, 588 insertions(+)
diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c
index 75f678059d..9ea15ddf5e 100644
--- a/src/backend/access/brin/brin.c
+++ b/src/backend/access/brin/brin.c
@@ -783,6 +783,8 @@ bringetbitmap(IndexScanDesc scan, Node **bmNodeP)
tbm_add_page(tbm, pageno);
totalpages++;
MemoryContextSwitchTo(perRangeCxt);
+
+ SIMPLE_FAULT_INJECTOR("brin_bitmap_page_added");
}
}
}
diff --git a/src/test/isolation2/expected/brin_heap.out b/src/test/isolation2/expected/brin_heap.out
index bfc10dc8ed..c85994549a 100644
--- a/src/test/isolation2/expected/brin_heap.out
+++ b/src/test/isolation2/expected/brin_heap.out
@@ -5,6 +5,10 @@
CREATE EXTENSION pageinspect;
CREATE
+-- Turn off sequential scans to force usage of BRIN indexes for scans.
+SET enable_seqscan TO off;
+SET
+
-- Ensure that we can summarize the last partial range in case it was extended
-- by another transaction, while summarization was in flight.
@@ -169,6 +173,30 @@ SELECT brin_summarize_new_values('brin_abort_heap_i_idx');
3 | 2 | 1 | t | f | f |
(3 rows)
+-- Sanity: Scan should only return the 1st block and ignore the blocks for which
+-- we have the empty tuples, in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_abort_heap WHERE i = 1;
+ count
+-------
+ 0
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'1'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- Now, add some committed rows.
SELECT populate_pages('brin_abort_heap', 20, tid '(3, 0)');
populate_pages
@@ -209,6 +237,29 @@ SELECT brin_summarize_new_values('brin_abort_heap_i_idx');
4 | 3 | 1 | f | f | f | {20 .. 20}
(4 rows)
+-- Sanity: Scan should only return the 2 blocks matching the predicate, in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_abort_heap WHERE i = 20;
+ count
+-------
+ 909
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'2'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- Drop and re-create the index to test build.
DROP INDEX brin_abort_heap_i_idx;
DROP
@@ -241,5 +292,30 @@ CREATE
4 | 3 | 1 | f | f | f | {20 .. 20}
(4 rows)
+-- Sanity: Scan should only return the 2 blocks matching the predicate, in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_abort_heap WHERE i = 20;
+ count
+-------
+ 909
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'2'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
+RESET enable_seqscan;
+RESET
DROP EXTENSION pageinspect;
DROP
diff --git a/src/test/isolation2/input/uao/brin.source b/src/test/isolation2/input/uao/brin.source
index b0e2b04c2b..d72d30d2dc 100644
--- a/src/test/isolation2/input/uao/brin.source
+++ b/src/test/isolation2/input/uao/brin.source
@@ -3,6 +3,9 @@
-- successfully (to avoid cases where ranges have brin data tuples without
-- values or where the range is not covered by the revmap etc)
+-- Turn off sequential scans to force usage of BRIN indexes for scans.
+SET enable_seqscan TO off;
+
--------------------------------------------------------------------------------
-- Test BRIN summarization with INSERT, brin_summarize_new_values() and VACUUM
--------------------------------------------------------------------------------
@@ -50,6 +53,15 @@ SELECT brin_summarize_new_values('brin_ao_summarize_@amname@_i_idx');
1U: SELECT * FROM brin_page_items(get_raw_page('brin_ao_summarize_@amname@_i_idx', 2),
'brin_ao_summarize_@amname@_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should return all 3 blocks in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i = 1;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- Insert more so we have 5 blocks on 1 QE, in 1 aoseg: 4 blocks full, 1 block
-- with 1 tuple.
SELECT populate_pages('brin_ao_summarize_@amname@', 20, tid '(33554436, 0)');
@@ -63,6 +75,15 @@ SELECT populate_pages('brin_ao_summarize_@amname@', 20, tid '(33554436, 0)');
1U: SELECT * FROM brin_page_items(get_raw_page('brin_ao_summarize_@amname@_i_idx', 2),
'brin_ao_summarize_@amname@_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should return all blocks in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i = 1;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- Summarize the last 2 blocks.
SELECT brin_summarize_new_values('brin_ao_summarize_@amname@_i_idx');
@@ -74,6 +95,26 @@ SELECT brin_summarize_new_values('brin_ao_summarize_@amname@_i_idx');
1U: SELECT * FROM brin_page_items(get_raw_page('brin_ao_summarize_@amname@_i_idx', 2),
'brin_ao_summarize_@amname@_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should return only the first 3 blocks in the tidbitmap, now that
+-- we have summary info for all blocks.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i = 1;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
+-- Sanity: Scan should return no blocks in the tidbitmap, if we use a
+-- conflicting predicate.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i > 20;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- Insert more so we have 7 blocks on 1 QE, in 1 aoseg: 6 blocks full, 1 page
-- with 1 tuple.
SELECT populate_pages('brin_ao_summarize_@amname@', 30, tid '(33554438, 0)');
@@ -89,6 +130,16 @@ SELECT populate_pages('brin_ao_summarize_@amname@', 30, tid '(33554438, 0)');
DELETE FROM brin_ao_summarize_@amname@ WHERE i = 1;
+-- Sanity: Scan should return only the first 3 blocks and the last 2
+-- unsummarized blocks in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i = 1;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
VACUUM brin_ao_summarize_@amname@;
-- A new INSERT would always map to the last range on the old segment and that
@@ -116,6 +167,16 @@ SELECT distinct(right(split_part(ctid::text, ',', 1), -1)) AS blknum
1U: SELECT * FROM brin_page_items(get_raw_page('brin_ao_summarize_@amname@_i_idx', 2),
'brin_ao_summarize_@amname@_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should return only first 3 blocks corresponding to the vacuumed
+-- seg, as those ranges are left over from the vacuum.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i = 1;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- VACUUM should have already summarized this one logical heap block, so
-- invoking summarization again will be a no-op.
SELECT brin_summarize_new_values('brin_ao_summarize_@amname@_i_idx');
@@ -157,6 +218,15 @@ SELECT populate_pages('brin_ao_summarize_partial_@amname@', 1, tid '(33554435, 0
1U: SELECT blkno, brin_page_type(get_raw_page('brin_ao_summarize_partial_@amname@_i_idx', blkno)) FROM
generate_series(0, blocks('brin_ao_summarize_partial_@amname@_i_idx') - 1) blkno;
+-- Sanity: Scan should return all blocks, as there is no summary info.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_ao_summarize_partial_@amname@ WHERE i = 1;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- This will summarize both the first range and the last partial range.
SELECT brin_summarize_new_values('brin_ao_summarize_partial_@amname@_i_idx');
@@ -228,6 +298,16 @@ SELECT gp_inject_fault('summarize_last_partial_range', 'reset', dbid)
1U: SELECT * FROM brin_page_items(get_raw_page('brin_range_extended1_@amname@_i_idx', 2),
'brin_range_extended1_@amname@_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should return all 3 blocks in the tidbitmap, even though the
+-- last block only contains the value from the predicate.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_range_extended1_@amname@ WHERE i = 20;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- Case 2: Ensure that we don't effectively summarize the last partial range in
-- case it was extended by another transaction, while summarization was in flight.
@@ -319,6 +399,15 @@ CREATE INDEX ON brin_multi_@amname@ USING brin(i) WITH (pages_per_range=1);
1U: SELECT * FROM brin_page_items(get_raw_page('brin_multi_@amname@_i_idx', 2),
'brin_multi_@amname@_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should return all 4 blocks across both segfiles in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_multi_@amname@ WHERE i >= 1 AND i <= 20;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
--------------------------------------------------------------------------------
-- Test build/summarize with aborted rows.
--------------------------------------------------------------------------------
@@ -344,6 +433,16 @@ SELECT brin_summarize_new_values('brin_abort_@amname@_i_idx');
1U: SELECT * FROM brin_page_items(get_raw_page('brin_abort_@amname@_i_idx', 2),
'brin_abort_@amname@_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should return no blocks in the tidbitmap, as the summary tuples
+-- present are all empty.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_abort_@amname@ WHERE i = 1;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- Now, add some committed rows.
SELECT populate_pages('brin_abort_@amname@', 20, tid '(33554435, 0)');
@@ -359,6 +458,16 @@ SELECT brin_summarize_new_values('brin_abort_@amname@_i_idx');
1U: SELECT * FROM brin_page_items(get_raw_page('brin_abort_@amname@_i_idx', 2),
'brin_abort_@amname@_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should return only the 2 blocks corresponding to the committed
+-- rows.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_abort_@amname@ WHERE i = 20;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- Drop and re-create the index to test build.
DROP INDEX brin_abort_@amname@_i_idx;
CREATE INDEX ON brin_abort_@amname@ USING brin(i) WITH (pages_per_range=1);
@@ -372,6 +481,16 @@ CREATE INDEX ON brin_abort_@amname@ USING brin(i) WITH (pages_per_range=1);
1U: SELECT * FROM brin_page_items(get_raw_page('brin_abort_@amname@_i_idx', 2),
'brin_abort_@amname@_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should return only the 2 blocks corresponding to the committed
+-- rows.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_abort_@amname@ WHERE i = 20;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
--------------------------------------------------------------------------------
-- Test build/summarize with whole revmap page containing aborted ranges.
--------------------------------------------------------------------------------
@@ -413,6 +532,16 @@ SELECT brin_summarize_new_values('brin_abort_fullpage_@amname@_i_idx');
get_raw_page('brin_abort_fullpage_@amname@_i_idx', 5), 'brin_abort_fullpage_@amname@_i_idx')
group by value;
+-- Sanity: Scan should return only the 1 block in the tidbitmap, corresponding
+-- to the one committed tuple.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_abort_fullpage_@amname@ WHERE i = 20;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- Drop and re-create the index to test build.
DROP INDEX brin_abort_fullpage_@amname@_i_idx;
CREATE INDEX ON brin_abort_fullpage_@amname@ USING brin(i) WITH (pages_per_range=1);
@@ -434,4 +563,15 @@ CREATE INDEX ON brin_abort_fullpage_@amname@ USING brin(i) WITH (pages_per_range
get_raw_page('brin_abort_fullpage_@amname@_i_idx', 5), 'brin_abort_fullpage_@amname@_i_idx')
group by value;
+-- Sanity: Scan should return only the 1 block in the tidbitmap, corresponding
+-- to the one committed tuple.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_abort_fullpage_@amname@ WHERE i = 20;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+ FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
+RESET enable_seqscan;
DROP EXTENSION pageinspect;
diff --git a/src/test/isolation2/output/uao/brin.source b/src/test/isolation2/output/uao/brin.source
index 32feac4a19..5d744d4da8 100644
--- a/src/test/isolation2/output/uao/brin.source
+++ b/src/test/isolation2/output/uao/brin.source
@@ -3,6 +3,10 @@
-- successfully (to avoid cases where ranges have brin data tuples without
-- values or where the range is not covered by the revmap etc)
+-- Turn off sequential scans to force usage of BRIN indexes for scans.
+SET enable_seqscan TO off;
+SET
+
--------------------------------------------------------------------------------
-- Test BRIN summarization with INSERT, brin_summarize_new_values() and VACUUM
--------------------------------------------------------------------------------
@@ -102,6 +106,29 @@ SELECT brin_summarize_new_values('brin_ao_summarize_@amname@_i_idx');
3 | 33554434 | 1 | f | f | f | {1 .. 1}
(3 rows)
+-- Sanity: Scan should return all 3 blocks in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i = 1;
+ count
+-------
+ 657
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'3'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- Insert more so we have 5 blocks on 1 QE, in 1 aoseg: 4 blocks full, 1 block
-- with 1 tuple.
SELECT populate_pages('brin_ao_summarize_@amname@', 20, tid '(33554436, 0)');
@@ -134,6 +161,29 @@ SELECT populate_pages('brin_ao_summarize_@amname@', 20, tid '(33554436, 0)');
3 | 33554434 | 1 | f | f | f | {1 .. 20}
(3 rows)
+-- Sanity: Scan should return all blocks in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i = 1;
+ count
+-------
+ 657
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'5'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- Summarize the last 2 blocks.
SELECT brin_summarize_new_values('brin_ao_summarize_@amname@_i_idx');
brin_summarize_new_values
@@ -168,6 +218,54 @@ SELECT brin_summarize_new_values('brin_ao_summarize_@amname@_i_idx');
5 | 33554436 | 1 | f | f | f | {20 .. 20}
(5 rows)
+-- Sanity: Scan should return only the first 3 blocks in the tidbitmap, now that
+-- we have summary info for all blocks.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i = 1;
+ count
+-------
+ 657
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'3'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
+-- Sanity: Scan should return no blocks in the tidbitmap, if we use a
+-- conflicting predicate.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i > 20;
+ count
+-------
+ 0
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'set' num times hit:'0'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- Insert more so we have 7 blocks on 1 QE, in 1 aoseg: 6 blocks full, 1 page
-- with 1 tuple.
SELECT populate_pages('brin_ao_summarize_@amname@', 30, tid '(33554438, 0)');
@@ -207,6 +305,30 @@ SELECT populate_pages('brin_ao_summarize_@amname@', 30, tid '(33554438, 0)');
DELETE FROM brin_ao_summarize_@amname@ WHERE i = 1;
DELETE 657
+-- Sanity: Scan should return only the first 3 blocks and the last 2
+-- unsummarized blocks in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i = 1;
+ count
+-------
+ 0
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'5'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
VACUUM brin_ao_summarize_@amname@;
VACUUM
@@ -268,6 +390,30 @@ SELECT distinct(right(split_part(ctid::text, ',', 1), -1)) AS blknum FROM brin_a
8 | 67108864 | 1 | f | f | f | {20 .. 30}
(8 rows)
+-- Sanity: Scan should return only first 3 blocks corresponding to the vacuumed
+-- seg, as those ranges are left over from the vacuum.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_ao_summarize_@amname@ WHERE i = 1;
+ count
+-------
+ 0
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'3'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- VACUUM should have already summarized this one logical heap block, so
-- invoking summarization again will be a no-op.
SELECT brin_summarize_new_values('brin_ao_summarize_@amname@_i_idx');
@@ -352,6 +498,29 @@ SELECT populate_pages('brin_ao_summarize_partial_@amname@', 1, tid '(33554435, 0
0 | meta
(1 row)
+-- Sanity: Scan should return all blocks, as there is no summary info.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_ao_summarize_partial_@amname@ WHERE i = 1;
+ count
+-------
+ 985
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'4'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- This will summarize both the first range and the last partial range.
SELECT brin_summarize_new_values('brin_ao_summarize_partial_@amname@_i_idx');
brin_summarize_new_values
@@ -493,6 +662,30 @@ SELECT gp_inject_fault('summarize_last_partial_range', 'reset', dbid) FROM gp_se
1 | 33554432 | 1 | f | f | f | {1 .. 20}
(1 row)
+-- Sanity: Scan should return all 3 blocks in the tidbitmap, even though the
+-- last block only contains the value from the predicate.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_range_extended1_@amname@ WHERE i = 20;
+ count
+-------
+ 1
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'3'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- Case 2: Ensure that we don't effectively summarize the last partial range in
-- case it was extended by another transaction, while summarization was in flight.
@@ -684,6 +877,29 @@ CREATE
4 | 67108865 | 1 | f | f | f | {20 .. 20}
(4 rows)
+-- Sanity: Scan should return all 4 blocks across both segfiles in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_multi_@amname@ WHERE i >= 1 AND i <= 20;
+ count
+-------
+ 658
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'4'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
--------------------------------------------------------------------------------
-- Test build/summarize with aborted rows.
--------------------------------------------------------------------------------
@@ -739,6 +955,30 @@ SELECT brin_summarize_new_values('brin_abort_@amname@_i_idx');
3 | 33554434 | 1 | t | f | f |
(3 rows)
+-- Sanity: Scan should return no blocks in the tidbitmap, as the summary tuples
+-- present are all empty.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_abort_@amname@ WHERE i = 1;
+ count
+-------
+ 0
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'set' num times hit:'0'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- Now, add some committed rows.
SELECT populate_pages('brin_abort_@amname@', 20, tid '(33554435, 0)');
populate_pages
@@ -779,6 +1019,30 @@ SELECT brin_summarize_new_values('brin_abort_@amname@_i_idx');
4 | 33554435 | 1 | f | f | f | {20 .. 20}
(4 rows)
+-- Sanity: Scan should return only the 2 blocks corresponding to the committed
+-- rows.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_abort_@amname@ WHERE i = 20;
+ count
+-------
+ 328
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'2'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- Drop and re-create the index to test build.
DROP INDEX brin_abort_@amname@_i_idx;
DROP
@@ -811,6 +1075,30 @@ CREATE
4 | 33554435 | 1 | f | f | f | {20 .. 20}
(4 rows)
+-- Sanity: Scan should return only the 2 blocks corresponding to the committed
+-- rows.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_abort_@amname@ WHERE i = 20;
+ count
+-------
+ 328
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'2'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
--------------------------------------------------------------------------------
-- Test build/summarize with whole revmap page containing aborted ranges.
--------------------------------------------------------------------------------
@@ -879,6 +1167,30 @@ SELECT brin_summarize_new_values('brin_abort_fullpage_@amname@_i_idx');
{20 .. 20} | 1
(1 row)
+-- Sanity: Scan should return only the 1 block in the tidbitmap, corresponding
+-- to the one committed tuple.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_abort_fullpage_@amname@ WHERE i = 20;
+ count
+-------
+ 1
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'1'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
-- Drop and re-create the index to test build.
DROP INDEX brin_abort_fullpage_@amname@_i_idx;
DROP
@@ -919,6 +1231,32 @@ CREATE
{20 .. 20} | 1
(1 row)
+-- Sanity: Scan should return only the 1 block in the tidbitmap, corresponding
+-- to the one committed tuple.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault_infinite
+--------------------------
+ Success:
+(1 row)
+SELECT count(*) FROM brin_abort_fullpage_@amname@ WHERE i = 20;
+ count
+-------
+ 1
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Success: fault name:'brin_bitmap_page_added' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'1'
+
+(1 row)
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+ gp_inject_fault
+-----------------
+ Success:
+(1 row)
+
+RESET enable_seqscan;
+RESET
DROP EXTENSION pageinspect;
DROP
>>>>>>> 46766ec0380 (brin ao/co: Ensure final range summarization: build)
diff --git a/src/test/isolation2/sql/brin_heap.sql b/src/test/isolation2/sql/brin_heap.sql
index 316b50c5b2..aa038344e2 100644
--- a/src/test/isolation2/sql/brin_heap.sql
+++ b/src/test/isolation2/sql/brin_heap.sql
@@ -4,6 +4,9 @@
-- values or where the range is not covered by the revmap etc)
CREATE EXTENSION pageinspect;
+-- Turn off sequential scans to force usage of BRIN indexes for scans.
+SET enable_seqscan TO off;
+
-- Ensure that we can summarize the last partial range in case it was extended
-- by another transaction, while summarization was in flight.
@@ -81,6 +84,16 @@ SELECT brin_summarize_new_values('brin_abort_heap_i_idx');
1U: SELECT * FROM brin_page_items(get_raw_page('brin_abort_heap_i_idx', 2),
'brin_abort_heap_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should only return the 1st block and ignore the blocks for which
+-- we have the empty tuples, in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_abort_heap WHERE i = 1;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- Now, add some committed rows.
SELECT populate_pages('brin_abort_heap', 20, tid '(3, 0)');
@@ -96,6 +109,15 @@ SELECT brin_summarize_new_values('brin_abort_heap_i_idx');
1U: SELECT * FROM brin_page_items(get_raw_page('brin_abort_heap_i_idx', 2),
'brin_abort_heap_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should only return the 2 blocks matching the predicate, in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_abort_heap WHERE i = 20;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
-- Drop and re-create the index to test build.
DROP INDEX brin_abort_heap_i_idx;
CREATE INDEX ON brin_abort_heap USING brin(i) WITH (pages_per_range=1);
@@ -109,4 +131,14 @@ CREATE INDEX ON brin_abort_heap USING brin(i) WITH (pages_per_range=1);
1U: SELECT * FROM brin_page_items(get_raw_page('brin_abort_heap_i_idx', 2),
'brin_abort_heap_i_idx') ORDER BY blknum, attnum;
+-- Sanity: Scan should only return the 2 blocks matching the predicate, in the tidbitmap.
+SELECT gp_inject_fault_infinite('brin_bitmap_page_added', 'skip', dbid)
+FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT count(*) FROM brin_abort_heap WHERE i = 20;
+SELECT gp_inject_fault('brin_bitmap_page_added', 'status', dbid)
+FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid)
+FROM gp_segment_configuration WHERE content = 1 AND role = 'p';
+
+RESET enable_seqscan;
DROP EXTENSION pageinspect;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org