@@ -1222,6 +1222,51 @@ TEST_P(MultiThreadedHashJoinTest, nullAwareAntiJoinWithFilterAndNullKey) {
1222
1222
}
1223
1223
}
1224
1224
1225
+ TEST_P (
1226
+ MultiThreadedHashJoinTest,
1227
+ hashModeNullAwareAntiJoinWithFilterAndNullKey) {
1228
+ // Use float type keys to trigger hash mode table.
1229
+ auto probeVectors = makeBatches (50 , [&](int32_t /* unused*/ ) {
1230
+ return makeRowVector (
1231
+ {" t0" , " t1" },
1232
+ {
1233
+ makeNullableFlatVector<float >({std::nullopt, 1 , 2 }),
1234
+ makeFlatVector<int32_t >({1 , 1 , 2 }),
1235
+ });
1236
+ });
1237
+ auto buildVectors = makeBatches (5 , [&](int32_t /* unused*/ ) {
1238
+ return makeRowVector (
1239
+ {" u0" , " u1" },
1240
+ {
1241
+ makeNullableFlatVector<float >({std::nullopt, 2 , 3 }),
1242
+ makeFlatVector<int32_t >({0 , 2 , 3 }),
1243
+ });
1244
+ });
1245
+
1246
+ std::vector<std::string> filters ({" u1 < t1" , " u1 + t1 = 0" });
1247
+ for (const std::string& filter : filters) {
1248
+ const auto referenceSql = fmt::format (
1249
+ " SELECT t.* FROM t WHERE t0 NOT IN (SELECT u0 FROM u WHERE {})" ,
1250
+ filter);
1251
+
1252
+ auto testProbeVectors = probeVectors;
1253
+ auto testBuildVectors = buildVectors;
1254
+ HashJoinBuilder (*pool_, duckDbQueryRunner_, driverExecutor_.get ())
1255
+ .numDrivers (numDrivers_)
1256
+ .probeKeys ({" t0" })
1257
+ .probeVectors (std::move (testProbeVectors))
1258
+ .buildKeys ({" u0" })
1259
+ .buildVectors (std::move (testBuildVectors))
1260
+ .joinType (core::JoinType::kAnti )
1261
+ .nullAware (true )
1262
+ .joinFilter (filter)
1263
+ .joinOutputLayout ({" t0" , " t1" })
1264
+ .referenceQuery (referenceSql)
1265
+ .checkSpillStats (false )
1266
+ .run ();
1267
+ }
1268
+ }
1269
+
1225
1270
TEST_P (MultiThreadedHashJoinTest, nullAwareAntiJoinWithFilterOnNullableColumn) {
1226
1271
const std::string referenceSql =
1227
1272
" SELECT t.* FROM t WHERE t0 NOT IN (SELECT u0 FROM u WHERE t1 <> u1)" ;
0 commit comments