Commit 1198bf8
fix(scan): pre-check filter pushability before pushing limit/offset (#192)
When DuckDB pushes both LIMIT and filters to the Lance table function but
Lance's IR encoder cannot encode all filters (e.g., LIKE with interior
wildcards, unsupported column types, 'infinity' literals, complex
expressions), two distinct failure modes occurred:
1. "IO Error: Lance limit/offset pushdown requires filter pushdown" —
thrown from LanceScanInitGlobal, failing the query entirely.
2. Silent correctness bug: if the throw path wasn't triggered, Lance
applied LIMIT without the filter, returning wrong rows.
Fix: add a shared `ProbeLanceTableFilterIR(get, names, types)` helper in
lance_filter_ir.cpp that owns the "are these filters fully encodable?"
invariant in one place. Both optimizer passes that depend on this
invariant use it:
- LanceLimitOffsetPushdown: if probe returns !all_filters_pushed, keep
LogicalLimit in the plan and skip limit pushdown. DuckDB then applies
both filter and LIMIT on top of the scan output — correct semantics,
no throw.
- LanceExecPushdown: unchanged behavior (still bails if not pushable),
but now uses the shared helper instead of duplicating the probe setup.
Having both passes call the same helper eliminates the risk of
optimizer-layer divergence. The defensive throw at LanceScanInitGlobal
is retained as an invariant guard — unreachable from either optimizer
pass, but kept in case future code paths construct a scan with pushed
LIMIT and non-encodable filters.
Test: new test/sql/pushdown_limit_filter_fallback.test covers:
- LIMIT/OFFSET with a non-encodable filter (returns correct row counts)
- Semantically-correct row identity (not just count)
- Selective filter (ensures filter isn't silently dropped)
- Sparse projection (probe column_ids layout doesn't diverge from init)
- Pushable filters still push down as before (no regression)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 parent 1b4ef68 commit 1198bf8
File tree
4 files changed
+222
-14
lines changed- src
- include
- test/sql
4 files changed
+222
-14
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
23 | 36 | | |
24 | 37 | | |
25 | 38 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
424 | 424 | | |
425 | 425 | | |
426 | 426 | | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
427 | 456 | | |
428 | 457 | | |
429 | 458 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1304 | 1304 | | |
1305 | 1305 | | |
1306 | 1306 | | |
| 1307 | + | |
| 1308 | + | |
| 1309 | + | |
1307 | 1310 | | |
1308 | 1311 | | |
1309 | 1312 | | |
| |||
2367 | 2370 | | |
2368 | 2371 | | |
2369 | 2372 | | |
| 2373 | + | |
| 2374 | + | |
| 2375 | + | |
| 2376 | + | |
| 2377 | + | |
| 2378 | + | |
| 2379 | + | |
| 2380 | + | |
| 2381 | + | |
| 2382 | + | |
| 2383 | + | |
| 2384 | + | |
| 2385 | + | |
| 2386 | + | |
| 2387 | + | |
2370 | 2388 | | |
2371 | 2389 | | |
2372 | 2390 | | |
| |||
2451 | 2469 | | |
2452 | 2470 | | |
2453 | 2471 | | |
2454 | | - | |
| 2472 | + | |
| 2473 | + | |
2455 | 2474 | | |
2456 | 2475 | | |
2457 | 2476 | | |
| |||
2463 | 2482 | | |
2464 | 2483 | | |
2465 | 2484 | | |
2466 | | - | |
2467 | | - | |
2468 | | - | |
2469 | | - | |
2470 | | - | |
2471 | | - | |
2472 | | - | |
2473 | 2485 | | |
2474 | 2486 | | |
2475 | | - | |
2476 | | - | |
2477 | | - | |
2478 | | - | |
2479 | | - | |
2480 | | - | |
| 2487 | + | |
| 2488 | + | |
2481 | 2489 | | |
2482 | 2490 | | |
2483 | 2491 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 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 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
0 commit comments