Skip to content

feat: Add multi-column support for null-aware anti joins#19857

Open
viirya wants to merge 4 commits intoapache:mainfrom
viirya:multi-column-null-aware-anti-join
Open

feat: Add multi-column support for null-aware anti joins#19857
viirya wants to merge 4 commits intoapache:mainfrom
viirya:multi-column-null-aware-anti-join

Conversation

@viirya
Copy link
Member

@viirya viirya commented Jan 16, 2026

Which issue does this PR close?

  • Closes #.

Rationale for this change

What changes are included in this PR?

This commit extends null-aware anti join functionality to support multiple columns, enabling queries like:

SELECT * FROM t1 WHERE (a, b) NOT IN (SELECT x, y FROM t2);

and correlated multi-column NOT IN subqueries:

SELECT * FROM t1 WHERE (c2, c3) NOT IN (
  SELECT c2, c3 FROM t2 WHERE t1.c1 = t2.c1
);

Changes:

Physical Execution Layer:

  • Remove single-column validation restriction in HashJoinExec
  • Extend NULL detection in probe phase to check ANY column for NULLs
  • Extend NULL filtering in final phase to filter rows with ANY NULL column - Add comprehensive unit tests for 2-column and 3-column joins

SQL Planning Layer:

  • Allow tuple expressions in parse_in_subquery()
  • Add validation for tuple field count matching

Query Optimization Layer:

  • Update InSubquery validation to allow struct expressions
  • Skip type coercion for struct expressions (handled in decorrelation)
  • Implement struct decomposition in decorrelate_predicate_subquery
  • Decompose struct(a, b) into individual join conditions a = x AND b = y
  • Handle both correlated and non-correlated multi-column subqueries

Test Coverage:

  • Add 7 new SQL logic test cases (Tests 19-25)
  • Add 3 unit test functions with 15 test variants (5 batch sizes each)
  • Cover 2-column, 3-column, empty subquery, and NULL patterns
  • Include correlated multi-column NOT IN from issue DataFusion HashJoin LeftAnti doesn't support null aware anti join #10583
  • Add test coverage for multi-column IN subqueries to verify that the
    struct expression support works correctly for both negated (NOT IN)
    and non-negated (IN) cases.

Are these changes tested?

Are there any user-facing changes?

@viirya viirya changed the title Multi column null aware anti join feat: Add multi-column support for null-aware anti joins Jan 16, 2026
@github-actions github-actions bot added sql SQL Planner logical-expr Logical plan and expressions optimizer Optimizer rules sqllogictest SQL Logic Tests (.slt) physical-plan Changes to the physical-plan crate labels Jan 16, 2026
@viirya viirya force-pushed the multi-column-null-aware-anti-join branch 2 times, most recently from f61eabb to f6db769 Compare January 16, 2026 22:25
@viirya viirya force-pushed the multi-column-null-aware-anti-join branch from d07982f to 5662114 Compare February 8, 2026 22:26
@viirya viirya requested review from alamb and comphead February 8, 2026 22:27
@comphead
Copy link
Contributor

Thanks @viirya I'll check it soon, afaik there is no TPC* like queries that cover multiple column null aware anti joins, so it would be prob nice to have a bench in future to make sure no performance regression introduced with future PRs

@comphead
Copy link
Contributor

@2010YOUY01 @jonathanc-n FYI

viirya and others added 3 commits March 26, 2026 00:09
This commit extends null-aware anti join functionality to support
multiple columns, enabling queries like:

  SELECT * FROM t1 WHERE (a, b) NOT IN (SELECT x, y FROM t2);

and correlated multi-column NOT IN subqueries:

  SELECT * FROM t1 WHERE (c2, c3) NOT IN (
    SELECT c2, c3 FROM t2 WHERE t1.c1 = t2.c1
  );

Changes:

Physical Execution Layer:
- Remove single-column validation restriction in HashJoinExec
- Extend NULL detection in probe phase to check ANY column for NULLs
- Extend NULL filtering in final phase to filter rows with ANY NULL column
- Add comprehensive unit tests for 2-column and 3-column joins

SQL Planning Layer:
- Allow tuple expressions in parse_in_subquery()
- Add validation for tuple field count matching

Query Optimization Layer:
- Update InSubquery validation to allow struct expressions
- Skip type coercion for struct expressions (handled in decorrelation)
- Implement struct decomposition in decorrelate_predicate_subquery
  - Decompose struct(a, b) into individual join conditions a = x AND b = y
  - Handle both correlated and non-correlated multi-column subqueries

