diff --git a/src/backend/columnar/cstore_reader.c b/src/backend/columnar/cstore_reader.c index 884fd5544..d87745c52 100644 --- a/src/backend/columnar/cstore_reader.c +++ b/src/backend/columnar/cstore_reader.c @@ -529,7 +529,7 @@ SelectedChunkMask(StripeSkipList *stripeSkipList, List *projectedColumnList, #else predicateRefuted = predicate_refuted_by(constraintList, restrictInfoList); #endif - if (predicateRefuted) + if (predicateRefuted && selectedChunkMask[chunkIndex]) { selectedChunkMask[chunkIndex] = false; *chunksFiltered += 1; diff --git a/src/test/regress/input/am_chunk_filtering.source b/src/test/regress/input/am_chunk_filtering.source index a0aa2ac91..0e8081337 100644 --- a/src/test/regress/input/am_chunk_filtering.source +++ b/src/test/regress/input/am_chunk_filtering.source @@ -89,3 +89,15 @@ EXPLAIN (analyze on, costs off, timing off, summary off) SELECT * FROM simple_chunk_filtering WHERE i > 180000; DROP TABLE simple_chunk_filtering; + + +CREATE TABLE multi_column_chunk_filtering(a int, b int) USING columnar; +INSERT INTO multi_column_chunk_filtering SELECT i,i+1 FROM generate_series(0,234567) i; + +EXPLAIN (analyze on, costs off, timing off, summary off) + SELECT count(*) FROM multi_column_chunk_filtering WHERE a > 50000; + +EXPLAIN (analyze on, costs off, timing off, summary off) + SELECT count(*) FROM multi_column_chunk_filtering WHERE a > 50000 AND b > 50000; + +DROP TABLE multi_column_chunk_filtering; diff --git a/src/test/regress/output/am_chunk_filtering.source b/src/test/regress/output/am_chunk_filtering.source index 33a266fb0..48f076d16 100644 --- a/src/test/regress/output/am_chunk_filtering.source +++ b/src/test/regress/output/am_chunk_filtering.source @@ -157,3 +157,28 @@ EXPLAIN (analyze on, costs off, timing off, summary off) (4 rows) DROP TABLE simple_chunk_filtering; +CREATE TABLE multi_column_chunk_filtering(a int, b int) USING columnar; +INSERT INTO multi_column_chunk_filtering SELECT i,i+1 FROM generate_series(0,234567) i; +EXPLAIN (analyze on, costs off, timing off, summary off) + SELECT count(*) FROM multi_column_chunk_filtering WHERE a > 50000; + QUERY PLAN +--------------------------------------------------------------------- + Aggregate (actual rows=1 loops=1) + -> Custom Scan (ColumnarScan) on multi_column_chunk_filtering (actual rows=184567 loops=1) + Filter: (a > 50000) + Rows Removed by Filter: 1 + Columnar Chunks Removed by Filter: 5 +(5 rows) + +EXPLAIN (analyze on, costs off, timing off, summary off) + SELECT count(*) FROM multi_column_chunk_filtering WHERE a > 50000 AND b > 50000; + QUERY PLAN +--------------------------------------------------------------------- + Aggregate (actual rows=1 loops=1) + -> Custom Scan (ColumnarScan) on multi_column_chunk_filtering (actual rows=184567 loops=1) + Filter: ((a > 50000) AND (b > 50000)) + Rows Removed by Filter: 1 + Columnar Chunks Removed by Filter: 5 +(5 rows) + +DROP TABLE multi_column_chunk_filtering;