Commit 419767e
feat(eqp): render the FOR IN-OPERATOR node for an indexed IN-subquery
When a scanned outer's WHERE has a single `col [NOT] IN (SELECT <c> FROM <table>
[ORDER BY …])` whose subquery projects one plain *indexed* column, SQLite
evaluates the IN by iterating that column's index rather than materializing the
result, and renders a single `… FOR IN-OPERATOR` plan node in place of the
`LIST SUBQUERY` / `CREATE BLOOM FILTER` subtree. graphite now matches: a
secondary index leading with the column renders `USING INDEX <name> FOR
IN-OPERATOR`; the rowid / INTEGER PRIMARY KEY renders `USING ROWID SEARCH ON
TABLE <table> FOR IN-OPERATOR`.
The new `in_operator_index_node` gates on a bare-`SCAN` outer plus a simple body
(no WHERE/GROUP/HAVING/DISTINCT/LIMIT/OFFSET/join/compound/CTE/window and a
single plain-column projection). When two or more plain indexes lead with the
column, which one SQLite iterates is a cost-model tiebreak unverifiable against
the stat1-only oracle, so those keep the `LIST SUBQUERY` form. This is an
EXPLAIN-QUERY-PLAN-only change; executed results are unaffected. Verified
byte-for-byte vs sqlite3 3.50.4 (`tests/eqp_in_operator.rs`).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent f9dfc3c commit 419767e
3 files changed
Lines changed: 242 additions & 17 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1244 | 1244 | | |
1245 | 1245 | | |
1246 | 1246 | | |
1247 | | - | |
1248 | | - | |
1249 | | - | |
1250 | | - | |
1251 | | - | |
1252 | | - | |
1253 | | - | |
1254 | | - | |
| 1247 | + | |
| 1248 | + | |
| 1249 | + | |
| 1250 | + | |
| 1251 | + | |
| 1252 | + | |
| 1253 | + | |
| 1254 | + | |
| 1255 | + | |
| 1256 | + | |
| 1257 | + | |
| 1258 | + | |
1255 | 1259 | | |
1256 | 1260 | | |
1257 | 1261 | | |
| |||
1496 | 1500 | | |
1497 | 1501 | | |
1498 | 1502 | | |
1499 | | - | |
1500 | | - | |
1501 | | - | |
1502 | | - | |
| 1503 | + | |
| 1504 | + | |
| 1505 | + | |
| 1506 | + | |
| 1507 | + | |
| 1508 | + | |
1503 | 1509 | | |
1504 | 1510 | | |
1505 | 1511 | | |
| |||
1512 | 1518 | | |
1513 | 1519 | | |
1514 | 1520 | | |
1515 | | - | |
1516 | | - | |
1517 | | - | |
1518 | | - | |
| 1521 | + | |
| 1522 | + | |
| 1523 | + | |
| 1524 | + | |
| 1525 | + | |
| 1526 | + | |
| 1527 | + | |
1519 | 1528 | | |
1520 | 1529 | | |
1521 | 1530 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14803 | 14803 | | |
14804 | 14804 | | |
14805 | 14805 | | |
14806 | | - | |
| 14806 | + | |
| 14807 | + | |
| 14808 | + | |
| 14809 | + | |
| 14810 | + | |
| 14811 | + | |
| 14812 | + | |
| 14813 | + | |
| 14814 | + | |
| 14815 | + | |
| 14816 | + | |
| 14817 | + | |
| 14818 | + | |
| 14819 | + | |
| 14820 | + | |
14807 | 14821 | | |
14808 | 14822 | | |
14809 | 14823 | | |
| |||
15116 | 15130 | | |
15117 | 15131 | | |
15118 | 15132 | | |
| 15133 | + | |
| 15134 | + | |
| 15135 | + | |
| 15136 | + | |
| 15137 | + | |
| 15138 | + | |
| 15139 | + | |
| 15140 | + | |
| 15141 | + | |
| 15142 | + | |
| 15143 | + | |
| 15144 | + | |
| 15145 | + | |
| 15146 | + | |
| 15147 | + | |
| 15148 | + | |
| 15149 | + | |
| 15150 | + | |
| 15151 | + | |
| 15152 | + | |
| 15153 | + | |
| 15154 | + | |
| 15155 | + | |
| 15156 | + | |
| 15157 | + | |
| 15158 | + | |
| 15159 | + | |
| 15160 | + | |
| 15161 | + | |
| 15162 | + | |
| 15163 | + | |
| 15164 | + | |
| 15165 | + | |
| 15166 | + | |
| 15167 | + | |
| 15168 | + | |
| 15169 | + | |
| 15170 | + | |
| 15171 | + | |
| 15172 | + | |
| 15173 | + | |
| 15174 | + | |
| 15175 | + | |
| 15176 | + | |
| 15177 | + | |
| 15178 | + | |
| 15179 | + | |
| 15180 | + | |
| 15181 | + | |
| 15182 | + | |
| 15183 | + | |
| 15184 | + | |
| 15185 | + | |
| 15186 | + | |
| 15187 | + | |
| 15188 | + | |
| 15189 | + | |
| 15190 | + | |
| 15191 | + | |
| 15192 | + | |
| 15193 | + | |
| 15194 | + | |
| 15195 | + | |
| 15196 | + | |
| 15197 | + | |
| 15198 | + | |
| 15199 | + | |
| 15200 | + | |
| 15201 | + | |
| 15202 | + | |
| 15203 | + | |
| 15204 | + | |
| 15205 | + | |
| 15206 | + | |
| 15207 | + | |
| 15208 | + | |
| 15209 | + | |
| 15210 | + | |
| 15211 | + | |
| 15212 | + | |
| 15213 | + | |
| 15214 | + | |
| 15215 | + | |
| 15216 | + | |
| 15217 | + | |
| 15218 | + | |
| 15219 | + | |
| 15220 | + | |
| 15221 | + | |
| 15222 | + | |
| 15223 | + | |
| 15224 | + | |
| 15225 | + | |
| 15226 | + | |
| 15227 | + | |
| 15228 | + | |
| 15229 | + | |
15119 | 15230 | | |
15120 | 15231 | | |
15121 | 15232 | | |
| |||
| 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 | + | |
0 commit comments