Test Coverage:
- Add 7 new SQL logic test cases (Tests 19-25)
- Add 3 unit test functions with 15 test variants (5 batch sizes each)
- Cover 2-column, 3-column, empty subquery, and NULL patterns
- Include correlated multi-column NOT IN from issue apache#10583

Test Results:
- 31/31 null-aware anti join tests passing
- 369/369 total hash join tests passing
- All optimizer tests passing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add test coverage for multi-column IN subqueries to verify that the
struct expression support works correctly for both negated (NOT IN)
and non-negated (IN) cases.

Tests added to subquery.slt:
- Test 1: Basic two-column IN
- Test 2: Multi-column IN with no matches
- Test 3: Multi-column IN with NULL values (verifies non-null-aware behavior)
- Test 4: Three-column IN
- Test 5: Correlated multi-column IN
- Test 6: Verify logical plan shows LeftSemi with multiple join conditions
- Test 7: Multi-column IN with empty subquery
- Test 8: Multi-column IN with WHERE clause in subquery

These tests complement the multi-column NOT IN tests in
null_aware_anti_join.slt and verify that struct decomposition
(converting `(a, b) IN (SELECT x, y ...)` into `a = x AND b = y`)
works correctly for LeftSemi joins.

Key differences from NOT IN:
- IN uses LeftSemi join (not null-aware)
- IN does not use CollectLeft partition mode
- NULL values don't match in regular semi joins (two-valued logic)

Related to multi-column null-aware anti join implementation.
- Collapse nested if statement in invariants.rs (clippy::collapsible_if)
- Collapse nested if statement in hash_join/exec.rs (clippy::collapsible_if)
- Use unwrap_or_else instead of unwrap_or for function calls in
  decorrelate_predicate_subquery.rs (clippy::or_fun_call)
@viirya viirya force-pushed the multi-column-null-aware-anti-join branch from 5662114 to 6613da5 Compare March 26, 2026 07:19
@Dandandan
Copy link
Contributor

Dandandan commented Mar 26, 2026

run benchmark tpcds

@adriangbot
Copy link

🤖 Criterion benchmark running (GKE) | trigger
Linux bench-c4132580418-557-qcnt8 6.12.55+ #1 SMP Sun Feb 1 08:59:41 UTC 2026 aarch64 GNU/Linux
Comparing multi-column-null-aware-anti-join (6613da5) to 4e2e4e8 (merge-base) diff
BENCH_NAME=tpc-ds
BENCH_COMMAND=cargo bench --features=parquet --bench tpc-ds
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot
Copy link

Benchmark for this request failed.

Last 20 lines of output:

Click to expand
    stats_merge
    strpos
    struct_query_sql
    substr
    substr_index
    substring
    sum
    to_char
    to_hex
    to_timestamp
    topk_aggregate
    topk_repartition
    translate
    trim
    trunc
    unhex
    upper
    uuid
    window_query_sql
    with_hashes

File an issue against this benchmark runner

@Dandandan
Copy link
Contributor

run benchmark tpcds

@Dandandan
Copy link
Contributor

Not sure if tpcds contains NA Anti Join, but it at least contains many join types

@adriangbot
Copy link

🤖 Benchmark running (GKE) | trigger
Linux bench-c4132611332-558-9q4bg 6.12.55+ #1 SMP Sun Feb 1 08:59:41 UTC 2026 aarch64 GNU/Linux
Comparing multi-column-null-aware-anti-join (6613da5) to 4e2e4e8 (merge-base) diff using: tpcds
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot
Copy link

🤖 Benchmark completed (GKE) | trigger

Details

