mirror of
https://github.com/aljazceru/turso.git
synced 2026-01-02 16:04:20 +01:00
I'm working on an optimization of `WHERE .. IN (..)` statements that
requires these bytecodes.
```sh
sqlite> explain select * from users where first_name in ('alice', 'bob', 'charlie');
addr opcode p1 p2 p3 p4 p5 comment
---- ------------- ---- ---- ---- ------------- -- -------------
0 Init 0 35 0 0 Start at 35
1 OpenRead 0 2 0 10 0 root=2 iDb=0; users
2 Rewind 0 34 0 0
3 Noop 0 0 0 0 begin IN expr
4 BeginSubrtn 0 1 0 0 r[1]=NULL <---- Here
5 Once 0 17 0 0
6 OpenEphemeral 1 1 0 k(1,B) 0 nColumn=1; RHS of IN operator
7 String8 0 2 0 alice 0 r[2]='alice'
8 MakeRecord 2 1 3 B 0 r[3]=mkrec(r[2])
9 IdxInsert 1 3 2 1 0 key=r[3]
10 String8 0 2 0 bob 0 r[2]='bob'
11 MakeRecord 2 1 3 B 0 r[3]=mkrec(r[2])
12 IdxInsert 1 3 2 1 0 key=r[3]
13 String8 0 2 0 charlie 0 r[2]='charlie'
14 MakeRecord 2 1 3 B 0 r[3]=mkrec(r[2])
15 IdxInsert 1 3 2 1 0 key=r[3]
16 NullRow 1 0 0 0
17 Return 1 5 1 0
18 Column 0 1 4 0 r[4]= cursor 0 column 1
19 IsNull 4 33 0 0 if r[4]==NULL goto 33
20 Affinity 4 1 0 B 0 affinity(r[4]) <---- Here
21 NotFound 1 33 4 1 0 key=r[4]; end IN expr <---- Here
22 Rowid 0 5 0 0 r[5]=users.rowid
23 Column 0 1 6 0 r[6]= cursor 0 column 1
24 Column 0 2 7 0 r[7]= cursor 0 column 2
25 Column 0 3 8 0 r[8]= cursor 0 column 3
26 Column 0 4 9 0 r[9]= cursor 0 column 4
27 Column 0 5 10 0 r[10]= cursor 0 column 5
28 Column 0 6 11 0 r[11]= cursor 0 column 6
29 Column 0 7 12 0 r[12]= cursor 0 column 7
30 Column 0 8 13 0 r[13]= cursor 0 column 8
31 Column 0 9 14 0 r[14]= cursor 0 column 9
32 ResultRow 5 10 0 0 output=r[5..14]
33 Next 0 3 0 1
34 Halt 0 0 0 0
35 Transaction 0 0 3 0 1 usesStmtJournal=0
36 Goto 0 1 0 0
```
EDIT: [Found](https://sqlite.org/opcode.html#Found) and
[NoConflict](https://sqlite.org/opcode.html#NoConflict) can be easily
derived from `NotFound` but I wanted to be concise, I could do it in
another PR :)
Closes #1345