diff options
Diffstat (limited to 'src/test/modules/test_bitmapset')
4 files changed, 1015 insertions, 489 deletions
diff --git a/src/test/modules/test_bitmapset/expected/test_bitmapset.out b/src/test/modules/test_bitmapset/expected/test_bitmapset.out index abbfef1f7a6..3198614d6ad 100644 --- a/src/test/modules/test_bitmapset/expected/test_bitmapset.out +++ b/src/test/modules/test_bitmapset/expected/test_bitmapset.out @@ -21,6 +21,13 @@ SELECT test_bms_make_singleton(1000) AS result; (b 1000) (1 row) +-- Test module check +SELECT test_bms_make_singleton(NULL) AS result; + result +-------- + +(1 row) + -- bms_add_member() SELECT test_bms_add_member('(b 1)', -1); -- error ERROR: negative bitmapset member not allowed @@ -52,6 +59,13 @@ SELECT test_bms_add_member('(b 10)', 10) AS result; (b 10) (1 row) +-- Test module check +SELECT test_bms_add_member('(b)', NULL) AS result; + result +-------- + +(1 row) + -- bms_replace_members() SELECT test_bms_replace_members(NULL, '(b 1 2 3)') AS result; result @@ -62,7 +76,7 @@ SELECT test_bms_replace_members(NULL, '(b 1 2 3)') AS result; 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; @@ -83,19 +97,26 @@ SELECT test_bms_replace_members('(b 1 2)', '(b 3 5 7)') AS result; (b 3 5 7) (1 row) +-- Force repalloc() with larger set +SELECT test_bms_replace_members('(b 1 2 3 4 5)', '(b 500 600)') AS result; + result +------------- + (b 500 600) +(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; @@ -124,6 +145,95 @@ SELECT test_bms_del_member(test_bms_add_range('(b)', 30, 34), 32) AS result; (b 30 31 33 34) (1 row) +-- Force word count changes +SELECT test_bms_del_member('(b 1 200)', 200) AS result; + result +-------- + (b 1) +(1 row) + +SELECT test_bms_del_member('(b 1 50 100 200)', 200) AS result; + result +-------------- + (b 1 50 100) +(1 row) + +SELECT test_bms_del_member('(b 1 50 100 200)', 100) AS result; + result +-------------- + (b 1 50 200) +(1 row) + +-- Test module checks +SELECT test_bms_del_member('(b 5)', NULL) AS result; + result +-------- + +(1 row) + +-- bms_del_members() +SELECT test_bms_del_members('(b)', '(b 10)') AS result; + result +-------- + <> +(1 row) + +SELECT test_bms_del_members('(b 10)', '(b 10)') AS result; + result +-------- + <> +(1 row) + +SELECT test_bms_del_members('(b 10)', '(b 5)') AS result; + result +-------- + (b 10) +(1 row) + +SELECT test_bms_del_members('(b 1 2 3)', '(b 2)') AS result; + result +--------- + (b 1 3) +(1 row) + +SELECT test_bms_del_members('(b 5 100)', '(b 100)') AS result; + result +-------- + (b 5) +(1 row) + +SELECT test_bms_del_members('(b 5 100 200)', '(b 200)') AS result; + result +----------- + (b 5 100) +(1 row) + +-- Force word count changes +SELECT test_bms_del_members('(b 1 2 100 200 300)', '(b 1 2)') AS result; + result +----------------- + (b 100 200 300) +(1 row) + +SELECT test_bms_del_members('(b 1 2 100 200 300)', '(b 200 300)') AS result; + result +------------- + (b 1 2 100) +(1 row) + +-- NULL inputs +SELECT test_bms_del_members('(b 5)', NULL) AS result; + result +-------- + (b 5) +(1 row) + +SELECT test_bms_del_members(NULL, '(b 5)') AS result; + result +-------- + <> +(1 row) + -- bms_join() SELECT test_bms_join('(b 1 3 5)', NULL) AS result; result @@ -149,8 +259,40 @@ SELECT test_bms_join('(b 1 3 5)', '(b 1 4 5)') AS result; (b 1 3 4 5) (1 row) +-- Force word count changes +SELECT test_bms_join('(b 5)', '(b 100)') AS result; + result +----------- + (b 5 100) +(1 row) + +SELECT test_bms_join('(b 1 2)', '(b 100 200 300)') AS result; + result +--------------------- + (b 1 2 100 200 300) +(1 row) + +-- NULL inputs +SELECT test_bms_join('(b 5)', NULL) AS result; + result +-------- + (b 5) +(1 row) + +SELECT test_bms_join(NULL, '(b 5)') AS result; + result +-------- + (b 5) +(1 row) + +SELECT test_bms_join(NULL, NULL) AS result; + result +-------- + <> +(1 row) + -- bms_union() --- Overlapping sets. +-- Overlapping sets SELECT test_bms_union('(b 1 3 5)', '(b 3 5 7)') AS result; result ------------- @@ -168,7 +310,7 @@ SELECT test_bms_union('(b 1 3 5)', '(b)') AS result; SELECT test_bms_union('(b)', '(b)') AS result; result -------- - + <> (1 row) -- Overlapping ranges @@ -181,6 +323,38 @@ SELECT test_bms_union( (b 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20) (1 row) +-- Union with varying word counts +SELECT test_bms_union('(b 1 2)', '(b 100 300)') AS result; + result +----------------- + (b 1 2 100 300) +(1 row) + +SELECT test_bms_union('(b 100 300)', '(b 1 2)') AS result; + result +----------------- + (b 1 2 100 300) +(1 row) + +-- NULL inputs +SELECT test_bms_union('(b 5)', NULL) AS result; + result +-------- + (b 5) +(1 row) + +SELECT test_bms_union(NULL, '(b 5)') AS result; + result +-------- + (b 5) +(1 row) + +SELECT test_bms_union(NULL, NULL) AS result; + result +-------- + <> +(1 row) + -- bms_intersect() -- Overlapping sets SELECT test_bms_intersect('(b 1 3 5)', '(b 3 5 7)') AS result; @@ -193,14 +367,46 @@ SELECT test_bms_intersect('(b 1 3 5)', '(b 3 5 7)') AS result; SELECT test_bms_intersect('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- - + <> (1 row) --- Intersect with empty. +-- Intersect with empty SELECT test_bms_intersect('(b 1 3 5)', '(b)') AS result; result -------- - + <> +(1 row) + +-- Intersect with varying word counts +SELECT test_bms_intersect('(b 1 300)', '(b 1 2 3 4 5)') AS result; + result +-------- + (b 1) +(1 row) + +SELECT test_bms_intersect('(b 1 2 3 4 5)', '(b 1 300)') AS result; + result +-------- + (b 1) +(1 row) + +-- NULL inputs +SELECT test_bms_intersect('(b 5)', NULL) AS result; + result +-------- + <> +(1 row) + +SELECT test_bms_intersect(NULL, '(b 5)') AS result; + result +-------- + <> +(1 row) + +SELECT test_bms_intersect(NULL, NULL) AS result; + result +-------- + <> (1 row) -- bms_int_members() @@ -215,14 +421,14 @@ SELECT test_bms_int_members('(b 1 3 5)', '(b 3 5 7)') AS result; SELECT test_bms_int_members('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- - + <> (1 row) --- Intersect with empty. +-- Intersect with empty SELECT test_bms_int_members('(b 1 3 5)', '(b)') AS result; result -------- - + <> (1 row) -- Multiple members @@ -232,6 +438,25 @@ SELECT test_bms_int_members('(b 0 31 32 63 64)', '(b 31 32 64 65)') AS result; (b 31 32 64) (1 row) +-- NULL inputs +SELECT test_bms_int_members('(b 5)', NULL) AS result; + result +-------- + <> +(1 row) + +SELECT test_bms_int_members(NULL, '(b 5)') AS result; + result +-------- + <> +(1 row) + +SELECT test_bms_int_members(NULL, NULL) AS result; + result +-------- + <> +(1 row) + -- bms_difference() -- Overlapping sets SELECT test_bms_difference('(b 1 3 5)', '(b 3 5 7)') AS result; @@ -251,14 +476,14 @@ SELECT test_bms_difference('(b 1 3 5)', '(b 2 4 6)') AS result; 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 @@ -271,6 +496,38 @@ SELECT test_bms_difference( (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) +-- Difference with different word counts +SELECT test_bms_difference('(b 5 100)', '(b 5)') AS result; + result +--------- + (b 100) +(1 row) + +SELECT test_bms_difference('(b 1 2 100 200)', '(b 1 2)') AS result; + result +------------- + (b 100 200) +(1 row) + +-- NULL inputs +SELECT test_bms_difference('(b 5)', NULL) AS result; + result +-------- + (b 5) +(1 row) + +SELECT test_bms_difference(NULL, '(b 5)') AS result; + result +-------- + <> +(1 row) + +SELECT test_bms_difference(NULL, NULL) AS result; + result +-------- + <> +(1 row) + -- bms_is_member() SELECT test_bms_is_member('(b)', -5); -- error ERROR: negative bitmapset member not allowed @@ -298,6 +555,13 @@ SELECT test_bms_is_member('(b)', 1) AS result; f (1 row) +-- Test module check +SELECT test_bms_is_member('(b 5)', NULL) AS result; + result +-------- + +(1 row) + -- bms_member_index() SELECT test_bms_member_index(NULL, 1) AS result; result @@ -323,6 +587,32 @@ SELECT test_bms_member_index('(b 1 3 5)', 3) AS result; 1 (1 row) +-- Member index with various word positions +SELECT test_bms_member_index('(b 100 200)', 100) AS result; + result +-------- + 0 +(1 row) + +SELECT test_bms_member_index('(b 100 200)', 200) AS result; + result +-------- + 1 +(1 row) + +SELECT test_bms_member_index('(b 1 50 100 200)', 200) AS result; + result +-------- + 3 +(1 row) + +-- Test module check +SELECT test_bms_member_index('(b 1 3 5)', NULL) AS result; + result +-------- + +(1 row) + -- bms_num_members() SELECT test_bms_num_members('(b)') AS result; result @@ -373,6 +663,38 @@ SELECT test_bms_equal('(b 1 3 5)', '(b 2 4 6)') AS result; f (1 row) +-- Equal with different word counts +SELECT test_bms_equal('(b 5)', '(b 100)') AS result; + result +-------- + f +(1 row) + +SELECT test_bms_equal('(b 5 10)', '(b 100 200 300)') AS result; + result +-------- + f +(1 row) + +-- NULL inputs +SELECT test_bms_equal('(b 5)', NULL) AS result; + result +-------- + f +(1 row) + +SELECT test_bms_equal(NULL, '(b 5)') AS result; + result +-------- + f +(1 row) + +SELECT test_bms_equal(NULL, NULL) AS result; + result +-------- + t +(1 row) + -- bms_compare() SELECT test_bms_compare('(b)', '(b)') AS result; result @@ -419,6 +741,25 @@ SELECT test_bms_compare( -1 (1 row) +-- NULL inputs +SELECT test_bms_compare('(b 5)', NULL) AS result; + result +-------- + 1 +(1 row) + +SELECT test_bms_compare(NULL, '(b 5)') AS result; + result +-------- + -1 +(1 row) + +SELECT test_bms_compare(NULL, NULL) AS result; + result +-------- + 0 +(1 row) + -- bms_add_range() SELECT test_bms_add_range('(b)', -5, 10); -- error ERROR: negative bitmapset member not allowed @@ -474,6 +815,51 @@ SELECT length(test_bms_add_range('(b)', 1000, 1100)) AS result; 508 (1 row) +-- Force word count expansion +SELECT test_bms_add_range('(b 5)', 100, 105) AS result; + result +------------------------------- + (b 5 100 101 102 103 104 105) +(1 row) + +SELECT length(test_bms_add_range('(b 1 2)', 200, 250)) AS result; + result +-------- + 211 +(1 row) + +-- Test module checks +SELECT test_bms_add_range('(b 5)', 5, NULL) AS result; + result +-------- + +(1 row) + +SELECT test_bms_add_range('(b 5)', NULL, 10) AS result; + result +-------- + +(1 row) + +SELECT test_bms_add_range('(b 5)', NULL, NULL) AS result; + result +-------- + +(1 row) + +-- NULL inputs +SELECT test_bms_add_range(NULL, 5, 10) AS result; + result +------------------ + (b 5 6 7 8 9 10) +(1 row) + +SELECT test_bms_add_range(NULL, 10, 5) AS result; + result +-------- + <> +(1 row) + -- bms_membership() SELECT test_bms_membership('(b)') AS result; result @@ -493,6 +879,13 @@ SELECT test_bms_membership('(b 1 2)') AS result; 2 (1 row) +-- NULL input +SELECT test_bms_membership(NULL) AS result; + result +-------- + 0 +(1 row) + -- bms_is_empty() SELECT test_bms_is_empty(NULL) AS result; result @@ -513,6 +906,8 @@ SELECT test_bms_is_empty('(b 1)') AS result; (1 row) -- bms_singleton_member() +SELECT test_bms_singleton_member('(b)'); -- error +ERROR: bitmapset is empty SELECT test_bms_singleton_member('(b 1 2)'); -- error ERROR: bitmapset has multiple members SELECT test_bms_singleton_member('(b 42)') AS result; @@ -521,16 +916,36 @@ SELECT test_bms_singleton_member('(b 42)') AS result; 42 (1 row) +-- NULL input +SELECT test_bms_singleton_member(NULL) AS result; + result +-------- + +(1 row) + -- bms_get_singleton_member() +SELECT test_bms_get_singleton_member('(b)'); + test_bms_get_singleton_member +------------------------------- + -1 +(1 row) + +-- Try with an empty set +SELECT test_bms_get_singleton_member(NULL) AS result; + result +-------- + -1 +(1 row) + -- Not a singleton, returns input default -SELECT test_bms_get_singleton_member('(b 3 6)', 1000) AS result; +SELECT test_bms_get_singleton_member('(b 3 6)') AS result; result -------- - 1000 + -1 (1 row) -- Singletone, returns sole member -SELECT test_bms_get_singleton_member('(b 400)', 1000) AS result; +SELECT test_bms_get_singleton_member('(b 400)') AS result; result -------- 400 @@ -593,6 +1008,39 @@ SELECT test_bms_prev_member('(b)', 100) AS result; -2 (1 row) +-- Negative prevbit should result in highest possible bit in set +SELECT test_bms_prev_member('(b 0 63 64 127)', -1) AS result; + result +-------- + 127 +(1 row) + +-- NULL inputs +SELECT test_bms_next_member(NULL, 5) AS result; + result +-------- + -2 +(1 row) + +SELECT test_bms_prev_member(NULL, 5) AS result; + result +-------- + -2 +(1 row) + +-- Test module check +SELECT test_bms_next_member('(b 5 10)', NULL) AS result; + result +-------- + +(1 row) + +SELECT test_bms_prev_member('(b 5 10)', NULL) AS result; + result +-------- + +(1 row) + -- bms_hash_value() SELECT test_bms_hash_value('(b)') = 0 AS result; result @@ -612,6 +1060,13 @@ SELECT test_bms_hash_value('(b 1 3 5)') != test_bms_hash_value('(b 2 4 6)') AS r t (1 row) +-- NULL input +SELECT test_bms_hash_value(NULL) AS result; + result +-------- + 0 +(1 row) + -- bms_overlap() SELECT test_bms_overlap('(b 1 3 5)', '(b 3 5 7)') AS result; result @@ -631,6 +1086,25 @@ SELECT test_bms_overlap('(b)', '(b 1 3 5)') AS result; f (1 row) +-- NULL inputs +SELECT test_bms_overlap('(b 5)', NULL) AS result; + result +-------- + f +(1 row) + +SELECT test_bms_overlap(NULL, '(b 5)') AS result; + result +-------- + f +(1 row) + +SELECT test_bms_overlap(NULL, NULL) AS result; + result +-------- + f +(1 row) + -- bms_is_subset() SELECT test_bms_is_subset('(b)', '(b 1 3 5)') AS result; result @@ -663,6 +1137,38 @@ SELECT test_bms_is_subset(test_bms_add_range(NULL, 0, 31), t (1 row) +-- Is subset with shorter word counts? +SELECT test_bms_is_subset('(b 5 100)', '(b 5)') AS result; + result +-------- + f +(1 row) + +SELECT test_bms_is_subset('(b 1 2 50 100)', '(b 1 2)') AS result; + result +-------- + f +(1 row) + +-- NULL inputs +SELECT test_bms_is_subset('(b 5)', NULL) AS result; + result +-------- + f +(1 row) + +SELECT test_bms_is_subset(NULL, '(b 5)') AS result; + result +-------- + t +(1 row) + +SELECT test_bms_is_subset(NULL, NULL) AS result; + result +-------- + t +(1 row) + -- bms_subset_compare() SELECT test_bms_subset_compare(NULL, NULL) AS result; result @@ -670,13 +1176,43 @@ SELECT test_bms_subset_compare(NULL, NULL) AS result; 0 (1 row) +SELECT test_bms_subset_compare(NULL, '(b 1 3)') AS result; + result +-------- + 1 +(1 row) + +SELECT test_bms_subset_compare('(b)', '(b)') AS result; + result +-------- + 0 +(1 row) + +SELECT test_bms_subset_compare('(b)', '(b 1)') AS result; + result +-------- + 1 +(1 row) + +SELECT test_bms_subset_compare('(b 1)', '(b)') AS result; + result +-------- + 2 +(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; +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)', '(b 1 3 5)') AS result; result -------- 1 @@ -688,19 +1224,85 @@ SELECT test_bms_subset_compare('(b 1 3 5)', '(b 1 3)') AS result; 2 (1 row) -SELECT test_bms_subset_compare('(b 1 3)', '(b 1 3 5)') AS result; +SELECT test_bms_subset_compare('(b 1 2)', '(b 1 3)') AS result; + result +-------- + 3 +(1 row) + +SELECT test_bms_subset_compare('(b 1 2)', '(b 1 4)') AS result; + result +-------- + 3 +(1 row) + +SELECT test_bms_subset_compare('(b 1 3)', '(b 1 3 64)') AS result; result -------- 1 (1 row) -SELECT test_bms_subset_compare('(b 1 3 5)', '(b 1 3 5)') AS result; +SELECT test_bms_subset_compare('(b 1 3 64)', '(b 1 3)') AS result; result -------- - 0 + 2 +(1 row) + +SELECT test_bms_subset_compare('(b 1 3 64)', '(b 1 3 65)') AS result; + result +-------- + 3 +(1 row) + +SELECT test_bms_subset_compare('(b 1 3)', '(b 2 4)') AS result; + result +-------- + 3 +(1 row) + +SELECT test_bms_subset_compare('(b 1)', '(b 64)') AS result; + result +-------- + 3 +(1 row) + +SELECT test_bms_subset_compare('(b 0)', '(b 32)') AS result; + result +-------- + 3 +(1 row) + +SELECT test_bms_subset_compare('(b 0)', '(b 64)') AS result; + result +-------- + 3 +(1 row) + +SELECT test_bms_subset_compare('(b 64)', '(b 1)') AS result; + result +-------- + 3 +(1 row) + +SELECT test_bms_subset_compare('(b 1 2)', '(b 1 2 64)') AS result; + result +-------- + 1 +(1 row) + +SELECT test_bms_subset_compare('(b 64 200)', '(b 1 201)') AS result; + result +-------- + 3 (1 row) -SELECT test_bms_subset_compare('(b 1 3 5)', '(b 2 4 6)') AS result; +SELECT test_bms_subset_compare('(b 1 64 65)', '(b 1 2 64)') AS result; + result +-------- + 3 +(1 row) + +SELECT test_bms_subset_compare('(b 2 64 128)', '(b 1 65)') AS result; result -------- 3 @@ -710,7 +1312,7 @@ SELECT test_bms_subset_compare('(b 1 3 5)', '(b 2 4 6)') AS result; SELECT test_bms_copy(NULL) AS result; result -------- - + <> (1 row) SELECT test_bms_copy('(b 1 3 5 7)') AS result; @@ -720,12 +1322,6 @@ SELECT test_bms_copy('(b 1 3 5 7)') AS result; (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 ------------- @@ -769,6 +1365,13 @@ SELECT test_bitmap_hash('(b 1 3 5)') != test_bitmap_hash('(b 2 4 6)') AS result; t (1 row) +-- Test module check +SELECT test_bitmap_hash(NULL) AS result; + result +-------- + 0 +(1 row) + -- bitmap_match() SELECT test_bitmap_match('(b)', '(b)') AS result; result @@ -828,6 +1431,25 @@ SELECT (test_bitmap_match('(b)', '(b)') = 0) = t (1 row) +-- NULL inputs +SELECT test_bitmap_match('(b 5)', NULL) AS result; + result +-------- + 1 +(1 row) + +SELECT test_bitmap_match(NULL, '(b 5)') AS result; + result +-------- + 1 +(1 row) + +SELECT test_bitmap_match(NULL, NULL) AS result; + result +-------- + 0 +(1 row) + -- bms_overlap_list() SELECT test_bms_overlap_list('(b 0)', ARRAY[0]) AS result; result @@ -866,6 +1488,30 @@ SELECT test_bms_overlap_list('(b 1)', ARRAY[]::integer[]) AS result; f (1 row) +-- Overlap list with negative numbers +SELECT test_bms_overlap_list('(b 5 10)', ARRAY[-1,5]) AS result; -- error +ERROR: negative bitmapset member not allowed +SELECT test_bms_overlap_list('(b 1 2 3)', ARRAY[-5,-1,0]) AS result; -- error +ERROR: negative bitmapset member not allowed +-- NULL inputs +SELECT test_bms_overlap_list('(b 5)', NULL) AS result; + result +-------- + f +(1 row) + +SELECT test_bms_overlap_list(NULL, ARRAY[1,2,3]) AS result; + result +-------- + f +(1 row) + +SELECT test_bms_overlap_list(NULL, NULL) AS result; + result +-------- + f +(1 row) + -- bms_nonempty_difference() SELECT test_bms_nonempty_difference(NULL, '(b 1 3 5)') AS result; result @@ -879,6 +1525,12 @@ SELECT test_bms_nonempty_difference('(b 1 3 5)', NULL) AS result; t (1 row) +SELECT test_bms_nonempty_difference(NULL, NULL) AS result; + result +-------- + f +(1 row) + SELECT test_bms_nonempty_difference('(b 1 3 5)', '(b 2 4 6)') AS result; result -------- @@ -897,6 +1549,25 @@ SELECT test_bms_nonempty_difference('(b 1 3 5)', '(b 1 3 5)') AS result; f (1 row) +-- Difference with different word counts +SELECT test_bms_nonempty_difference('(b 5)', '(b 100)') AS result; + result +-------- + t +(1 row) + +SELECT test_bms_nonempty_difference('(b 100)', '(b 5)') AS result; + result +-------- + t +(1 row) + +SELECT test_bms_nonempty_difference('(b 1 2)', '(b 50 100)') AS result; + result +-------- + t +(1 row) + -- random operations SELECT test_random_operations(-1, 10000, 81920, 0) > 0 AS result; result diff --git a/src/test/modules/test_bitmapset/sql/test_bitmapset.sql b/src/test/modules/test_bitmapset/sql/test_bitmapset.sql index 2b2c72c876b..0a2fa151093 100644 --- a/src/test/modules/test_bitmapset/sql/test_bitmapset.sql +++ b/src/test/modules/test_bitmapset/sql/test_bitmapset.sql @@ -6,6 +6,8 @@ SELECT test_bms_make_singleton(-1); SELECT test_bms_make_singleton(42) AS result; SELECT test_bms_make_singleton(0) AS result; SELECT test_bms_make_singleton(1000) AS result; +-- Test module check +SELECT test_bms_make_singleton(NULL) AS result; -- bms_add_member() SELECT test_bms_add_member('(b 1)', -1); -- error @@ -16,6 +18,8 @@ SELECT test_bms_add_member('(b 5)', 10) AS result; SELECT test_bms_add_member('(b 10)', 5) AS result; -- idempotent change SELECT test_bms_add_member('(b 10)', 10) AS result; +-- Test module check +SELECT test_bms_add_member('(b)', NULL) AS result; -- bms_replace_members() SELECT test_bms_replace_members(NULL, '(b 1 2 3)') AS result; @@ -23,6 +27,8 @@ SELECT test_bms_replace_members('(b 1 2 3)', NULL) AS result; SELECT test_bms_replace_members('(b 1 2 3)', '(b 3 5 6)') AS result; SELECT test_bms_replace_members('(b 1 2 3)', '(b 3 5)') AS result; SELECT test_bms_replace_members('(b 1 2)', '(b 3 5 7)') AS result; +-- Force repalloc() with larger set +SELECT test_bms_replace_members('(b 1 2 3 4 5)', '(b 500 600)') AS result; -- bms_del_member() SELECT test_bms_del_member('(b)', -20); -- error @@ -34,15 +40,42 @@ SELECT test_bms_del_member('(b 1 2 3)', 2) AS result; SELECT test_bms_del_member(test_bms_del_member('(b 0 31 32 63 64)', 32), 63) AS result; -- Word boundary SELECT test_bms_del_member(test_bms_add_range('(b)', 30, 34), 32) AS result; +-- Force word count changes +SELECT test_bms_del_member('(b 1 200)', 200) AS result; +SELECT test_bms_del_member('(b 1 50 100 200)', 200) AS result; +SELECT test_bms_del_member('(b 1 50 100 200)', 100) AS result; +-- Test module checks +SELECT test_bms_del_member('(b 5)', NULL) AS result; + +-- bms_del_members() +SELECT test_bms_del_members('(b)', '(b 10)') AS result; +SELECT test_bms_del_members('(b 10)', '(b 10)') AS result; +SELECT test_bms_del_members('(b 10)', '(b 5)') AS result; +SELECT test_bms_del_members('(b 1 2 3)', '(b 2)') AS result; +SELECT test_bms_del_members('(b 5 100)', '(b 100)') AS result; +SELECT test_bms_del_members('(b 5 100 200)', '(b 200)') AS result; +-- Force word count changes +SELECT test_bms_del_members('(b 1 2 100 200 300)', '(b 1 2)') AS result; +SELECT test_bms_del_members('(b 1 2 100 200 300)', '(b 200 300)') AS result; +-- NULL inputs +SELECT test_bms_del_members('(b 5)', NULL) AS result; +SELECT test_bms_del_members(NULL, '(b 5)') AS result; -- bms_join() SELECT test_bms_join('(b 1 3 5)', NULL) AS result; SELECT test_bms_join(NULL, '(b 2 4 6)') AS result; SELECT test_bms_join('(b 1 3 5)', '(b 2 4 6)') AS result; SELECT test_bms_join('(b 1 3 5)', '(b 1 4 5)') AS result; +-- Force word count changes +SELECT test_bms_join('(b 5)', '(b 100)') AS result; +SELECT test_bms_join('(b 1 2)', '(b 100 200 300)') AS result; +-- NULL inputs +SELECT test_bms_join('(b 5)', NULL) AS result; +SELECT test_bms_join(NULL, '(b 5)') AS result; +SELECT test_bms_join(NULL, NULL) AS result; -- bms_union() --- Overlapping sets. +-- Overlapping sets SELECT test_bms_union('(b 1 3 5)', '(b 3 5 7)') AS result; -- Union with NULL SELECT test_bms_union('(b 1 3 5)', '(b)') AS result; @@ -53,24 +86,42 @@ SELECT test_bms_union( test_bms_add_range('(b)', 0, 15), test_bms_add_range('(b)', 10, 20) ) AS result; +-- Union with varying word counts +SELECT test_bms_union('(b 1 2)', '(b 100 300)') AS result; +SELECT test_bms_union('(b 100 300)', '(b 1 2)') AS result; +-- NULL inputs +SELECT test_bms_union('(b 5)', NULL) AS result; +SELECT test_bms_union(NULL, '(b 5)') AS result; +SELECT test_bms_union(NULL, NULL) AS result; -- bms_intersect() -- Overlapping sets SELECT test_bms_intersect('(b 1 3 5)', '(b 3 5 7)') AS result; -- Disjoint sets SELECT test_bms_intersect('(b 1 3 5)', '(b 2 4 6)') AS result; --- Intersect with empty. +-- Intersect with empty SELECT test_bms_intersect('(b 1 3 5)', '(b)') AS result; +-- Intersect with varying word counts +SELECT test_bms_intersect('(b 1 300)', '(b 1 2 3 4 5)') AS result; +SELECT test_bms_intersect('(b 1 2 3 4 5)', '(b 1 300)') AS result; +-- NULL inputs +SELECT test_bms_intersect('(b 5)', NULL) AS result; +SELECT test_bms_intersect(NULL, '(b 5)') AS result; +SELECT test_bms_intersect(NULL, NULL) AS result; -- bms_int_members() -- Overlapping sets SELECT test_bms_int_members('(b 1 3 5)', '(b 3 5 7)') AS result; -- Disjoint sets SELECT test_bms_int_members('(b 1 3 5)', '(b 2 4 6)') AS result; --- Intersect with empty. +-- Intersect with empty SELECT test_bms_int_members('(b 1 3 5)', '(b)') AS result; -- Multiple members SELECT test_bms_int_members('(b 0 31 32 63 64)', '(b 31 32 64 65)') AS result; +-- NULL inputs +SELECT test_bms_int_members('(b 5)', NULL) AS result; +SELECT test_bms_int_members(NULL, '(b 5)') AS result; +SELECT test_bms_int_members(NULL, NULL) AS result; -- bms_difference() -- Overlapping sets @@ -86,6 +137,13 @@ SELECT test_bms_difference( test_bms_add_range('(b)', 0, 100), test_bms_add_range('(b)', 50, 150) ) AS result; +-- Difference with different word counts +SELECT test_bms_difference('(b 5 100)', '(b 5)') AS result; +SELECT test_bms_difference('(b 1 2 100 200)', '(b 1 2)') AS result; +-- NULL inputs +SELECT test_bms_difference('(b 5)', NULL) AS result; +SELECT test_bms_difference(NULL, '(b 5)') AS result; +SELECT test_bms_difference(NULL, NULL) AS result; -- bms_is_member() SELECT test_bms_is_member('(b)', -5); -- error @@ -93,12 +151,20 @@ SELECT test_bms_is_member('(b 1 3 5)', 1) AS result; SELECT test_bms_is_member('(b 1 3 5)', 2) AS result; SELECT test_bms_is_member('(b 1 3 5)', 3) AS result; SELECT test_bms_is_member('(b)', 1) AS result; +-- Test module check +SELECT test_bms_is_member('(b 5)', NULL) AS result; -- bms_member_index() SELECT test_bms_member_index(NULL, 1) AS result; SELECT test_bms_member_index('(b 1 3 5)', 2) AS result; SELECT test_bms_member_index('(b 1 3 5)', 1) AS result; SELECT test_bms_member_index('(b 1 3 5)', 3) AS result; +-- Member index with various word positions +SELECT test_bms_member_index('(b 100 200)', 100) AS result; +SELECT test_bms_member_index('(b 100 200)', 200) AS result; +SELECT test_bms_member_index('(b 1 50 100 200)', 200) AS result; +-- Test module check +SELECT test_bms_member_index('(b 1 3 5)', NULL) AS result; -- bms_num_members() SELECT test_bms_num_members('(b)') AS result; @@ -111,6 +177,13 @@ SELECT test_bms_equal('(b)', '(b 1 3 5)') AS result; SELECT test_bms_equal('(b 1 3 5)', '(b)') AS result; SELECT test_bms_equal('(b 1 3 5)', '(b 1 3 5)') AS result; SELECT test_bms_equal('(b 1 3 5)', '(b 2 4 6)') AS result; +-- Equal with different word counts +SELECT test_bms_equal('(b 5)', '(b 100)') AS result; +SELECT test_bms_equal('(b 5 10)', '(b 100 200 300)') AS result; +-- NULL inputs +SELECT test_bms_equal('(b 5)', NULL) AS result; +SELECT test_bms_equal(NULL, '(b 5)') AS result; +SELECT test_bms_equal(NULL, NULL) AS result; -- bms_compare() SELECT test_bms_compare('(b)', '(b)') AS result; @@ -123,6 +196,10 @@ SELECT test_bms_compare( test_bms_add_range('(b)', 0, 63), test_bms_add_range('(b)', 0, 64) ) AS result; +-- NULL inputs +SELECT test_bms_compare('(b 5)', NULL) AS result; +SELECT test_bms_compare(NULL, '(b 5)') AS result; +SELECT test_bms_compare(NULL, NULL) AS result; -- bms_add_range() SELECT test_bms_add_range('(b)', -5, 10); -- error @@ -138,11 +215,23 @@ SELECT length(test_bms_add_range('(b)', 0, 1000)) AS result; -- Force reallocations SELECT length(test_bms_add_range('(b)', 0, 200)) AS result; SELECT length(test_bms_add_range('(b)', 1000, 1100)) AS result; +-- Force word count expansion +SELECT test_bms_add_range('(b 5)', 100, 105) AS result; +SELECT length(test_bms_add_range('(b 1 2)', 200, 250)) AS result; +-- Test module checks +SELECT test_bms_add_range('(b 5)', 5, NULL) AS result; +SELECT test_bms_add_range('(b 5)', NULL, 10) AS result; +SELECT test_bms_add_range('(b 5)', NULL, NULL) AS result; +-- NULL inputs +SELECT test_bms_add_range(NULL, 5, 10) AS result; +SELECT test_bms_add_range(NULL, 10, 5) AS result; -- bms_membership() SELECT test_bms_membership('(b)') AS result; SELECT test_bms_membership('(b 42)') AS result; SELECT test_bms_membership('(b 1 2)') AS result; +-- NULL input +SELECT test_bms_membership(NULL) AS result; -- bms_is_empty() SELECT test_bms_is_empty(NULL) AS result; @@ -150,14 +239,20 @@ SELECT test_bms_is_empty('(b)') AS result; SELECT test_bms_is_empty('(b 1)') AS result; -- bms_singleton_member() +SELECT test_bms_singleton_member('(b)'); -- error SELECT test_bms_singleton_member('(b 1 2)'); -- error SELECT test_bms_singleton_member('(b 42)') AS result; +-- NULL input +SELECT test_bms_singleton_member(NULL) AS result; -- bms_get_singleton_member() +SELECT test_bms_get_singleton_member('(b)'); +-- Try with an empty set +SELECT test_bms_get_singleton_member(NULL) AS result; -- Not a singleton, returns input default -SELECT test_bms_get_singleton_member('(b 3 6)', 1000) AS result; +SELECT test_bms_get_singleton_member('(b 3 6)') AS result; -- Singletone, returns sole member -SELECT test_bms_get_singleton_member('(b 400)', 1000) AS result; +SELECT test_bms_get_singleton_member('(b 400)') AS result; -- bms_next_member() and bms_prev_member() -- First member @@ -176,16 +271,30 @@ SELECT test_bms_prev_member('(b 5 10 15 20)', 20) AS result; SELECT test_bms_prev_member('(b 5 10 15 20)', 5) AS result; -- Empty set SELECT test_bms_prev_member('(b)', 100) AS result; +-- Negative prevbit should result in highest possible bit in set +SELECT test_bms_prev_member('(b 0 63 64 127)', -1) AS result; +-- NULL inputs +SELECT test_bms_next_member(NULL, 5) AS result; +SELECT test_bms_prev_member(NULL, 5) AS result; +-- Test module check +SELECT test_bms_next_member('(b 5 10)', NULL) AS result; +SELECT test_bms_prev_member('(b 5 10)', NULL) AS result; -- bms_hash_value() SELECT test_bms_hash_value('(b)') = 0 AS result; SELECT test_bms_hash_value('(b 1 3 5)') = test_bms_hash_value('(b 1 3 5)') AS result; SELECT test_bms_hash_value('(b 1 3 5)') != test_bms_hash_value('(b 2 4 6)') AS result; +-- NULL input +SELECT test_bms_hash_value(NULL) AS result; -- bms_overlap() SELECT test_bms_overlap('(b 1 3 5)', '(b 3 5 7)') AS result; SELECT test_bms_overlap('(b 1 3 5)', '(b 2 4 6)') AS result; SELECT test_bms_overlap('(b)', '(b 1 3 5)') AS result; +-- NULL inputs +SELECT test_bms_overlap('(b 5)', NULL) AS result; +SELECT test_bms_overlap(NULL, '(b 5)') AS result; +SELECT test_bms_overlap(NULL, NULL) AS result; -- bms_is_subset() SELECT test_bms_is_subset('(b)', '(b 1 3 5)') AS result; @@ -194,22 +303,44 @@ SELECT test_bms_is_subset('(b 1 3 5)', '(b 1 3)') AS result; SELECT test_bms_is_subset('(b 1 3)', '(b 2 4)') AS result; SELECT test_bms_is_subset(test_bms_add_range(NULL, 0, 31), test_bms_add_range(NULL, 0, 63)) AS result; +-- Is subset with shorter word counts? +SELECT test_bms_is_subset('(b 5 100)', '(b 5)') AS result; +SELECT test_bms_is_subset('(b 1 2 50 100)', '(b 1 2)') AS result; +-- NULL inputs +SELECT test_bms_is_subset('(b 5)', NULL) AS result; +SELECT test_bms_is_subset(NULL, '(b 5)') AS result; +SELECT test_bms_is_subset(NULL, NULL) AS result; -- bms_subset_compare() SELECT test_bms_subset_compare(NULL, NULL) AS result; -SELECT test_bms_subset_compare('(b 1 3)', NULL) AS result; SELECT test_bms_subset_compare(NULL, '(b 1 3)') AS result; -SELECT test_bms_subset_compare('(b 1 3 5)', '(b 1 3)') AS result; -SELECT test_bms_subset_compare('(b 1 3)', '(b 1 3 5)') AS result; +SELECT test_bms_subset_compare('(b)', '(b)') AS result; +SELECT test_bms_subset_compare('(b)', '(b 1)') AS result; +SELECT test_bms_subset_compare('(b 1)', '(b)') AS result; +SELECT test_bms_subset_compare('(b 1 3)', NULL) AS result; SELECT test_bms_subset_compare('(b 1 3 5)', '(b 1 3 5)') AS result; -SELECT test_bms_subset_compare('(b 1 3 5)', '(b 2 4 6)') AS result; +SELECT test_bms_subset_compare('(b 1 3)', '(b 1 3 5)') AS result; +SELECT test_bms_subset_compare('(b 1 3 5)', '(b 1 3)') AS result; +SELECT test_bms_subset_compare('(b 1 2)', '(b 1 3)') AS result; +SELECT test_bms_subset_compare('(b 1 2)', '(b 1 4)') AS result; +SELECT test_bms_subset_compare('(b 1 3)', '(b 1 3 64)') AS result; +SELECT test_bms_subset_compare('(b 1 3 64)', '(b 1 3)') AS result; +SELECT test_bms_subset_compare('(b 1 3 64)', '(b 1 3 65)') AS result; +SELECT test_bms_subset_compare('(b 1 3)', '(b 2 4)') AS result; +SELECT test_bms_subset_compare('(b 1)', '(b 64)') AS result; +SELECT test_bms_subset_compare('(b 0)', '(b 32)') AS result; +SELECT test_bms_subset_compare('(b 0)', '(b 64)') AS result; +SELECT test_bms_subset_compare('(b 64)', '(b 1)') AS result; +SELECT test_bms_subset_compare('(b 1 2)', '(b 1 2 64)') AS result; +SELECT test_bms_subset_compare('(b 64 200)', '(b 1 201)') AS result; +SELECT test_bms_subset_compare('(b 1 64 65)', '(b 1 2 64)') AS result; +SELECT test_bms_subset_compare('(b 2 64 128)', '(b 1 65)') AS result; -- bms_copy() SELECT test_bms_copy(NULL) AS result; SELECT test_bms_copy('(b 1 3 5 7)') AS result; -- bms_add_members() -SELECT test_bms_add_member('(b)', 1000); -- error SELECT test_bms_add_members('(b 1 3)', '(b 5 7)') AS result; SELECT test_bms_add_members('(b 1 3 5)', '(b 2 5 7)') AS result; SELECT test_bms_add_members('(b 1 3 5)', '(b 100 200 300)') AS result; @@ -219,6 +350,8 @@ SELECT test_bitmap_hash('(b)') = 0 AS result; SELECT test_bitmap_hash('(b 1 3 5)') = test_bitmap_hash('(b 1 3 5)') AS result; SELECT test_bitmap_hash('(b 1 3 5)') = test_bms_hash_value('(b 1 3 5)') AS result; SELECT test_bitmap_hash('(b 1 3 5)') != test_bitmap_hash('(b 2 4 6)') AS result; +-- Test module check +SELECT test_bitmap_hash(NULL) AS result; -- bitmap_match() SELECT test_bitmap_match('(b)', '(b)') AS result; @@ -234,6 +367,10 @@ 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; SELECT (test_bitmap_match('(b)', '(b)') = 0) = test_bms_equal('(b)', '(b)') AS result; +-- NULL inputs +SELECT test_bitmap_match('(b 5)', NULL) AS result; +SELECT test_bitmap_match(NULL, '(b 5)') AS result; +SELECT test_bitmap_match(NULL, NULL) AS result; -- bms_overlap_list() SELECT test_bms_overlap_list('(b 0)', ARRAY[0]) AS result; @@ -243,13 +380,25 @@ SELECT test_bms_overlap_list('(b 7 10)', ARRAY[6,7,8,9]) AS result; SELECT test_bms_overlap_list('(b 1 5)', ARRAY[6,7,8,9]) AS result; -- Empty list SELECT test_bms_overlap_list('(b 1)', ARRAY[]::integer[]) AS result; +-- Overlap list with negative numbers +SELECT test_bms_overlap_list('(b 5 10)', ARRAY[-1,5]) AS result; -- error +SELECT test_bms_overlap_list('(b 1 2 3)', ARRAY[-5,-1,0]) AS result; -- error +-- NULL inputs +SELECT test_bms_overlap_list('(b 5)', NULL) AS result; +SELECT test_bms_overlap_list(NULL, ARRAY[1,2,3]) AS result; +SELECT test_bms_overlap_list(NULL, NULL) AS result; -- bms_nonempty_difference() SELECT test_bms_nonempty_difference(NULL, '(b 1 3 5)') AS result; SELECT test_bms_nonempty_difference('(b 1 3 5)', NULL) AS result; +SELECT test_bms_nonempty_difference(NULL, NULL) AS result; SELECT test_bms_nonempty_difference('(b 1 3 5)', '(b 2 4 6)') AS result; SELECT test_bms_nonempty_difference('(b 1 3 5)', '(b 1 5)') AS result; SELECT test_bms_nonempty_difference('(b 1 3 5)', '(b 1 3 5)') AS result; +-- Difference with different word counts +SELECT test_bms_nonempty_difference('(b 5)', '(b 100)') AS result; +SELECT test_bms_nonempty_difference('(b 100)', '(b 5)') AS result; +SELECT test_bms_nonempty_difference('(b 1 2)', '(b 50 100)') AS result; -- random operations SELECT test_random_operations(-1, 10000, 81920, 0) > 0 AS result; diff --git a/src/test/modules/test_bitmapset/test_bitmapset--1.0.sql b/src/test/modules/test_bitmapset/test_bitmapset--1.0.sql index 95f5ee02e3f..227ecb5aa3b 100644 --- a/src/test/modules/test_bitmapset/test_bitmapset--1.0.sql +++ b/src/test/modules/test_bitmapset/test_bitmapset--1.0.sql @@ -68,7 +68,7 @@ CREATE FUNCTION test_bms_singleton_member(text) RETURNS integer STRICT AS 'MODULE_PATHNAME' LANGUAGE C; -CREATE FUNCTION test_bms_get_singleton_member(text, integer) +CREATE FUNCTION test_bms_get_singleton_member(text) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C; @@ -112,6 +112,10 @@ CREATE FUNCTION test_bms_int_members(text, text) RETURNS text AS 'MODULE_PATHNAME' LANGUAGE C; +CREATE FUNCTION test_bms_del_members(text, text) +RETURNS text +AS 'MODULE_PATHNAME' LANGUAGE C; + CREATE FUNCTION test_bms_replace_members(text, text) RETURNS text AS 'MODULE_PATHNAME' LANGUAGE C; diff --git a/src/test/modules/test_bitmapset/test_bitmapset.c b/src/test/modules/test_bitmapset/test_bitmapset.c index 5bc4daa23f1..0d6c2e7aa1b 100644 --- a/src/test/modules/test_bitmapset/test_bitmapset.c +++ b/src/test/modules/test_bitmapset/test_bitmapset.c @@ -26,7 +26,6 @@ #include "nodes/pg_list.h" #include "utils/builtins.h" #include "utils/timestamp.h" -#include "varatt.h" PG_MODULE_MAGIC; @@ -58,6 +57,7 @@ PG_FUNCTION_INFO_V1(test_bms_member_index); PG_FUNCTION_INFO_V1(test_bms_add_range); PG_FUNCTION_INFO_V1(test_bms_add_members); PG_FUNCTION_INFO_V1(test_bms_int_members); +PG_FUNCTION_INFO_V1(test_bms_del_members); PG_FUNCTION_INFO_V1(test_bms_replace_members); PG_FUNCTION_INFO_V1(test_bms_join); PG_FUNCTION_INFO_V1(test_bitmap_hash); @@ -88,110 +88,98 @@ PG_FUNCTION_INFO_V1(test_random_operations); #define TEXT_TO_BITMAPSET(str) ((Bitmapset *) stringToNode(text_to_cstring(str))) /* + * Helper macro to fetch text parameters as Bitmapsets. SQL-NULL means empty + * set. + */ +#define PG_ARG_GETBITMAPSET(n) \ + (PG_ARGISNULL(n) ? NULL : TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(n))) + +/* + * Helper macro to handle converting sets back to text, returning the + * resulting text representation of the set. + */ +#define PG_RETURN_BITMAPSET_AS_TEXT(bms) \ + PG_RETURN_TEXT_P(BITMAPSET_TO_TEXT(bms)) + +/* * Individual test functions for each bitmapset API function + * + * Primarily, we aim to keep these as close to simple wrapper functions as + * possible in order to publish the functions of bitmapset.c to the SQL layer + * with as little interference as possible. We opt to return SQL NULL in + * cases where the input given to the SQL function isn't valid to pass to the + * underlying bitmapset.c function. For example we cannot do much useful + * testing if someone calls test_bms_make_singleton(NULL) since + * bms_make_singleton() expects an integer argument. + * + * For function arguments which are to be converted to Bitmapsets, we accept + * SQL NULL as a valid argument to mean an empty set. Optionally callers may + * pass '(b)'. + * + * For the test functions which return a Bitmapset, these are converted back + * to text with result generated by nodeToString(). */ Datum test_bms_add_member(PG_FUNCTION_ARGS) { + Bitmapset *bms; int member; - Bitmapset *bms = NULL; - text *result; if (PG_ARGISNULL(1)) - PG_RETURN_NULL(); - - if (!PG_ARGISNULL(0)) - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); + PG_RETURN_NULL(); /* invalid input */ + bms = PG_ARG_GETBITMAPSET(0); member = PG_GETARG_INT32(1); - bms = bms_add_member(bms, member); - result = BITMAPSET_TO_TEXT(bms); - - if (bms) - bms_free(bms); - if (result == NULL) - PG_RETURN_NULL(); + bms = bms_add_member(bms, member); - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(bms); } Datum test_bms_add_members(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; - text *result; - - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); - - /* IMPORTANT: bms_add_members modifies/frees the first argument */ + /* left input is recycled */ bms1 = bms_add_members(bms1, bms2); - if (bms2) - bms_free(bms2); - - if (bms1 == NULL) - PG_RETURN_NULL(); - - result = BITMAPSET_TO_TEXT(bms1); - bms_free(bms1); - - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(bms1); } Datum test_bms_del_member(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; + Bitmapset *bms; int32 member; - text *result; if (PG_ARGISNULL(1)) - PG_RETURN_NULL(); - - if (!PG_ARGISNULL(0)) - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); + PG_RETURN_NULL(); /* invalid input */ + bms = PG_ARG_GETBITMAPSET(0); member = PG_GETARG_INT32(1); - bms = bms_del_member(bms, member); - if (bms == NULL || bms_is_empty(bms)) - { - if (bms) - bms_free(bms); - PG_RETURN_NULL(); - } - - result = BITMAPSET_TO_TEXT(bms); - bms_free(bms); + bms = bms_del_member(bms, member); - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(bms); } Datum test_bms_is_member(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; + Bitmapset *bms; int32 member; bool result; if (PG_ARGISNULL(1)) - PG_RETURN_BOOL(false); - - if (!PG_ARGISNULL(0)) - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); + PG_RETURN_NULL(); /* invalid input */ + bms = PG_ARG_GETBITMAPSET(0); member = PG_GETARG_INT32(1); - result = bms_is_member(member, bms); - if (bms) - bms_free(bms); + result = bms_is_member(member, bms); PG_RETURN_BOOL(result); } @@ -199,150 +187,89 @@ test_bms_is_member(PG_FUNCTION_ARGS) Datum test_bms_num_members(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; - int result = 0; - - if (!PG_ARGISNULL(0)) - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); + Bitmapset *bms = PG_ARG_GETBITMAPSET(0); + int result; result = bms_num_members(bms); - if (bms) - bms_free(bms); - PG_RETURN_INT32(result); } Datum test_bms_make_singleton(PG_FUNCTION_ARGS) { - int32 member; Bitmapset *bms; - text *result; + int32 member; if (PG_ARGISNULL(0)) - PG_RETURN_NULL(); + PG_RETURN_NULL(); /* invalid input */ member = PG_GETARG_INT32(0); bms = bms_make_singleton(member); - result = BITMAPSET_TO_TEXT(bms); - bms_free(bms); - - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(bms); } Datum test_bms_copy(PG_FUNCTION_ARGS) { - text *bms_data; - Bitmapset *bms = NULL; + Bitmapset *bms = PG_ARG_GETBITMAPSET(0); Bitmapset *copy_bms; - text *result; - - if (PG_ARGISNULL(0)) - PG_RETURN_NULL(); - bms_data = PG_GETARG_TEXT_PP(0); - bms = TEXT_TO_BITMAPSET(bms_data); copy_bms = bms_copy(bms); - result = BITMAPSET_TO_TEXT(copy_bms); - if (bms) - bms_free(bms); - if (copy_bms) - bms_free(copy_bms); - - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(copy_bms); } Datum test_bms_equal(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); bool result; - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); - result = bms_equal(bms1, bms2); - if (bms1) - bms_free(bms1); - if (bms2) - bms_free(bms2); - PG_RETURN_BOOL(result); } Datum test_bms_union(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); Bitmapset *result_bms; - text *result; - - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); result_bms = bms_union(bms1, bms2); - if (bms1) - bms_free(bms1); - if (bms2) - bms_free(bms2); - - if (result_bms == NULL) - PG_RETURN_NULL(); - - result = BITMAPSET_TO_TEXT(result_bms); - bms_free(result_bms); - - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(result_bms); } Datum test_bms_membership(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; + Bitmapset *bms = PG_ARG_GETBITMAPSET(0); BMS_Membership result; - if (PG_ARGISNULL(0)) - PG_RETURN_INT32(BMS_EMPTY_SET); - - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); result = bms_membership(bms); - if (bms) - bms_free(bms); - PG_RETURN_INT32((int32) result); } Datum test_bms_next_member(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; + Bitmapset *bms; int32 prevmember; int result; - if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) - PG_RETURN_INT32(-2); + if (PG_ARGISNULL(1)) + PG_RETURN_NULL(); /* invalid input */ - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); + bms = PG_ARG_GETBITMAPSET(0); prevmember = PG_GETARG_INT32(1); - result = bms_next_member(bms, prevmember); - if (bms) - bms_free(bms); + result = bms_next_member(bms, prevmember); PG_RETURN_INT32(result); } @@ -350,212 +277,115 @@ test_bms_next_member(PG_FUNCTION_ARGS) Datum test_bms_intersect(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); Bitmapset *result_bms; - text *result; - - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); result_bms = bms_intersect(bms1, bms2); - if (bms1) - bms_free(bms1); - if (bms2) - bms_free(bms2); - - if (result_bms == NULL) - PG_RETURN_NULL(); - - result = BITMAPSET_TO_TEXT(result_bms); - bms_free(result_bms); - - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(result_bms); } Datum test_bms_difference(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); Bitmapset *result_bms; - text *result; - - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); result_bms = bms_difference(bms1, bms2); - if (bms1) - bms_free(bms1); - if (bms2) - bms_free(bms2); - - if (result_bms == NULL) - PG_RETURN_NULL(); - - result = BITMAPSET_TO_TEXT(result_bms); - bms_free(result_bms); - - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(result_bms); } Datum test_bms_compare(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); int result; - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); - result = bms_compare(bms1, bms2); - if (bms1) - bms_free(bms1); - if (bms2) - bms_free(bms2); - PG_RETURN_INT32(result); } Datum test_bms_is_empty(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; + Bitmapset *bms = PG_ARG_GETBITMAPSET(0); bool result; - if (!PG_ARGISNULL(0)) - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - result = bms_is_empty(bms); - if (bms) - bms_free(bms); - PG_RETURN_BOOL(result); } Datum test_bms_is_subset(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); bool result; - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); - result = bms_is_subset(bms1, bms2); - if (bms1) - bms_free(bms1); - if (bms2) - bms_free(bms2); - PG_RETURN_BOOL(result); } Datum test_bms_subset_compare(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); BMS_Comparison result; - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); - result = bms_subset_compare(bms1, bms2); - if (bms1) - bms_free(bms1); - if (bms2) - bms_free(bms2); - PG_RETURN_INT32((int32) result); } Datum test_bms_singleton_member(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; + Bitmapset *bms = PG_ARG_GETBITMAPSET(0); int result; - if (!PG_ARGISNULL(0)) - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - result = bms_singleton_member(bms); - if (bms) - bms_free(bms); - PG_RETURN_INT32(result); } Datum test_bms_get_singleton_member(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; - int32 default_member = PG_GETARG_INT32(1); + Bitmapset *bms = PG_ARG_GETBITMAPSET(0); int member; - bool success; - - if (PG_ARGISNULL(0)) - PG_RETURN_INT32(default_member); - - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); /* - * bms_get_singleton_member returns bool and stores result in member - * pointer + * Keep this simple. Return -1 when we detect the set is not a singleton + * set, otherwise return the singleton member. */ - success = bms_get_singleton_member(bms, &member); - bms_free(bms); + if (!bms_get_singleton_member(bms, &member)) + member = -1; - if (success) - PG_RETURN_INT32(member); - else - PG_RETURN_INT32(default_member); + PG_RETURN_INT32(member); } Datum test_bms_prev_member(PG_FUNCTION_ARGS) { - text *bms_data; - Bitmapset *bms = NULL; + Bitmapset *bms; int32 prevmember; int result; - if (PG_ARGISNULL(0)) - PG_RETURN_INT32(-2); + if (PG_ARGISNULL(1)) + PG_RETURN_NULL(); /* invalid input */ - bms_data = PG_GETARG_TEXT_PP(0); + bms = PG_ARG_GETBITMAPSET(0); prevmember = PG_GETARG_INT32(1); - if (VARSIZE_ANY_EXHDR(bms_data) == 0) - PG_RETURN_INT32(-2); - - bms = TEXT_TO_BITMAPSET(bms_data); result = bms_prev_member(bms, prevmember); - bms_free(bms); PG_RETURN_INT32(result); } @@ -563,80 +393,57 @@ test_bms_prev_member(PG_FUNCTION_ARGS) Datum test_bms_overlap(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); bool result; - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); - result = bms_overlap(bms1, bms2); - if (bms1) - bms_free(bms1); - if (bms2) - bms_free(bms2); - PG_RETURN_BOOL(result); } Datum test_bms_overlap_list(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; + Bitmapset *bms; ArrayType *array; List *int_list = NIL; bool result; - Datum *elem_datums; - bool *elem_nulls; + Datum *elem_datums = NULL; + bool *elem_nulls = NULL; int elem_count; int i; - if (PG_ARGISNULL(0)) - PG_RETURN_BOOL(false); + bms = PG_ARG_GETBITMAPSET(0); - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (PG_ARGISNULL(1)) + if (!PG_ARGISNULL(1)) { - if (bms) - bms_free(bms); - PG_RETURN_BOOL(false); - } - - array = PG_GETARG_ARRAYTYPE_P(1); + array = PG_GETARG_ARRAYTYPE_P(1); - if (ARR_ELEMTYPE(array) != INT4OID) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("integer array expected"))); + deconstruct_array(array, + INT4OID, sizeof(int32), true, 'i', + &elem_datums, &elem_nulls, &elem_count); - deconstruct_array(array, - INT4OID, sizeof(int32), true, 'i', - &elem_datums, &elem_nulls, &elem_count); - - for (i = 0; i < elem_count; i++) - { - if (!elem_nulls[i]) + for (i = 0; i < elem_count; i++) { - int32 member = DatumGetInt32(elem_datums[i]); + if (!elem_nulls[i]) + { + int32 member = DatumGetInt32(elem_datums[i]); - int_list = lappend_int(int_list, member); + int_list = lappend_int(int_list, member); + } } } result = bms_overlap_list(bms, int_list); - if (bms) - bms_free(bms); - list_free(int_list); - pfree(elem_datums); - pfree(elem_nulls); + if (elem_datums) + pfree(elem_datums); + + if (elem_nulls) + pfree(elem_nulls); PG_RETURN_BOOL(result); } @@ -644,47 +451,29 @@ test_bms_overlap_list(PG_FUNCTION_ARGS) Datum test_bms_nonempty_difference(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); bool result; - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); - result = bms_nonempty_difference(bms1, bms2); - if (bms1) - bms_free(bms1); - if (bms2) - bms_free(bms2); - PG_RETURN_BOOL(result); } Datum test_bms_member_index(PG_FUNCTION_ARGS) { - text *bms_data; - Bitmapset *bms = NULL; + Bitmapset *bms; int32 member; int result; - if (PG_ARGISNULL(0)) - PG_RETURN_INT32(-1); + if (PG_ARGISNULL(1)) + PG_RETURN_NULL(); /* invalid input */ - bms_data = PG_GETARG_TEXT_PP(0); + bms = PG_ARG_GETBITMAPSET(0); member = PG_GETARG_INT32(1); - if (VARSIZE_ANY_EXHDR(bms_data) == 0) - PG_RETURN_INT32(-1); - - bms = TEXT_TO_BITMAPSET(bms_data); - result = bms_member_index(bms, member); - bms_free(bms); PG_RETURN_INT32(result); } @@ -692,160 +481,92 @@ test_bms_member_index(PG_FUNCTION_ARGS) Datum test_bms_add_range(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; + Bitmapset *bms; int32 lower, upper; - text *result; if (PG_ARGISNULL(1) || PG_ARGISNULL(2)) - PG_RETURN_NULL(); - - if (!PG_ARGISNULL(0)) - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); + PG_RETURN_NULL(); /* invalid input */ + bms = PG_ARG_GETBITMAPSET(0); lower = PG_GETARG_INT32(1); upper = PG_GETARG_INT32(2); - /* Check for invalid range */ - if (upper < lower) - { - if (bms) - bms_free(bms); - PG_RETURN_NULL(); - } - bms = bms_add_range(bms, lower, upper); - result = BITMAPSET_TO_TEXT(bms); - if (bms) - bms_free(bms); - - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(bms); } Datum test_bms_int_members(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; - text *result; - - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); + /* left input gets recycled */ bms1 = bms_int_members(bms1, bms2); - if (bms2) - bms_free(bms2); - - if (bms1 == NULL) - PG_RETURN_NULL(); + PG_RETURN_BITMAPSET_AS_TEXT(bms1); +} - result = BITMAPSET_TO_TEXT(bms1); +Datum +test_bms_del_members(PG_FUNCTION_ARGS) +{ + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); - if (bms1) - bms_free(bms1); + /* left input gets recycled */ + bms1 = bms_del_members(bms1, bms2); - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(bms1); } Datum test_bms_replace_members(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; - Bitmapset *result_bms; - text *result; - - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); - /* IMPORTANT: bms_replace_members modifies/frees the first argument */ - result_bms = bms_replace_members(bms1, bms2); + /* left input gets recycled */ + bms1 = bms_replace_members(bms1, bms2); - /* bms1 is now invalid, do not free it */ - - if (bms2) - bms_free(bms2); - - if (result_bms == NULL) - PG_RETURN_NULL(); - - result = BITMAPSET_TO_TEXT(result_bms); - bms_free(result_bms); - - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(bms1); } Datum test_bms_join(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); Bitmapset *result_bms; - text *result; - - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); - - /* IMPORTANT: bms_join may recycle either input arguments */ + /* either input can be recycled */ result_bms = bms_join(bms1, bms2); - /* bms1 and bms2 may have been recycled! Do not free any of them. */ - - if (result_bms == NULL) - PG_RETURN_NULL(); - - result = BITMAPSET_TO_TEXT(result_bms); - bms_free(result_bms); + /* memory cleanup seems more tricky than it's worth here */ - PG_RETURN_TEXT_P(result); + PG_RETURN_BITMAPSET_AS_TEXT(result_bms); } Datum test_bms_hash_value(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; + Bitmapset *bms = PG_ARG_GETBITMAPSET(0); uint32 hash_result; - if (!PG_ARGISNULL(0)) - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - hash_result = bms_hash_value(bms); - if (bms) - bms_free(bms); - PG_RETURN_INT32(hash_result); } Datum test_bitmap_hash(PG_FUNCTION_ARGS) { - Bitmapset *bms = NULL; - Bitmapset *bms_ptr; + Bitmapset *bms = PG_ARG_GETBITMAPSET(0); uint32 hash_result; - if (!PG_ARGISNULL(0)) - bms = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - bms_ptr = bms; - /* Call bitmap_hash */ - hash_result = bitmap_hash(&bms_ptr, sizeof(Bitmapset *)); - - /* Clean up */ - if (!PG_ARGISNULL(0) && bms_ptr) - bms_free(bms_ptr); + hash_result = bitmap_hash(&bms, sizeof(Bitmapset *)); PG_RETURN_INT32(hash_result); } @@ -853,30 +574,12 @@ test_bitmap_hash(PG_FUNCTION_ARGS) Datum test_bitmap_match(PG_FUNCTION_ARGS) { - Bitmapset *bms1 = NULL, - *bms2 = NULL; - Bitmapset *bms_ptr1, - *bms_ptr2; + Bitmapset *bms1 = PG_ARG_GETBITMAPSET(0); + Bitmapset *bms2 = PG_ARG_GETBITMAPSET(1); int match_result; - if (!PG_ARGISNULL(0)) - bms1 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(0)); - - if (!PG_ARGISNULL(1)) - bms2 = TEXT_TO_BITMAPSET(PG_GETARG_TEXT_PP(1)); - - /* Set up pointers to the Bitmapsets */ - bms_ptr1 = bms1; - bms_ptr2 = bms2; - /* Call bitmap_match with addresses of the Bitmapset pointers */ - match_result = bitmap_match(&bms_ptr1, &bms_ptr2, sizeof(Bitmapset *)); - - /* Clean up */ - if (bms1) - bms_free(bms1); - if (bms2) - bms_free(bms2); + match_result = bitmap_match(&bms1, &bms2, sizeof(Bitmapset *)); PG_RETURN_INT32(match_result); } @@ -1014,8 +717,7 @@ test_random_operations(PG_FUNCTION_ARGS) total_ops++; } - if (bms) - bms_free(bms); + bms_free(bms); PG_RETURN_INT32(total_ops); } |