Skip to content

Commit 0457109

Browse files
committed
Improve BRIN minmax-multi opclass test coverage
Per the code coverage report, the existing regression tests did not exercice some a couple important BRIN minmax-multi code paths. - The tests focused on testing planning with a range of scan key strategies, but not the execution. Fixed by adding queries that actually test query execution for both equality and inequality. - All tests created indexes after inserting data, but this only exercises the CREATE INDEX strategy that sees all values at once, not incremental summary updates. The new tests flip the order and create the index before adding data. - The assert check(s) validating correctness of expanded ranges were present only in the "union" code path, which is not covered by regression tests at all (as it requires concurrency etc.). Fixed by adding the asserts to a couple more places. Reviewed-by: Heikki Linnakangas Discussion: https://postgr.es/m/57020b2e-d9c9-9bc7-4892-b36d9bb07563%40enterprisedb.com
1 parent 2b8b285 commit 0457109

File tree

3 files changed

+531
-0
lines changed

3 files changed

+531
-0
lines changed

src/backend/access/brin/brin_minmax_multi.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1660,6 +1660,9 @@ ensure_free_space_in_buffer(BrinDesc *bdesc, Oid colloid,
16601660
/* build the expanded ranges */
16611661
eranges = build_expanded_ranges(cmpFn, colloid, range, &neranges);
16621662

1663+
/* Is the expanded representation of ranges correct? */
1664+
AssertCheckExpandedRanges(bdesc, colloid, attno, attr, eranges, neranges);
1665+
16631666
/* and we'll also need the 'distance' procedure */
16641667
distanceFn = minmax_multi_get_procinfo(bdesc, attno, PROCNUM_DISTANCE);
16651668

@@ -1675,6 +1678,9 @@ ensure_free_space_in_buffer(BrinDesc *bdesc, Oid colloid,
16751678
range->maxvalues * MINMAX_BUFFER_LOAD_FACTOR,
16761679
cmpFn, colloid);
16771680

1681+
/* Is the result of reducing expanded ranges correct? */
1682+
AssertCheckExpandedRanges(bdesc, colloid, attno, attr, eranges, neranges);
1683+
16781684
/* Make sure we've sufficiently reduced the number of ranges. */
16791685
Assert(count_values(eranges, neranges) <= range->maxvalues * MINMAX_BUFFER_LOAD_FACTOR);
16801686

@@ -2859,6 +2865,9 @@ brin_minmax_multi_union(PG_FUNCTION_ARGS)
28592865
ranges_a->maxvalues,
28602866
cmpFn, colloid);
28612867

2868+
/* Is the result of reducing expanded ranges correct? */
2869+
AssertCheckExpandedRanges(bdesc, colloid, attno, attr, eranges, neranges);
2870+
28622871
/* update the first range summary */
28632872
store_expanded_ranges(ranges_a, eranges, neranges);
28642873

src/test/regress/expected/brin_multi.out

Lines changed: 357 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,3 +466,360 @@ EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE b = 1;
466466
Filter: (b = 1)
467467
(2 rows)
468468

