@@ -271,6 +271,65 @@ TEST(FilterTest, createHugeintValuesEmpty) {
271271 EXPECT_FALSE (filter->testInt128 (0 ));
272272}
273273
274+ TEST (FilterTest, mergeWithHugeintValuesUsingHashTable) {
275+ auto valueAt = [](uint64_t highBits) {
276+ return HugeInt::build (highBits, /* lowBits=*/ 42 );
277+ };
278+
279+ const auto value1 = valueAt (1 );
280+ const auto value2 = valueAt (2 );
281+ const auto value3 = valueAt (3 );
282+ const auto value4 = valueAt (4 );
283+
284+ auto test =
285+ [](const Filter& left, const Filter& right, const Filter& expected) {
286+ auto merged = left.mergeWith (&right);
287+ ASSERT_TRUE (merged->testingEquals (expected));
288+ auto reverseMerged = right.mergeWith (&left);
289+ ASSERT_TRUE (reverseMerged->testingEquals (expected));
290+ };
291+
292+ {
293+ SCOPED_TRACE (" HugeintValuesUsingHashTable" );
294+ auto left = createHugeintValues ({value1, value2, value3}, true );
295+ auto right = createHugeintValues ({value2, value4}, false );
296+ auto expected = createHugeintValues ({value2}, false );
297+ test (*left, *right, *expected);
298+ }
299+
300+ {
301+ SCOPED_TRACE (" HugeintRange" );
302+ auto values = createHugeintValues ({value1, value2, value3}, true );
303+ auto range = betweenHugeint (value2, value4, true );
304+ auto expected = createHugeintValues ({value2, value3}, true );
305+ test (*values, *range, *expected);
306+ }
307+
308+ {
309+ SCOPED_TRACE (" HugeintRange intersection" );
310+ auto left = betweenHugeint (value1, value3, true );
311+ auto right = betweenHugeint (value2, value4, false );
312+ auto expected = betweenHugeint (value2, value3, false );
313+ test (*left, *right, *expected);
314+ }
315+
316+ {
317+ SCOPED_TRACE (" Disjoint ranges with nulls" );
318+ auto left = betweenHugeint (value1, value1, true );
319+ auto right = betweenHugeint (value2, value4, true );
320+ IsNull expected;
321+ test (*left, *right, expected);
322+ }
323+
324+ {
325+ SCOPED_TRACE (" Disjoint values with nulls" );
326+ auto left = createHugeintValues ({value1}, true );
327+ auto right = createHugeintValues ({value2}, true );
328+ IsNull expected;
329+ test (*left, *right, expected);
330+ }
331+ }
332+
274333TEST (FilterTest, negatedBigintRange) {
275334 auto filter = notEqual (1 , false );
276335 EXPECT_FALSE (filter->testNull ());
0 commit comments