-- Tests for Bitmapsets CREATE EXTENSION test_bitmapset; -- bms_make_singleton() SELECT test_bms_make_singleton(-1); ERROR: negative bitmapset member not allowed SELECT test_bms_make_singleton(42) AS result; result -------- (b 42) (1 row) SELECT test_bms_make_singleton(0) AS result; result -------- (b 0) (1 row) SELECT test_bms_make_singleton(1000) AS result; result ---------- (b 1000) (1 row) -- bms_add_member() SELECT test_bms_add_member('(b 1)', -1); -- error ERROR: negative bitmapset member not allowed SELECT test_bms_add_member('(b)', -10); -- error ERROR: negative bitmapset member not allowed SELECT test_bms_add_member('(b)', 10) AS result; result -------- (b 10) (1 row) SELECT test_bms_add_member('(b 5)', 10) AS result; result ---------- (b 5 10) (1 row) -- sort check SELECT test_bms_add_member('(b 10)', 5) AS result; result ---------- (b 5 10) (1 row) -- idempotent change SELECT test_bms_add_member('(b 10)', 10) AS result; result -------- (b 10) (1 row) -- bms_replace_members() SELECT test_bms_replace_members(NULL, '(b 1 2 3)') AS result; result ----------- (b 1 2 3) (1 row) SELECT test_bms_replace_members('(b 1 2 3)', NULL) AS result; result -------- (1 row) SELECT test_bms_replace_members('(b 1 2 3)', '(b 3 5 6)') AS result; result ----------- (b 3 5 6) (1 row) SELECT test_bms_replace_members('(b 1 2 3)', '(b 3 5)') AS result; result --------- (b 3 5) (1 row) SELECT test_bms_replace_members('(b 1 2)', '(b 3 5 7)') AS result; result ----------- (b 3 5 7) (1 row) -- bms_del_member() SELECT test_bms_del_member('(b)', -20); -- error ERROR: negative bitmapset member not allowed SELECT test_bms_del_member('(b)', 10) AS result; result -------- (1 row) SELECT test_bms_del_member('(b 10)', 10) AS result; result -------- (1 row) SELECT test_bms_del_member('(b 10)', 5) AS result; result -------- (b 10) (1 row) SELECT test_bms_del_member('(b 1 2 3)', 2) AS result; result --------- (b 1 3) (1 row) -- Reallocation check SELECT test_bms_del_member(test_bms_del_member('(b 0 31 32 63 64)', 32), 63) AS result; result ------------- (b 0 31 64) (1 row) -- Word boundary SELECT test_bms_del_member(test_bms_add_range('(b)', 30, 34), 32) AS result; result ----------------- (b 30 31 33 34) (1 row) -- bms_join() SELECT test_bms_join('(b 1 3 5)', NULL) AS result; result ----------- (b 1 3 5) (1 row) SELECT test_bms_join(NULL, '(b 2 4 6)') AS result; result ----------- (b 2 4 6) (1 row) SELECT test_bms_join('(b 1 3 5)', '(b 2 4 6)') AS result; result ----------------- (b 1 2 3 4 5 6) (1 row) SELECT test_bms_join('(b 1 3 5)', '(b 1 4 5)') AS result; result ------------- (b 1 3 4 5) (1 row) -- bms_union() -- Overlapping sets. SELECT test_bms_union('(b 1 3 5)', '(b 3 5 7)') AS result; result ------------- (b 1 3 5 7) (1 row) -- Union with NULL SELECT test_bms_union('(b 1 3 5)', '(b)') AS result; result ----------- (b 1 3 5) (1 row) -- Union of empty with empty SELECT test_bms_union('(b)', '(b)') AS result; result -------- (1 row) -- Overlapping ranges SELECT test_bms_union( test_bms_add_range('(b)', 0, 15), test_bms_add_range('(b)', 10, 20) ) AS result; result ---------------------------------------------------------- (b 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20) (1 row) -- bms_intersect() -- Overlapping sets SELECT test_bms_intersect('(b 1 3 5)', '(b 3 5 7)') AS result; result --------- (b 3 5) (1 row) -- Disjoint sets SELECT test_bms_intersect('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- (1 row) -- Intersect with empty. SELECT test_bms_intersect('(b 1 3 5)', '(b)') AS result; result -------- (1 row) -- bms_int_members() -- Overlapping sets SELECT test_bms_int_members('(b 1 3 5)', '(b 3 5 7)') AS result; result --------- (b 3 5) (1 row) -- Disjoint sets SELECT test_bms_int_members('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- (1 row) -- Intersect with empty. SELECT test_bms_int_members('(b 1 3 5)', '(b)') AS result; result -------- (1 row) -- Multiple members SELECT test_bms_int_members('(b 0 31 32 63 64)', '(b 31 32 64 65)') AS result; result -------------- (b 31 32 64) (1 row) -- bms_difference() -- Overlapping sets SELECT test_bms_difference('(b 1 3 5)', '(b 3 5 7)') AS result; result -------- (b 1) (1 row) -- Disjoint sets SELECT test_bms_difference('(b 1 3 5)', '(b 2 4 6)') AS result; result ----------- (b 1 3 5) (1 row) -- Identical sets SELECT test_bms_difference('(b 1 3 5)', '(b 1 3 5)') AS result; result -------- (1 row) -- Substraction to empty SELECT test_bms_difference('(b 42)', '(b 42)') AS result; result -------- (1 row) -- Subtraction edge case SELECT test_bms_difference( test_bms_add_range('(b)', 0, 100), test_bms_add_range('(b)', 50, 150) ) AS result; result ------------------------------------------------------------------------------------------------------------------------------------------------- (b 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49) (1 row) -- bms_is_member() SELECT test_bms_is_member('(b)', -5); -- error ERROR: negative bitmapset member not allowed SELECT test_bms_is_member('(b 1 3 5)', 1) AS result; result -------- t (1 row) SELECT test_bms_is_member('(b 1 3 5)', 2) AS result; result -------- f (1 row) SELECT test_bms_is_member('(b 1 3 5)', 3) AS result; result -------- t (1 row) SELECT test_bms_is_member('(b)', 1) AS result; result -------- f (1 row) -- bms_member_index() SELECT test_bms_member_index(NULL, 1) AS result; result -------- -1 (1 row) SELECT test_bms_member_index('(b 1 3 5)', 2) AS result; result -------- -1 (1 row) SELECT test_bms_member_index('(b 1 3 5)', 1) AS result; result -------- 0 (1 row) SELECT test_bms_member_index('(b 1 3 5)', 3) AS result; result -------- 1 (1 row) -- bms_num_members() SELECT test_bms_num_members('(b)') AS result; result -------- 0 (1 row) SELECT test_bms_num_members('(b 1 3 5)') AS result; result -------- 3 (1 row) SELECT test_bms_num_members('(b 2 4 6 8 10)') AS result; result -------- 5 (1 row) -- test_bms_equal() SELECT test_bms_equal('(b)', '(b)') AS result; result -------- t (1 row) SELECT test_bms_equal('(b)', '(b 1 3 5)') AS result; result -------- f (1 row) SELECT test_bms_equal('(b 1 3 5)', '(b)') AS result; result -------- f (1 row) SELECT test_bms_equal('(b 1 3 5)', '(b 1 3 5)') AS result; result -------- t (1 row) SELECT test_bms_equal('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- f (1 row) -- bms_compare() SELECT test_bms_compare('(b)', '(b)') AS result; result -------- 0 (1 row) SELECT test_bms_compare('(b)', '(b 1 3)') AS result; result -------- -1 (1 row) SELECT test_bms_compare('(b 1 3)', '(b)') AS result; result -------- 1 (1 row) SELECT test_bms_compare('(b 1 3)', '(b 1 3)') AS result; result -------- 0 (1 row) SELECT test_bms_compare('(b 1 3)', '(b 1 3 5)') AS result; result -------- -1 (1 row) SELECT test_bms_compare('(b 1 3 5)', '(b 1 3)') AS result; result -------- 1 (1 row) SELECT test_bms_compare( test_bms_add_range('(b)', 0, 63), test_bms_add_range('(b)', 0, 64) ) AS result; result -------- -1 (1 row) -- bms_add_range() SELECT test_bms_add_range('(b)', -5, 10); -- error ERROR: negative bitmapset member not allowed SELECT test_bms_add_range('(b)', 5, 7) AS result; result ----------- (b 5 6 7) (1 row) SELECT test_bms_add_range('(b)', 5, 5) AS result; result -------- (b 5) (1 row) SELECT test_bms_add_range('(b 1 10)', 5, 7) AS result; result ---------------- (b 1 5 6 7 10) (1 row) -- Word boundary of 31 SELECT test_bms_add_range('(b)', 30, 34) AS result; result -------------------- (b 30 31 32 33 34) (1 row) -- Word boundary of 63 SELECT test_bms_add_range('(b)', 62, 66) AS result; result -------------------- (b 62 63 64 65 66) (1 row) -- Large range SELECT length(test_bms_add_range('(b)', 0, 1000)) AS result; result -------- 3898 (1 row) -- Force reallocations SELECT length(test_bms_add_range('(b)', 0, 200)) AS result; result -------- 697 (1 row) SELECT length(test_bms_add_range('(b)', 1000, 1100)) AS result; result -------- 508 (1 row) -- bms_membership() SELECT test_bms_membership('(b)') AS result; result -------- 0 (1 row) SELECT test_bms_membership('(b 42)') AS result; result -------- 1 (1 row) SELECT test_bms_membership('(b 1 2)') AS result; result -------- 2 (1 row) -- bms_is_empty() SELECT test_bms_is_empty(NULL) AS result; result -------- t (1 row) SELECT test_bms_is_empty('(b)') AS result; result -------- t (1 row) SELECT test_bms_is_empty('(b 1)') AS result; result -------- f (1 row) -- bms_singleton_member() SELECT test_bms_singleton_member('(b 1 2)'); -- error ERROR: bitmapset has multiple members SELECT test_bms_singleton_member('(b 42)') AS result; result -------- 42 (1 row) -- bms_get_singleton_member() -- Not a singleton, returns input default SELECT test_bms_get_singleton_member('(b 3 6)', 1000) AS result; result -------- 1000 (1 row) -- Singletone, returns sole member SELECT test_bms_get_singleton_member('(b 400)', 1000) AS result; result -------- 400 (1 row) -- bms_next_member() and bms_prev_member() -- First member SELECT test_bms_next_member('(b 5 10 15 20)', -1) AS result; result -------- 5 (1 row) -- Second member SELECT test_bms_next_member('(b 5 10 15 20)', 5) AS result; result -------- 10 (1 row) -- Member past the end SELECT test_bms_next_member('(b 5 10 15 20)', 20) AS result; result -------- -2 (1 row) -- Empty set SELECT test_bms_next_member('(b)', -1) AS result; result -------- -2 (1 row) -- Last member SELECT test_bms_prev_member('(b 5 10 15 20)', 21) AS result; result -------- 20 (1 row) -- Penultimate member SELECT test_bms_prev_member('(b 5 10 15 20)', 20) AS result; result -------- 15 (1 row) -- Past beginning member SELECT test_bms_prev_member('(b 5 10 15 20)', 5) AS result; result -------- -2 (1 row) -- Empty set SELECT test_bms_prev_member('(b)', 100) AS result; result -------- -2 (1 row) -- bms_hash_value() SELECT test_bms_hash_value('(b)') = 0 AS result; result -------- t (1 row) SELECT test_bms_hash_value('(b 1 3 5)') = test_bms_hash_value('(b 1 3 5)') AS result; result -------- t (1 row) SELECT test_bms_hash_value('(b 1 3 5)') != test_bms_hash_value('(b 2 4 6)') AS result; result -------- t (1 row) -- bms_overlap() SELECT test_bms_overlap('(b 1 3 5)', '(b 3 5 7)') AS result; result -------- t (1 row) SELECT test_bms_overlap('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- f (1 row) SELECT test_bms_overlap('(b)', '(b 1 3 5)') AS result; result -------- f (1 row) -- bms_is_subset() SELECT test_bms_is_subset('(b)', '(b 1 3 5)') AS result; result -------- t (1 row) SELECT test_bms_is_subset('(b 1 3)', '(b 1 3 5)') AS result; result -------- t (1 row) SELECT test_bms_is_subset('(b 1 3 5)', '(b 1 3)') AS result; result -------- f (1 row) SELECT test_bms_is_subset('(b 1 3)', '(b 2 4)') AS result; result -------- f (1 row) SELECT test_bms_is_subset(test_bms_add_range(NULL, 0, 31), test_bms_add_range(NULL, 0, 63)) AS result; result -------- t (1 row) -- bms_subset_compare() SELECT test_bms_subset_compare(NULL, NULL) AS result; result -------- 0 (1 row) SELECT test_bms_subset_compare('(b 1 3)', NULL) AS result; result -------- 2 (1 row) SELECT test_bms_subset_compare(NULL, '(b 1 3)') AS result; result -------- 1 (1 row) SELECT test_bms_subset_compare('(b 1 3 5)', '(b 1 3)') AS result; result -------- 2 (1 row) SELECT test_bms_subset_compare('(b 1 3)', '(b 1 3 5)') AS result; result -------- 1 (1 row) SELECT test_bms_subset_compare('(b 1 3 5)', '(b 1 3 5)') AS result; result -------- 0 (1 row) SELECT test_bms_subset_compare('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- 3 (1 row) -- bms_copy() SELECT test_bms_copy(NULL) AS result; result -------- (1 row) SELECT test_bms_copy('(b 1 3 5 7)') AS result; result ------------- (b 1 3 5 7) (1 row) -- bms_add_members() SELECT test_bms_add_member('(b)', 1000); -- error test_bms_add_member --------------------- (b 1000) (1 row) SELECT test_bms_add_members('(b 1 3)', '(b 5 7)') AS result; result ------------- (b 1 3 5 7) (1 row) SELECT test_bms_add_members('(b 1 3 5)', '(b 2 5 7)') AS result; result --------------- (b 1 2 3 5 7) (1 row) SELECT test_bms_add_members('(b 1 3 5)', '(b 100 200 300)') AS result; result ----------------------- (b 1 3 5 100 200 300) (1 row) -- bitmap_hash() SELECT test_bitmap_hash('(b)') = 0 AS result; result -------- t (1 row) SELECT test_bitmap_hash('(b 1 3 5)') = test_bitmap_hash('(b 1 3 5)') AS result; result -------- t (1 row) SELECT test_bitmap_hash('(b 1 3 5)') = test_bms_hash_value('(b 1 3 5)') AS result; result -------- t (1 row) SELECT test_bitmap_hash('(b 1 3 5)') != test_bitmap_hash('(b 2 4 6)') AS result; result -------- t (1 row) -- bitmap_match() SELECT test_bitmap_match('(b)', '(b)') AS result; result -------- 0 (1 row) SELECT test_bitmap_match('(b)', '(b 1 3 5)') AS result; result -------- 1 (1 row) SELECT test_bitmap_match('(b 1 3 5)', '(b)') AS result; result -------- 1 (1 row) SELECT test_bitmap_match('(b 1 3 5)', '(b 1 3 5)') AS result; result -------- 0 (1 row) SELECT test_bitmap_match('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- 1 (1 row) SELECT test_bitmap_match('(b 1 3)', '(b 1 3 5)') AS result; result -------- 1 (1 row) -- Check relationship of bitmap_match() with bms_equal() SELECT (test_bitmap_match('(b 1 3 5)', '(b 1 3 5)') = 0) = test_bms_equal('(b 1 3 5)', '(b 1 3 5)') AS result; result -------- t (1 row) SELECT (test_bitmap_match('(b 1 3 5)', '(b 2 4 6)') = 0) = test_bms_equal('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- t (1 row) SELECT (test_bitmap_match('(b)', '(b)') = 0) = test_bms_equal('(b)', '(b)') AS result; result -------- t (1 row) -- bms_overlap_list() SELECT test_bms_overlap_list('(b 0)', ARRAY[0]) AS result; result -------- t (1 row) SELECT test_bms_overlap_list('(b 2 3)', ARRAY[1,2]) AS result; result -------- t (1 row) SELECT test_bms_overlap_list('(b 3 4)', ARRAY[3,4,5]) AS result; result -------- t (1 row) SELECT test_bms_overlap_list('(b 7 10)', ARRAY[6,7,8,9]) AS result; result -------- t (1 row) SELECT test_bms_overlap_list('(b 1 5)', ARRAY[6,7,8,9]) AS result; result -------- f (1 row) -- Empty list SELECT test_bms_overlap_list('(b 1)', ARRAY[]::integer[]) AS result; result -------- f (1 row) -- bms_nonempty_difference() SELECT test_bms_nonempty_difference(NULL, '(b 1 3 5)') AS result; result -------- f (1 row) SELECT test_bms_nonempty_difference('(b 1 3 5)', NULL) AS result; result -------- t (1 row) SELECT test_bms_nonempty_difference('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- t (1 row) SELECT test_bms_nonempty_difference('(b 1 3 5)', '(b 1 5)') AS result; result -------- t (1 row) SELECT test_bms_nonempty_difference('(b 1 3 5)', '(b 1 3 5)') AS result; result -------- f (1 row) -- random operations SELECT test_random_operations(-1, 10000, 81920, 0) > 0 AS result; result -------- t (1 row) DROP EXTENSION test_bitmapset;