469+
-- do some inequality tests
470+
CREATE TABLE brin_test_multi_1 (a INT, b BIGINT) WITH (fillfactor=10);
471+
INSERT INTO brin_test_multi_1
472+
SELECT i/5 + mod(911 * i + 483, 25),
473+
i/10 + mod(751 * i + 221, 41)
474+
FROM generate_series(1,1000) s(i);
475+
CREATE INDEX brin_test_multi_1_idx_1 ON brin_test_multi_1 USING brin (a int4_minmax_multi_ops) WITH (pages_per_range=5);
476+
CREATE INDEX brin_test_multi_1_idx_2 ON brin_test_multi_1 USING brin (b int8_minmax_multi_ops) WITH (pages_per_range=5);
477+
SET enable_seqscan=off;
478+
-- int: less than
479+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 37;
480+
count
481+
-------
482+
124
483+
(1 row)
484+
485+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 113;
486+
count
487+
-------
488+
504
489+
(1 row)
490+
491+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 177;
492+
count
493+
-------
494+
829
495+
(1 row)
496+
497+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 25;
498+
count
499+
-------
500+
69
501+
(1 row)
502+
503+
-- int: greater than
504+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 120;
505+
count
506+
-------
507+
456
508+
(1 row)
509+
510+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 180;
511+
count
512+
-------
513+
161
514+
(1 row)
515+
516+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 71;
517+
count
518+
-------
519+
701
520+
(1 row)
521+
522+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 63;
523+
count
524+
-------
525+
746
526+
(1 row)
527+
528+
-- int: equals
529+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 207;
530+
count
531+
-------
532+
3
533+
(1 row)
534+
535+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 177;
536+
count
537+
-------
538+
5
539+
(1 row)
540+
541+
-- bigint: less than
542+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 73;
543+
count
544+
-------
545+
529
546+
(1 row)
547+
548+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 47;
549+
count
550+
-------
551+
279
552+
(1 row)
553+
554+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 199;
555+
count
556+
-------
557+
1000
558+
(1 row)
559+
560+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 150;
561+
count
562+
-------
563+
1000
564+
(1 row)
565+
566+
-- bigint: greater than
567+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 93;
568+
count
569+
-------
570+
261
571+
(1 row)
572+
573+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 37;
574+
count
575+
-------
576+
821
577+
(1 row)
578+
579+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b >= 215;
580+
count
581+
-------
582+
0
583+
(1 row)
584+
585+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 201;
586+
count
587+
-------
588+
0
589+
(1 row)
590+
591+
-- bigint: equals
592+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 88;
593+
count
594+
-------
595+
10
596+
(1 row)
597+
598+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 103;
599+
count
600+
-------
601+
9
602+
(1 row)
603+
604+
-- now do the same, but insert the rows with the indexes already created
605+
-- so that we don't use the "build callback" and instead use the regular
606+
-- approach of adding rows into existing ranges
607+
TRUNCATE brin_test_multi_1;
608+
INSERT INTO brin_test_multi_1
609+
SELECT i/5 + mod(911 * i + 483, 25),
610+
i/10 + mod(751 * i + 221, 41)
611+
FROM generate_series(1,1000) s(i);
612+
-- int: less than
613+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 37;
614+
count
615+
-------
616+
124
617+
(1 row)
618+
619+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 113;
620+
count
621+
-------
622+
504
623+
(1 row)
624+
625+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 177;
626+
count
627+
-------
628+
829
629+
(1 row)
630+
631+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 25;
632+
count
633+
-------
634+
69
635+
(1 row)
636+
637+
-- int: greater than
638+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 120;
639+
count
640+
-------
641+
456
642+
(1 row)
643+
644+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 180;
645+
count
646+
-------
647+
161
648+
(1 row)
649+
650+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 71;
651+
count
652+
-------
653+
701
654+
(1 row)
655+
656+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 63;
657+
count
658+
-------
659+
746
660+
(1 row)
661+
662+
-- int: equals
663+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 207;
664+
count
665+
-------
666+
3
667+
(1 row)
668+
669+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 177;
670+
count
671+
-------
672+
5
673+
(1 row)
674+
675+
-- bigint: less than
676+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 73;
677+
count
678+
-------
679+
529
680+
(1 row)
681+
682+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 47;
683+
count
684+
-------
685+
279
686+
(1 row)
687+
688+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 199;
689+
count
690+
-------
691+
1000
692+
(1 row)
693+
694+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 150;
695+
count
696+
-------
697+
1000
698+
(1 row)
699+
700+
-- bigint: greater than
701+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 93;
702+
count
703+
-------
704+
261
705+
(1 row)
706+
707+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 37;
708+
count
709+
-------
710+
821
711+
(1 row)
712+
713+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b >= 215;
714+
count
715+
-------
716+
0
717+
(1 row)
718+
719+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 201;
720+
count
721+
-------
722+
0
723+
(1 row)
724+
725+
-- bigint: equals
726+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 88;
727+
count
728+
-------
729+
10
730+
(1 row)
731+
732+
SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 103;
733+
count
734+
-------
735+
9
736+
(1 row)
737+
738+
DROP TABLE brin_test_multi_1;
739+
RESET enable_seqscan;
740+
-- do some inequality tests for varlena data types
741+
CREATE TABLE brin_test_multi_2 (a UUID) WITH (fillfactor=10);
742+
INSERT INTO brin_test_multi_2
743+
SELECT v::uuid FROM (SELECT row_number() OVER (ORDER BY v) c, v FROM (SELECT md5((i/13)::text) AS v FROM generate_series(1,1000) s(i)) foo) bar ORDER BY c + 25 * random();
744+
CREATE INDEX brin_test_multi_2_idx ON brin_test_multi_2 USING brin (a uuid_minmax_multi_ops) WITH (pages_per_range=5);
745+
SET enable_seqscan=off;
746+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a < '33e75ff0-9dd6-01bb-e69f-351039152189';
747+
count
748+
-------
749+
195
750+
(1 row)
751+
752+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a > '33e75ff0-9dd6-01bb-e69f-351039152189';
753+
count
754+
-------
755+
792
756+
(1 row)
757+
758+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a <= 'f457c545-a9de-d88f-18ec-ee47145a72c0';
759+
count
760+
-------
761+
961
762+
(1 row)
763+
764+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a >= 'c51ce410-c124-a10e-0db5-e4b97fc2af39';
765+
count
766+
-------
767+
272
768+
(1 row)
769+
770+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = 'cfcd2084-95d5-65ef-66e7-dff9f98764da';
771+
count
772+
-------
773+
12
774+
(1 row)
775+
776+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = 'aab32389-22bc-c25a-6f60-6eb525ffdc56';
777+
count
778+
-------
779+
13
780+
(1 row)
781+
782+
-- now do the same, but insert the rows with the indexes already created
783+
-- so that we don't use the "build callback" and instead use the regular
784+
-- approach of adding rows into existing ranges
785+
TRUNCATE brin_test_multi_2;
786+
INSERT INTO brin_test_multi_2
787+
SELECT v::uuid FROM (SELECT row_number() OVER (ORDER BY v) c, v FROM (SELECT md5((i/13)::text) AS v FROM generate_series(1,1000) s(i)) foo) bar ORDER BY c + 25 * random();
788+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a < '33e75ff0-9dd6-01bb-e69f-351039152189';
789+
count
790+
-------
791+
195
792+
(1 row)
793+
794+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a > '33e75ff0-9dd6-01bb-e69f-351039152189';
795+
count
796+
-------
797+
792
798+
(1 row)
799+
800+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a <= 'f457c545-a9de-d88f-18ec-ee47145a72c0';
801+
count
802+
-------
803+
961
804+
(1 row)
805+
806+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a >= 'c51ce410-c124-a10e-0db5-e4b97fc2af39';
807+
count
808+
-------
809+
272
810+
(1 row)
811+
812+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = 'cfcd2084-95d5-65ef-66e7-dff9f98764da';
813+
count
814+
-------
815+
12
816+
(1 row)
817+
818+
SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = 'aab32389-22bc-c25a-6f60-6eb525ffdc56';
819+
count
820+
-------
821+
13
822+
(1 row)
823+
824+
DROP TABLE brin_test_multi_2;
825+
RESET enable_seqscan;

0 commit comments

Comments
 (0)