Comparing HEAD and multi-column-null-aware-anti-join
--------------------
Benchmark tpcds_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                     HEAD ┃        multi-column-null-aware-anti-join ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │           43.83 / 44.48 ±0.78 / 45.74 ms │           43.31 / 44.09 ±0.73 / 45.47 ms │     no change │
│ QQuery 2  │        146.21 / 147.16 ±0.77 / 148.28 ms │        147.17 / 147.48 ±0.36 / 147.92 ms │     no change │
│ QQuery 3  │        116.32 / 117.06 ±0.54 / 117.70 ms │        115.53 / 116.25 ±0.53 / 117.10 ms │     no change │
│ QQuery 4  │     1318.18 / 1335.72 ±8.89 / 1342.24 ms │    1302.77 / 1339.59 ±27.16 / 1375.30 ms │     no change │
│ QQuery 5  │        173.39 / 175.18 ±1.71 / 177.99 ms │        175.20 / 176.42 ±1.06 / 178.04 ms │     no change │
│ QQuery 6  │     976.93 / 1017.94 ±25.92 / 1054.05 ms │     983.14 / 1014.13 ±27.67 / 1053.44 ms │     no change │
│ QQuery 7  │        354.18 / 357.36 ±2.47 / 361.50 ms │        352.61 / 356.67 ±3.24 / 359.99 ms │     no change │
│ QQuery 8  │        116.72 / 117.72 ±1.19 / 120.07 ms │        115.87 / 116.81 ±0.74 / 117.72 ms │     no change │
│ QQuery 9  │        102.03 / 105.59 ±2.94 / 108.74 ms │        107.50 / 112.35 ±8.61 / 129.55 ms │  1.06x slower │
│ QQuery 10 │        108.19 / 109.89 ±1.06 / 110.86 ms │        107.98 / 109.25 ±0.69 / 109.88 ms │     no change │
│ QQuery 11 │       908.88 / 932.51 ±15.90 / 956.37 ms │       885.34 / 923.46 ±27.79 / 960.12 ms │     no change │
│ QQuery 12 │           46.06 / 47.12 ±0.70 / 48.11 ms │           45.21 / 45.71 ±0.39 / 46.38 ms │     no change │
│ QQuery 13 │        403.29 / 407.02 ±2.30 / 410.46 ms │        400.29 / 403.12 ±3.05 / 408.99 ms │     no change │
│ QQuery 14 │     1029.55 / 1041.76 ±8.13 / 1052.07 ms │     1027.32 / 1035.48 ±6.46 / 1041.60 ms │     no change │
│ QQuery 15 │           16.56 / 17.29 ±0.53 / 18.11 ms │           15.73 / 16.96 ±0.86 / 17.87 ms │     no change │
│ QQuery 16 │           41.90 / 42.93 ±0.73 / 44.12 ms │           41.38 / 42.25 ±0.92 / 43.90 ms │     no change │
│ QQuery 17 │        245.22 / 247.74 ±1.53 / 249.40 ms │        239.64 / 240.72 ±0.66 / 241.59 ms │     no change │
│ QQuery 18 │        131.28 / 133.03 ±1.12 / 134.30 ms │        129.15 / 130.47 ±0.95 / 131.92 ms │     no change │
│ QQuery 19 │        158.07 / 159.11 ±1.04 / 161.08 ms │        156.74 / 158.82 ±1.44 / 160.64 ms │     no change │
│ QQuery 20 │           14.21 / 15.37 ±0.77 / 16.32 ms │           13.80 / 14.39 ±0.61 / 15.46 ms │ +1.07x faster │
│ QQuery 21 │           20.81 / 21.12 ±0.22 / 21.37 ms │           19.99 / 20.26 ±0.29 / 20.80 ms │     no change │
│ QQuery 22 │        493.95 / 496.55 ±1.48 / 498.39 ms │        487.27 / 491.13 ±3.32 / 496.07 ms │     no change │
│ QQuery 23 │        916.18 / 922.08 ±6.99 / 935.23 ms │        896.75 / 908.58 ±8.32 / 918.52 ms │     no change │
│ QQuery 24 │        418.66 / 421.78 ±2.93 / 427.12 ms │        420.02 / 423.04 ±3.35 / 429.56 ms │     no change │
│ QQuery 25 │        354.94 / 360.65 ±3.68 / 365.79 ms │        358.66 / 360.03 ±0.90 / 361.03 ms │     no change │
│ QQuery 26 │           84.89 / 85.93 ±0.79 / 87.09 ms │           82.96 / 84.51 ±1.72 / 87.71 ms │     no change │
│ QQuery 27 │        351.74 / 354.72 ±3.43 / 360.26 ms │        347.83 / 352.22 ±2.92 / 355.67 ms │     no change │
│ QQuery 28 │        150.47 / 153.64 ±1.73 / 155.63 ms │        150.58 / 151.68 ±1.09 / 153.25 ms │     no change │
│ QQuery 29 │        304.54 / 308.63 ±3.86 / 314.17 ms │        299.22 / 302.51 ±3.00 / 307.86 ms │     no change │
│ QQuery 30 │           43.75 / 46.65 ±2.47 / 50.74 ms │           43.52 / 45.83 ±1.63 / 48.58 ms │     no change │
│ QQuery 31 │        171.49 / 174.14 ±1.77 / 176.36 ms │        171.63 / 174.30 ±1.66 / 176.08 ms │     no change │
│ QQuery 32 │         57.66 / 67.54 ±17.15 / 101.79 ms │           57.71 / 59.09 ±1.14 / 60.54 ms │ +1.14x faster │
│ QQuery 33 │        144.20 / 145.25 ±0.76 / 146.50 ms │        142.15 / 144.13 ±1.39 / 145.86 ms │     no change │
│ QQuery 34 │        108.82 / 109.88 ±1.04 / 111.73 ms │        107.76 / 108.62 ±0.72 / 109.75 ms │     no change │
│ QQuery 35 │        110.99 / 112.62 ±0.87 / 113.41 ms │        110.10 / 111.19 ±1.11 / 113.20 ms │     no change │
│ QQuery 36 │        217.46 / 224.74 ±4.61 / 230.43 ms │        216.54 / 220.79 ±3.76 / 225.36 ms │     no change │
│ QQuery 37 │        180.41 / 184.25 ±2.30 / 186.85 ms │        179.45 / 181.42 ±1.34 / 183.52 ms │     no change │
│ QQuery 38 │           89.32 / 91.84 ±2.78 / 96.01 ms │           85.64 / 89.98 ±3.81 / 96.51 ms │     no change │
│ QQuery 39 │        124.50 / 130.42 ±3.89 / 136.67 ms │        129.92 / 132.65 ±2.37 / 135.43 ms │     no change │
│ QQuery 40 │        114.26 / 119.79 ±5.41 / 129.80 ms │        116.16 / 119.54 ±5.34 / 130.15 ms │     no change │
│ QQuery 41 │           14.74 / 15.91 ±0.71 / 16.79 ms │           14.58 / 15.96 ±1.05 / 17.31 ms │     no change │
│ QQuery 42 │        108.67 / 110.20 ±0.85 / 111.07 ms │        109.11 / 110.81 ±0.97 / 112.00 ms │     no change │
│ QQuery 43 │           84.01 / 85.47 ±0.90 / 86.82 ms │           84.92 / 86.07 ±1.05 / 87.41 ms │     no change │
│ QQuery 44 │           12.32 / 12.48 ±0.17 / 12.81 ms │           11.45 / 11.86 ±0.32 / 12.33 ms │ +1.05x faster │
│ QQuery 45 │           53.98 / 55.49 ±0.89 / 56.65 ms │           52.75 / 54.47 ±1.14 / 56.20 ms │     no change │
│ QQuery 46 │        236.05 / 238.07 ±1.14 / 239.41 ms │        232.13 / 235.67 ±2.35 / 238.90 ms │     no change │
│ QQuery 47 │       693.34 / 718.06 ±16.10 / 741.93 ms │        691.86 / 704.19 ±8.70 / 714.81 ms │     no change │
│ QQuery 48 │        289.45 / 295.56 ±5.22 / 302.94 ms │        291.82 / 293.85 ±3.10 / 300.00 ms │     no change │
│ QQuery 49 │        256.17 / 259.32 ±2.88 / 263.76 ms │        254.94 / 256.85 ±2.36 / 260.84 ms │     no change │
│ QQuery 50 │        236.05 / 238.86 ±3.51 / 245.00 ms │        231.86 / 234.50 ±2.35 / 237.93 ms │     no change │
│ QQuery 51 │        183.08 / 189.42 ±4.47 / 195.93 ms │        188.83 / 191.15 ±2.02 / 193.76 ms │     no change │
│ QQuery 52 │        108.99 / 110.06 ±0.66 / 111.04 ms │        110.09 / 111.24 ±0.96 / 112.84 ms │     no change │
│ QQuery 53 │        103.49 / 104.18 ±0.63 / 105.31 ms │        105.87 / 107.09 ±0.90 / 108.56 ms │     no change │
│ QQuery 54 │        148.12 / 149.81 ±1.88 / 153.33 ms │        150.72 / 151.89 ±1.56 / 154.69 ms │     no change │
│ QQuery 55 │        108.98 / 111.00 ±1.87 / 113.69 ms │        109.27 / 110.39 ±1.01 / 112.28 ms │     no change │
│ QQuery 56 │        143.43 / 145.10 ±1.68 / 148.03 ms │        144.87 / 145.69 ±0.56 / 146.43 ms │     no change │
│ QQuery 57 │        178.73 / 180.46 ±1.51 / 182.61 ms │        178.24 / 179.32 ±0.93 / 181.06 ms │     no change │
│ QQuery 58 │       295.59 / 308.05 ±11.94 / 324.77 ms │        297.21 / 305.11 ±6.36 / 314.08 ms │     no change │
│ QQuery 59 │        197.88 / 200.82 ±2.19 / 203.82 ms │        203.20 / 204.87 ±0.88 / 205.66 ms │     no change │
│ QQuery 60 │        144.17 / 146.66 ±1.54 / 148.48 ms │        148.65 / 149.86 ±0.81 / 150.79 ms │     no change │
│ QQuery 61 │        173.03 / 174.47 ±0.82 / 175.26 ms │        174.07 / 175.60 ±1.08 / 177.31 ms │     no change │
│ QQuery 62 │        928.31 / 940.78 ±8.68 / 951.41 ms │       881.70 / 920.22 ±31.31 / 970.43 ms │     no change │
│ QQuery 63 │        105.06 / 107.54 ±2.52 / 111.73 ms │        106.19 / 108.64 ±1.60 / 110.49 ms │     no change │
│ QQuery 64 │        714.18 / 717.77 ±3.02 / 722.59 ms │        702.07 / 705.06 ±3.71 / 711.51 ms │     no change │
│ QQuery 65 │        257.73 / 260.58 ±2.32 / 263.22 ms │        253.11 / 256.56 ±3.22 / 262.46 ms │     no change │
│ QQuery 66 │        248.65 / 256.39 ±5.54 / 262.34 ms │        243.88 / 253.67 ±8.19 / 263.92 ms │     no change │
│ QQuery 67 │        319.17 / 321.87 ±2.96 / 327.32 ms │        314.63 / 317.13 ±2.10 / 321.03 ms │     no change │
│ QQuery 68 │        282.59 / 287.94 ±4.19 / 294.81 ms │        281.82 / 286.47 ±3.05 / 290.84 ms │     no change │
│ QQuery 69 │        104.85 / 107.06 ±3.00 / 112.91 ms │        103.82 / 106.11 ±1.48 / 108.00 ms │     no change │
│ QQuery 70 │       336.33 / 352.78 ±12.21 / 373.19 ms │       329.23 / 339.61 ±12.22 / 363.38 ms │     no change │
│ QQuery 71 │        137.31 / 138.16 ±0.90 / 139.81 ms │        134.47 / 136.82 ±1.88 / 139.88 ms │     no change │
│ QQuery 72 │       714.00 / 735.13 ±23.66 / 780.30 ms │       711.30 / 735.79 ±14.74 / 751.21 ms │     no change │
│ QQuery 73 │        103.18 / 106.39 ±2.30 / 109.20 ms │        105.75 / 108.36 ±3.10 / 113.66 ms │     no change │
│ QQuery 74 │        579.47 / 592.96 ±9.58 / 605.62 ms │       574.38 / 622.50 ±29.78 / 654.64 ms │     no change │
│ QQuery 75 │        278.60 / 282.13 ±1.83 / 283.80 ms │        282.42 / 289.49 ±3.84 / 293.37 ms │     no change │
│ QQuery 76 │        133.09 / 134.84 ±1.42 / 137.33 ms │        138.55 / 139.19 ±0.48 / 139.90 ms │     no change │
│ QQuery 77 │        188.52 / 192.32 ±2.32 / 195.51 ms │        189.12 / 192.93 ±2.10 / 194.90 ms │     no change │
│ QQuery 78 │        359.65 / 364.01 ±3.02 / 366.75 ms │        348.34 / 354.51 ±4.27 / 360.49 ms │     no change │
│ QQuery 79 │        245.19 / 249.52 ±2.98 / 252.64 ms │        236.97 / 237.98 ±0.98 / 239.73 ms │     no change │
│ QQuery 80 │        331.90 / 337.17 ±3.40 / 342.21 ms │        330.97 / 332.74 ±1.02 / 334.08 ms │     no change │
│ QQuery 81 │           28.66 / 30.18 ±1.62 / 33.20 ms │           26.16 / 27.56 ±1.21 / 29.12 ms │ +1.09x faster │
│ QQuery 82 │        203.91 / 207.17 ±2.42 / 210.21 ms │        203.99 / 205.52 ±1.48 / 207.82 ms │     no change │
│ QQuery 83 │           40.55 / 42.37 ±1.34 / 43.99 ms │           38.40 / 40.75 ±1.44 / 42.86 ms │     no change │
│ QQuery 84 │           49.62 / 50.86 ±1.08 / 52.18 ms │           49.13 / 49.80 ±0.48 / 50.55 ms │     no change │
│ QQuery 85 │        153.00 / 154.47 ±1.35 / 156.72 ms │        149.41 / 150.98 ±1.67 / 154.22 ms │     no change │
│ QQuery 86 │           40.79 / 42.04 ±0.97 / 43.45 ms │           38.25 / 39.60 ±1.31 / 41.28 ms │ +1.06x faster │
│ QQuery 87 │           86.64 / 90.50 ±3.92 / 97.56 ms │           84.53 / 88.29 ±3.39 / 94.69 ms │     no change │
│ QQuery 88 │        101.02 / 101.80 ±0.79 / 103.12 ms │        100.51 / 101.92 ±0.84 / 102.77 ms │     no change │
│ QQuery 89 │        120.00 / 121.30 ±1.05 / 122.53 ms │        119.10 / 120.92 ±1.16 / 122.61 ms │     no change │
│ QQuery 90 │           23.69 / 24.39 ±0.46 / 25.07 ms │           23.96 / 24.79 ±0.62 / 25.70 ms │     no change │
│ QQuery 91 │           64.94 / 66.92 ±1.16 / 68.09 ms │           62.85 / 64.59 ±1.07 / 65.64 ms │     no change │
│ QQuery 92 │           58.27 / 59.03 ±0.85 / 60.50 ms │           58.12 / 58.99 ±0.78 / 59.94 ms │     no change │
│ QQuery 93 │        189.68 / 192.58 ±2.47 / 197.13 ms │        189.91 / 191.49 ±0.92 / 192.67 ms │     no change │
│ QQuery 94 │           62.20 / 62.74 ±0.59 / 63.83 ms │           60.69 / 61.84 ±0.62 / 62.55 ms │     no change │
│ QQuery 95 │        133.81 / 137.41 ±1.99 / 139.20 ms │        133.63 / 135.07 ±1.05 / 136.54 ms │     no change │
│ QQuery 96 │           73.80 / 75.51 ±1.23 / 77.54 ms │           76.32 / 76.87 ±0.31 / 77.22 ms │     no change │
│ QQuery 97 │        130.18 / 133.14 ±2.37 / 136.33 ms │        130.53 / 135.82 ±2.77 / 138.65 ms │     no change │
│ QQuery 98 │        156.33 / 157.92 ±1.18 / 159.89 ms │        152.35 / 157.35 ±3.55 / 161.90 ms │     no change │
│ QQuery 99 │ 10713.08 / 10785.09 ±43.20 / 10843.97 ms │ 10730.66 / 10761.22 ±23.32 / 10798.69 ms │     no change │
└───────────┴──────────────────────────────────────────┴──────────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Benchmark Summary                                ┃            ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ Total Time (HEAD)                                │ 33974.38ms │
│ Total Time (multi-column-null-aware-anti-join)   │ 33799.52ms │
│ Average Time (HEAD)                              │   343.18ms │
│ Average Time (multi-column-null-aware-anti-join) │   341.41ms │
│ Queries Faster                                   │          5 │
│ Queries Slower                                   │          1 │
│ Queries with No Change                           │         93 │
│ Queries with Failure                             │          0 │
└──────────────────────────────────────────────────┴────────────┘

Resource Usage

tpcds — base (merge-base)

Metric Value
Wall time 170.2s
Peak memory 5.8 GiB
Avg memory 4.7 GiB
CPU user 273.4s
CPU sys 19.0s
Disk read 0 B
Disk write 702.8 MiB

tpcds — branch

Metric Value
Wall time 169.3s
Peak memory 5.9 GiB
Avg memory 4.7 GiB
CPU user 272.5s
CPU sys 18.4s
Disk read 0 B
Disk write 148.0 KiB

File an issue against this benchmark runner

Upstream changed EXPLAIN to show both logical and physical plans by
default. Update the multi-column IN test to match the new output format.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

logical-expr Logical plan and expressions optimizer Optimizer rules physical-plan Changes to the physical-plan crate sql SQL Planner sqllogictest SQL Logic Tests (.slt)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants