## Summary **No review yet** ## Minimized query ```sql .eqp full CREATE TABLE T ( a TEXT, b TEXT, c REAL ); INSERT INTO T VALUES ('a','b',CAST(1.5 AS BIGINT)), ('a','c',-2.25), ('b','b',4.75); SELECT a, SUM(CASE WHEN b='b' THEN c ELSE 0 END) AS d, SUM(CASE WHEN b='c' THEN c ELSE 0 END) AS e FROM T GROUP BY a; UPDATE T SET a = '' WHERE a BETWEEN 0 AND 100 RETURNING *; REINDEX T; INSERT OR REPLACE INTO T VALUES ('', 'x', 'x'); SELECT MAX(c) OVER (PARTITION BY c ORDER BY c RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS) FROM T; DROP TABLE IF EXISTS T; ANALYZE; ``` ## Actual output ```sql addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 28 0 0 Start at 28 1 ReadCookie 0 3 2 0 2 If 3 5 0 0 3 SetCookie 0 2 4 0 4 SetCookie 0 5 1 0 5 CreateBtree 0 2 1 0 r[2]=root iDb=0 flags=1 6 OpenWrite 0 1 0 5 0 root=1 iDb=0 7 NewRowid 0 1 0 0 r[1]=rowid 8 Blob 6 3 0  0 r[3]= (len=6) 9 Insert 0 3 1 8 intkey=r[1] data=r[3] 10 Close 0 0 0 0 11 Close 0 0 0 0 12 Null 0 4 5 0 r[4..5]=NULL 13 Noop 2 0 4 0 14 OpenWrite 1 1 0 5 0 root=1 iDb=0; sqlite_master 15 SeekRowid 1 17 1 0 intkey=r[1] 16 Rowid 1 5 0 0 r[5]=[P2]=PX rowid of P1 17 IsNull 5 25 0 0 if r[5]==NULL goto 25 18 String8 0 6 0 table 0 r[6]='table' 19 String8 0 7 0 T 0 r[7]='T' 20 String8 0 8 0 T 0 r[8]='T' 21 SCopy 2 9 0 0 r[9]=r[2] 22 String8 0 10 0 CREATE TABLE T ( a TEXT, b TEXT, c REAL ) 0 r[10]='CREATE TABLE T ( a TEXT, b TEXT, c REAL )' 23 MakeRecord 6 5 4 BBBDB 0 r[4]=mkrec(r[6..10]) 24 Insert 1 4 5 0 intkey=r[5] data=r[4] 25 SetCookie 0 1 1 0 26 ParseSchema 0 0 0 tbl_name='T' AND type!='trigger' 0 27 Halt 0 0 0 0 28 Transaction 0 1 0 0 1 usesStmtJournal=1 29 Goto 0 1 0 0 QUERY PLAN `--SCAN 3 CONSTANT ROWS addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 23 0 0 Start at 23 1 InitCoroutine 5 16 2 0 2 String8 0 2 0 a 0 r[2]='a' 3 String8 0 3 0 b 0 r[3]='b' 4 Real 0 4 0 1.5 0 r[4]=1.5 5 Cast 4 68 0 0 affinity(r[4]) 6 Yield 5 0 0 0 7 String8 0 2 0 a 0 r[2]='a' 8 String8 0 3 0 c 0 r[3]='c' 9 Real 0 4 0 -2.25 0 r[4]=-2.25 10 Yield 5 0 0 0 11 String8 0 2 0 b 0 r[2]='b' 12 String8 0 3 0 b 0 r[3]='b' 13 Real 0 4 0 4.75 0 r[4]=4.75 14 Yield 5 0 0 0 15 EndCoroutine 5 0 0 0 16 OpenWrite 0 2 0 3 0 root=2 iDb=0; T 17 Yield 5 22 0 0 18 NewRowid 0 1 0 0 r[1]=rowid 19 MakeRecord 2 3 6 BBE 0 r[6]=mkrec(r[2..4]) 20 Insert 0 6 1 T 57 intkey=r[1] data=r[6] 21 Goto 0 17 0 0 22 Halt 0 0 0 0 23 Transaction 0 1 1 0 1 usesStmtJournal=0 24 Goto 0 1 0 0 QUERY PLAN |--SCAN T `--USE TEMP B-TREE FOR GROUP BY addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 57 0 0 Start at 57 1 SorterOpen 1 3 0 k(1,B) 0 2 Integer 0 7 0 0 r[7]=0; clear abort flag 3 Null 0 10 10 0 r[10..10]=NULL 4 Gosub 9 53 0 0 5 OpenRead 0 2 0 3 0 root=2 iDb=0; T 6 Rewind 0 14 0 0 7 Column 0 0 12 0 r[12]=T.a 8 Column 0 1 13 0 r[13]=T.b 9 Column 0 2 14 0 r[14]=T.c 10 RealAffinity 14 0 0 0 11 MakeRecord 12 3 15 0 r[15]=mkrec(r[12..14]) 12 SorterInsert 1 15 0 0 key=r[15] 13 Next 0 7 0 1 14 OpenPseudo 2 15 3 0 3 columns in r[15] 15 SorterSort 1 56 0 0 GROUP BY sort 16 SorterData 1 15 2 0 r[15]=data 17 Column 2 0 11 0 r[11]=[P3]=PX cursor P1 column P2 18 Compare 10 11 1 k(1,B) 0 r[10] <-> r[11] 19 Jump 20 24 20 0 20 Move 11 10 1 0 r[10]=r[11] 21 Gosub 8 46 0 0 output one row 22 IfPos 7 56 0 0 if r[7]>0 then r[7]-=0, goto 56; check abort flag 23 Gosub 9 53 0 0 reset accumulator 24 Column 2 1 17 0 r[17]=T.b 25 Ne 18 29 17 BINARY-8 82 if r[17]!=r[18] goto 29 26 Column 2 2 16 0 r[16]=T.c 27 RealAffinity 16 0 0 0 28 Goto 0 30 0 0 29 Integer 0 16 0 0 r[16]=0 30 AggStep 0 16 2 sum(1) 1 accum=r[2] step(r[16]) 31 Column 2 1 17 0 r[17]=T.b 32 Ne 19 36 17 BINARY-8 82 if r[17]!=r[19] goto 36 33 Column 2 2 16 0 r[16]=T.c 34 RealAffinity 16 0 0 0 35 Goto 0 37 0 0 36 Integer 0 16 0 0 r[16]=0 37 AggStep 0 16 3 sum(1) 1 accum=r[3] step(r[16]) 38 If 6 40 0 0 39 Column 2 0 1 0 r[1]=T.a 40 Integer 1 6 0 0 r[6]=1; indicate data in accumulator 41 SorterNext 1 16 0 0 42 Gosub 8 46 0 0 output final row 43 Goto 0 56 0 0 44 Integer 1 7 0 0 r[7]=1; set abort flag 45 Return 8 0 0 0 46 IfPos 6 48 0 0 if r[6]>0 then r[6]-=0, goto 48; Groupby result generator entry point 47 Return 8 0 0 0 48 AggFinal 2 1 0 sum(1) 0 accum=r[2] N=1 49 AggFinal 3 1 0 sum(1) 0 accum=r[3] N=1 50 Copy 1 20 2 0 r[20..22]=r[1..3] 51 ResultRow 20 3 0 0 output=r[20..22] 52 Return 8 0 0 0 end groupby result generator 53 Null 0 1 5 0 r[1..5]=NULL 54 Integer 0 6 0 0 r[6]=0; indicate accumulator empty 55 Return 9 0 0 0 56 Halt 0 0 0 0 57 Transaction 0 0 1 0 1 usesStmtJournal=0 58 String8 0 18 0 b 0 r[18]='b' 59 String8 0 19 0 c 0 r[19]='c' 60 Goto 0 1 0 0 a|1.0|-2.25 b|4.75|0 QUERY PLAN `--SCAN T addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 41 0 0 Start at 41 1 Null 0 1 2 0 r[1..2]=NULL 2 OpenEphemeral 1 0 1 0 nColumn=0 3 OpenRead 0 2 0 1 0 root=2 iDb=0; T 4 Rewind 0 11 0 0 5 Column 0 0 10 0 r[10]=T.a 6 Lt 12 10 10 BINARY-8 82 if r[10]r[13] goto 10 8 Rowid 0 2 0 0 r[2]=[P2]=PX rowid of P1 9 Insert 1 1 2 0 intkey=r[2] data=r[1] 10 Next 0 5 0 1 11 OpenWrite 0 2 0 3 0 root=2 iDb=0; T 12 Rewind 1 33 0 0 13 Rowid 1 2 0 0 r[2]=[P2]=PX rowid of P1 14 NotExists 0 32 2 0 intkey=r[2] 15 Column 0 0 3 0 r[3]=T.a 16 Column 0 1 4 0 r[4]=T.b 17 Column 0 2 5 0 r[5]=T.c 18 RealAffinity 5 0 0 0 19 Copy 2 6 0 0 r[6]=r[2] 20 String8 0 7 0 0 r[7]='' 21 Column 0 1 8 0 r[8]=T.b 22 Column 0 2 9 0 r[9]=T.c 23 RealAffinity 9 0 0 0 24 MakeRecord 7 3 14 BBE 0 r[14]=mkrec(r[7..9]) 25 Insert 0 14 6 T 5 intkey=r[6] data=r[14] 26 SCopy 7 15 0 0 r[15]=r[7] 27 SCopy 8 16 0 0 r[16]=r[8] 28 SCopy 9 17 0 0 r[17]=r[9] 29 MakeRecord 15 3 18 0 r[18]=mkrec(r[15..17]) 30 NewRowid 3 19 0 0 r[19]=rowid 31 Insert 3 18 19 0 intkey=r[19] data=r[18] 32 Next 1 13 0 0 33 FkCheck 0 0 0 0 34 Rewind 3 40 0 0 35 Column 3 0 15 0 r[15]=[P3]=PX cursor P1 column P2 36 Column 3 1 16 0 r[16]=[P3]=PX cursor P1 column P2 37 Column 3 2 17 0 r[17]=[P3]=PX cursor P1 column P2 38 ResultRow 15 3 0 0 output=r[15..17] 39 Next 3 35 0 0 40 Halt 0 0 0 0 41 Transaction 0 1 1 0 1 usesStmtJournal=0 42 Integer 0 12 0 0 r[12]=0 43 Integer 100 13 0 0 r[13]=100 44 OpenEphemeral 3 3 0 0 nColumn=3 45 Goto 0 1 0 0 addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 1 0 0 Start at 1 1 Halt 0 0 0 0 addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 9 0 0 Start at 9 1 OpenWrite 0 2 0 3 0 root=2 iDb=0; T 2 String8 0 2 0 0 r[2]='' 3 String8 0 3 0 x 0 r[3]='x' 4 String8 0 4 0 x 0 r[4]='x' 5 NewRowid 0 1 0 0 r[1]=rowid 6 MakeRecord 2 3 5 BBE 0 r[5]=mkrec(r[2..4]) 7 Insert 0 5 1 T 57 intkey=r[1] data=r[5] 8 Halt 0 0 0 0 9 Transaction 0 1 1 0 1 usesStmtJournal=0 10 Goto 0 1 0 0 QUERY PLAN |--CO-ROUTINE (subquery-2) | |--SCAN T | `--USE TEMP B-TREE FOR ORDER BY `--SCAN (subquery-2) addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 116 0 0 Start at 116 1 Null 0 1 0 0 r[1]=NULL 2 InitCoroutine 3 26 3 0 (subquery-2) 3 SorterOpen 6 6 0 k(2,B,B) 0 4 OpenRead 0 2 0 3 0 root=2 iDb=0; T 5 Rewind 0 17 0 0 6 Column 0 2 6 0 r[6]=T.c 7 RealAffinity 6 0 0 0 8 Column 0 2 7 0 r[7]=T.c 9 RealAffinity 7 0 0 0 10 Column 0 2 4 0 r[4]=T.c 11 RealAffinity 4 0 0 0 12 Column 0 2 5 0 r[5]=T.c 13 RealAffinity 5 0 0 0 14 MakeRecord 4 4 9 0 r[9]=mkrec(r[4..7]) 15 SorterInsert 6 9 4 4 0 key=r[9] 16 Next 0 6 0 1 17 OpenPseudo 7 10 6 0 6 columns in r[10] 18 SorterSort 6 25 0 0 19 SorterData 6 10 7 0 r[10]=data 20 Column 7 1 8 0 r[8]=[P3]=PX cursor P1 column P2 21 Column 7 3 7 0 r[7]=[P3]=PX cursor P1 column P2 22 Column 7 2 6 0 r[6]=[P3]=PX cursor P1 column P2 23 Yield 3 0 0 0 24 SorterNext 6 19 0 0 25 EndCoroutine 3 0 0 0 26 OpenEphemeral 1 3 0 0 nColumn=3 27 OpenDup 2 1 0 0 28 OpenDup 3 1 0 0 29 OpenDup 4 1 0 0 30 Null 0 11 11 0 r[11..11]=NULL 31 Integer 1 12 0 0 r[12]=1 32 Integer 1 13 0 0 r[13]=1 33 Integer 0 14 0 0 r[14]=0 34 OpenDup 8 1 0 0 35 InitCoroutine 3 0 3 0 36 Yield 3 68 0 0 next row of 37 Copy 6 16 0 0 r[16]=r[6] 38 Copy 7 17 0 0 r[17]=r[7] 39 Copy 8 18 0 0 r[18]=r[8] 40 MakeRecord 16 3 19 0 r[19]=mkrec(r[16..18]) 41 Compare 16 11 1 k(1,B) 0 r[16] <-> r[11] 42 Jump 43 45 43 0 43 Gosub 25 69 0 0 call flush_partition 44 Copy 16 11 0 0 r[11]=r[16] 45 NewRowid 2 20 0 0 r[20]=rowid 46 Insert 2 19 20 0 intkey=r[20] data=r[19] 47 Ne 12 57 20 0 if r[20]!=r[12] goto 57 48 Null 0 1 0 0 r[1]=NULL 49 Rewind 3 1 0 0 50 Rewind 1 1 0 0 51 Rewind 4 1 0 0 52 Copy 17 21 0 0 r[21]=r[17] 53 Copy 21 22 0 0 r[22]=r[21] 54 Copy 21 23 0 0 r[23]=r[21] 55 Copy 21 24 0 0 r[24]=r[21] 56 Goto 0 67 0 0 57 Compare 21 17 1 k(1,B) 0 r[21] <-> r[17] 58 Jump 59 67 59 0 59 Copy 17 21 0 0 r[21]=r[17] 60 AddImm 14 1 0 0 r[14]=r[14]+1 61 Next 4 63 0 0 62 Goto 0 67 0 0 63 Column 4 1 27 0 r[27]=[P3]=PX cursor P1 column P2 64 Compare 24 27 1 k(1,B) 0 r[24] <-> r[27] 65 Jump 66 60 66 0 66 Copy 27 24 0 0 r[24]=r[27] 67 Goto 0 36 0 0 68 Integer 109 25 0 0 r[25]=109 69 Rewind 2 106 0 0 70 AddImm 14 1 0 0 r[14]=r[14]+1 71 Next 4 73 0 0 72 Goto 0 77 0 0 73 Column 4 1 27 0 r[27]=[P3]=PX cursor P1 column P2 74 Compare 24 27 1 k(1,B) 0 r[24] <-> r[27] 75 Jump 76 70 76 0 76 Copy 27 24 0 0 r[24]=r[27] 77 Rowid 1 27 0 0 r[27]=[P2]=PX rowid of P1 78 Column 1 1 29 0 r[29]=[P3]=PX cursor P1 column P2 79 Null 0 1 0 0 r[1]=NULL 80 SeekGE 8 87 13 0 key=r[13] 81 Rowid 8 28 0 0 r[28]=[P2]=PX rowid of P1 82 Gt 14 87 28 0 if r[28]>r[14] goto 87 83 Column 8 2 26 0 r[26]=[P3]=PX cursor P1 column P2 84 CollSeq 0 0 0 BINARY-8 0 85 AggStep 0 26 1 max(1) 1 accum=r[1] step(r[26]) 86 Next 8 81 0 0 87 AggFinal 1 1 0 max(1) 0 accum=r[1] N=1 88 Copy 1 2 0 0 r[2]=r[1] 89 Null 0 1 0 0 r[1]=NULL 90 Gosub 15 111 0 0 91 Next 1 93 0 0 92 Goto 0 106 0 0 93 Column 1 1 29 0 r[29]=[P3]=PX cursor P1 column P2 94 Compare 23 29 1 k(1,B) 0 r[23] <-> r[29] 95 Jump 96 77 96 0 96 Copy 29 23 0 0 r[23]=r[29] 97 AddImm 13 1 0 0 r[13]=r[13]+1 98 Delete 3 0 0 2 99 Next 3 101 0 0 100 Goto 0 105 0 0 101 Column 3 1 29 0 r[29]=[P3]=PX cursor P1 column P2 102 Compare 22 29 1 k(1,B) 0 r[22] <-> r[29] 103 Jump 104 97 104 0 104 Copy 29 22 0 0 r[22]=r[29] 105 Goto 0 77 0 0 106 ResetSorter 1 0 0 0 107 Integer 1 13 0 0 r[13]=1 108 Integer 0 14 0 0 r[14]=0 109 Return 25 0 0 0 110 Goto 0 115 0 0 111 Noop 0 0 0 0 inner-loop subroutine 112 Copy 2 31 0 0 r[31]=r[2] 113 ResultRow 31 1 0 0 output=r[31] 114 Return 15 0 0 0 end inner-loop subroutine 115 Halt 0 0 0 0 116 Transaction 0 0 1 0 1 usesStmtJournal=0 117 Goto 0 1 0 0 -2.25 1.0 4.75 x addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 37 0 0 Start at 37 1 Null 0 1 0 0 r[1]=NULL 2 OpenWrite 0 1 0 5 0 root=1 iDb=0; sqlite_master 3 Rewind 0 11 0 0 4 Column 0 2 2 0 r[2]=sqlite_master.tbl_name 5 Ne 3 10 2 BINARY-8 82 if r[2]!=r[3] goto 10 6 Column 0 0 2 0 r[2]=sqlite_master.type 7 Eq 4 10 2 BINARY-8 82 if r[2]==r[4] goto 10 8 Rowid 0 5 0 0 r[5]=sqlite_master.rowid 9 Delete 0 0 0 2 10 Next 0 4 0 1 11 Destroy 2 2 0 0 12 Null 0 6 7 0 r[6..7]=NULL 13 OpenEphemeral 2 0 6 0 nColumn=0 14 IfNot 2 22 1 0 15 OpenRead 1 1 0 4 0 root=1 iDb=0; sqlite_master 16 Rewind 1 22 0 0 17 Column 1 3 13 0 r[13]=sqlite_master.rootpage 18 Ne 2 21 13 BINARY-8 84 if r[13]!=r[2] goto 21 19 Rowid 1 7 0 0 r[7]=[P2]=PX rowid of P1 20 Insert 2 6 7 0 intkey=r[7] data=r[6] 21 Next 1 17 0 1 22 OpenWrite 1 1 0 5 0 root=1 iDb=0; sqlite_master 23 Rewind 2 34 0 0 24 Rowid 2 7 0 0 r[7]=[P2]=PX rowid of P1 25 NotExists 1 33 7 0 intkey=r[7] 26 Column 1 0 8 0 r[8]=sqlite_master.type 27 Column 1 1 9 0 r[9]=sqlite_master.name 28 Column 1 2 10 0 r[10]=sqlite_master.tbl_name 29 Integer 2 11 0 0 r[11]=2 30 Column 1 4 12 0 r[12]=sqlite_master.sql 31 MakeRecord 8 5 15 BBBDB 0 r[15]=mkrec(r[8..12]) 32 Insert 1 15 7 0 intkey=r[7] data=r[15] 33 Next 2 24 0 0 34 DropTable 0 0 0 T 0 35 SetCookie 0 1 2 0 36 Halt 0 0 0 0 37 Transaction 0 1 1 0 1 usesStmtJournal=1 38 String8 0 3 0 T 0 r[3]='T' 39 String8 0 4 0 trigger 0 r[4]='trigger' 40 Goto 0 1 0 0 addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 31 0 0 Start at 31 1 ReadCookie 0 3 2 0 2 If 3 5 0 0 3 SetCookie 0 2 4 0 4 SetCookie 0 5 1 0 5 CreateBtree 0 2 1 0 r[2]=root iDb=0 flags=1 6 OpenWrite 0 1 0 5 0 root=1 iDb=0 7 NewRowid 0 1 0 0 r[1]=rowid 8 Blob 6 3 0  0 r[3]= (len=6) 9 Insert 0 3 1 8 intkey=r[1] data=r[3] 10 Close 0 0 0 0 11 Close 0 0 0 0 12 Null 0 4 5 0 r[4..5]=NULL 13 Noop 4 0 4 0 14 OpenWrite 3 1 0 5 0 root=1 iDb=0; sqlite_master 15 SeekRowid 3 17 1 0 intkey=r[1] 16 Rowid 3 5 0 0 r[5]=[P2]=PX rowid of P1 17 IsNull 5 25 0 0 if r[5]==NULL goto 25 18 String8 0 6 0 table 0 r[6]='table' 19 String8 0 7 0 sqlite_stat1 0 r[7]='sqlite_stat1' 20 String8 0 8 0 sqlite_stat1 0 r[8]='sqlite_stat1' 21 SCopy 2 9 0 0 r[9]=r[2] 22 String8 0 10 0 CREATE TABLE sqlite_stat1(tbl,idx,stat) 0 r[10]='CREATE TABLE sqlite_stat1(tbl,idx,stat)' 23 MakeRecord 6 5 4 BBBDB 0 r[4]=mkrec(r[6..10]) 24 Insert 3 4 5 0 intkey=r[5] data=r[4] 25 SetCookie 0 1 3 0 26 ParseSchema 0 0 0 tbl_name='sqlite_stat1' AND type!='trigger' 0 27 OpenWrite 0 2 0 3 16 root=2 iDb=0; sqlite_stat1 28 LoadAnalysis 0 0 0 0 29 Expire 0 0 0 0 30 Halt 0 0 0 0 31 Transaction 0 1 2 0 1 usesStmtJournal=1 32 Goto 0 1 0 0 ``` ## Expectation ```sql addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 28 0 0 Start at 28 1 ReadCookie 0 3 2 0 2 If 3 5 0 0 3 SetCookie 0 2 4 0 4 SetCookie 0 5 1 0 5 CreateBtree 0 2 1 0 r[2]=root iDb=0 flags=1 6 OpenWrite 0 1 0 5 0 root=1 iDb=0 7 NewRowid 0 1 0 0 r[1]=rowid 8 Blob 6 3 0  0 r[3]= (len=6) 9 Insert 0 3 1 8 intkey=r[1] data=r[3] 10 Close 0 0 0 0 11 Close 0 0 0 0 12 Null 0 4 5 0 r[4..5]=NULL 13 Noop 2 0 4 0 14 OpenWrite 1 1 0 5 0 root=1 iDb=0; sqlite_master 15 SeekRowid 1 17 1 0 intkey=r[1] 16 Rowid 1 5 0 0 r[5]= rowid of 1 17 IsNull 5 25 0 0 if r[5]==NULL goto 25 18 String8 0 6 0 table 0 r[6]='table' 19 String8 0 7 0 T 0 r[7]='T' 20 String8 0 8 0 T 0 r[8]='T' 21 Copy 2 9 0 0 r[9]=r[2] 22 String8 0 10 0 CREATE TABLE T ( a TEXT, b TEXT, c REAL ) 0 r[10]='CREATE TABLE T ( a TEXT, b TEXT, c REAL )' 23 MakeRecord 6 5 4 BBBDB 0 r[4]=mkrec(r[6..10]) 24 Insert 1 4 5 0 intkey=r[5] data=r[4] 25 SetCookie 0 1 1 0 26 ParseSchema 0 0 0 tbl_name='T' AND type!='trigger' 0 27 Halt 0 0 0 0 28 Transaction 0 1 0 0 1 usesStmtJournal=1 29 Goto 0 1 0 0 QUERY PLAN `--COMPOUND QUERY |--LEFT-MOST SUBQUERY | `--SCAN CONSTANT ROW `--UNION ALL `--SCAN 2-ROW VALUES CLAUSE addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 37 0 0 Start at 37 1 InitCoroutine 1 11 2 0 2 String8 0 4 0 a 0 r[4]='a' 3 String8 0 5 0 c 0 r[5]='c' 4 Real 0 6 0 -2.25 0 r[6]=-2.25 5 Yield 1 0 0 0 6 String8 0 4 0 b 0 r[4]='b' 7 String8 0 5 0 b 0 r[5]='b' 8 Real 0 6 0 4.75 0 r[6]=4.75 9 Yield 1 0 0 0 10 EndCoroutine 1 0 0 0 11 InitCoroutine 14 30 12 0 12 Explain 12 0 0 COMPOUND QUERY 0 13 Explain 13 12 0 LEFT-MOST SUBQUERY 0 14 Explain 14 13 0 SCAN CONSTANT ROW 0 15 String8 0 11 0 a 0 r[11]='a' 16 String8 0 12 0 b 0 r[12]='b' 17 Real 0 13 0 1.5 0 r[13]=1.5 18 Cast 13 68 0 0 affinity(r[13]) 19 Yield 14 0 0 0 20 Explain 20 12 0 UNION ALL 0 21 Explain 21 20 216 SCAN 2-ROW VALUES CLAUSE 0 22 InitCoroutine 1 0 2 0 23 Yield 1 29 0 0 next row of 2-ROW VALUES CLAUSE 24 Copy 4 11 0 2 r[11]=r[4] 25 Copy 5 12 0 2 r[12]=r[5] 26 Copy 6 13 0 2 r[13]=r[6] 27 Yield 14 0 0 0 28 Goto 0 23 0 0 29 EndCoroutine 14 0 0 0 30 OpenWrite 1 2 0 3 0 root=2 iDb=0; T 31 Yield 14 36 0 0 32 NewRowid 1 10 0 0 r[10]=rowid 33 MakeRecord 11 3 15 BBE 0 r[15]=mkrec(r[11..13]) 34 Insert 1 15 10 T 57 intkey=r[10] data=r[15] 35 Goto 0 31 0 0 36 Halt 0 0 0 0 37 Transaction 0 1 1 0 1 usesStmtJournal=0 38 Goto 0 1 0 0 QUERY PLAN |--SCAN T `--USE TEMP B-TREE FOR GROUP BY addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 60 0 0 Start at 60 1 SorterOpen 1 3 0 k(1,B) 0 2 Integer 0 2 0 0 r[2]=0; clear abort flag 3 Null 0 5 5 0 r[5..5]=NULL 4 Gosub 4 56 0 0 5 OpenRead 0 2 0 3 0 root=2 iDb=0; T 6 Explain 6 0 216 SCAN T 0 7 Rewind 0 16 0 0 8 Explain 8 0 0 USE TEMP B-TREE FOR GROUP BY 0 9 Column 0 0 12 0 r[12]= cursor 0 column 0 10 Column 0 1 13 0 r[13]= cursor 0 column 1 11 Column 0 2 14 0 r[14]= cursor 0 column 2 12 RealAffinity 14 0 0 0 13 MakeRecord 12 3 15 0 r[15]=mkrec(r[12..14]) 14 SorterInsert 1 15 0 0 key=r[15] 15 Next 0 8 0 1 16 OpenPseudo 2 15 3 0 3 columns in r[15] 17 SorterSort 1 59 0 0 GROUP BY sort 18 SorterData 1 15 2 0 r[15]=data 19 Column 2 0 6 0 r[6]= cursor 2 column 0 20 Compare 5 6 1 k(1,B) 0 r[5] <-> r[6] 21 Jump 22 26 22 0 22 Gosub 3 48 0 0 output one row of 1 23 Move 6 5 1 0 r[5]=r[6] 24 IfPos 2 59 0 0 if r[2]>0 then r[2]-=0, goto 59; check abort flag 25 Gosub 4 56 0 0 reset accumulator 1 26 Column 2 1 17 0 r[17]=T.b 27 Ne 18 31 17 BINARY-8 82 if r[17]!=r[18] goto 31 28 Column 2 2 16 0 r[16]=T.c 29 RealAffinity 16 0 0 0 30 Goto 0 32 0 0 31 Integer 0 16 0 0 r[16]=0 32 AggStep 0 16 10 sum(1) 1 accum=r[10] step(r[16]) 33 Column 2 1 17 0 r[17]=T.b 34 Ne 19 38 17 BINARY-8 82 if r[17]!=r[19] goto 38 35 Column 2 2 16 0 r[16]=T.c 36 RealAffinity 16 0 0 0 37 Goto 0 39 0 0 38 Integer 0 16 0 0 r[16]=0 39 AggStep 0 16 11 sum(1) 1 accum=r[11] step(r[16]) 40 If 1 42 0 0 41 Column 2 0 7 0 r[7]=T.a 42 Integer 1 1 0 0 r[1]=1; indicate data in accumulator 1 43 SorterNext 1 18 0 0 44 Gosub 3 48 0 0 output final row of 1 45 Goto 0 59 0 0 46 Integer 1 2 0 0 r[2]=1; set abort flag 47 Return 3 0 0 0 48 IfPos 1 50 0 0 if r[1]>0 then r[1]-=0, goto 50; Groupby result generator entry point 1 49 Return 3 0 0 0 50 AggFinal 10 1 0 sum(1) 0 accum=r[10] N=1 51 AggFinal 11 1 0 sum(1) 0 accum=r[11] N=1 52 Copy 7 20 0 0 r[20]=r[7] 53 Copy 10 21 1 0 r[21..22]=r[10..11] 54 ResultRow 20 3 0 0 output=r[20..22] 55 Return 3 0 0 0 end groupby result generator 1 56 Null 0 7 11 0 r[7..11]=NULL 57 Integer 0 1 0 0 r[1]=0; indicate accumulator 1 empty 58 Return 4 0 0 0 59 Halt 0 0 0 0 60 Transaction 0 0 1 0 1 usesStmtJournal=0 61 Null 0 5 5 0 r[5..5]=NULL 62 String8 0 18 0 b 0 r[18]='b' 63 String8 0 19 0 c 0 r[19]='c' 64 Goto 0 1 0 0 a|1.0|-2.25 b|4.75|0 QUERY PLAN `--SCAN T addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 43 0 0 Start at 43 1 Null 0 1 2 0 r[1..2]=NULL 2 OpenEphemeral 1 0 1 0 nColumn=0 3 OpenRead 0 2 0 1 0 root=2 iDb=0; T 4 Explain 4 0 216 SCAN T 0 5 Rewind 0 12 0 0 6 Column 0 0 10 0 r[10]= cursor 0 column 0 7 Lt 12 11 10 BINARY-8 82 if r[10]r[13] goto 11 9 Rowid 0 2 0 0 r[2]= rowid of 0 10 Insert 1 1 2 0 intkey=r[2] data=r[1] 11 Next 0 6 0 1 12 OpenWrite 0 2 0 3 0 root=2 iDb=0; T 13 Rewind 1 35 0 0 14 Rowid 1 2 0 0 r[2]= rowid of 1 15 NotExists 0 34 2 0 intkey=r[2] 16 Column 0 0 3 0 r[3]= cursor 0 column 0 17 Column 0 1 4 0 r[4]= cursor 0 column 1 18 Column 0 2 5 0 r[5]= cursor 0 column 2 19 RealAffinity 5 0 0 0 20 Copy 2 6 0 0 r[6]=r[2] 21 String8 0 7 0 0 r[7]='' 22 Column 0 1 8 0 r[8]= cursor 0 column 1 23 Column 0 2 9 0 r[9]= cursor 0 column 2 24 RealAffinity 9 0 0 0 25 MakeRecord 7 3 14 BBE 0 r[14]=mkrec(r[7..9]) 26 Insert 0 14 6 T 5 intkey=r[6] data=r[14] 27 Copy 7 15 0 0 r[15]=r[7] 28 Copy 8 16 0 0 r[16]=r[8] 29 Copy 9 17 0 0 r[17]=r[9] 30 RealAffinity 17 0 0 0 31 MakeRecord 15 3 18 0 r[18]=mkrec(r[15..17]) 32 NewRowid 3 19 0 0 r[19]=rowid 33 Insert 3 18 19 0 intkey=r[19] data=r[18] 34 Next 1 14 0 0 35 FkCheck 0 0 0 0 36 Rewind 3 42 0 0 37 Column 3 0 15 0 r[15]= cursor 3 column 0 38 Column 3 1 16 0 r[16]= cursor 3 column 1 39 Column 3 2 17 0 r[17]= cursor 3 column 2 40 ResultRow 15 3 0 0 output=r[15..17] 41 Next 3 37 0 0 42 Halt 0 0 0 0 43 Transaction 0 1 1 0 1 usesStmtJournal=0 44 Integer 0 12 0 0 r[12]=0 45 Integer 100 13 0 0 r[13]=100 46 OpenEphemeral 3 3 0 0 nColumn=3 47 Goto 0 1 0 0 addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 2 0 0 Start at 2 1 Halt 0 0 0 0 2 Goto 0 1 0 0 addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 9 0 0 Start at 9 1 OpenWrite 0 2 0 3 0 root=2 iDb=0; T 2 String8 0 2 0 0 r[2]='' 3 String8 0 3 0 x 0 r[3]='x' 4 String8 0 4 0 x 0 r[4]='x' 5 NewRowid 0 1 0 0 r[1]=rowid 6 MakeRecord 2 3 5 BBE 0 r[5]=mkrec(r[2..4]) 7 Insert 0 5 1 T 57 intkey=r[1] data=r[5] 8 Halt 0 0 0 0 9 Transaction 0 1 1 0 1 usesStmtJournal=0 10 Goto 0 1 0 0 QUERY PLAN |--CO-ROUTINE (subquery-2) | |--SCAN T | `--USE TEMP B-TREE FOR ORDER BY `--SCAN (subquery-2) addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 120 0 0 Start at 120 1 Null 0 1 0 0 r[1]=NULL 2 InitCoroutine 3 29 3 0 (subquery-2) 3 Explain 3 0 0 CO-ROUTINE (subquery-2) 0 4 SorterOpen 6 6 0 k(2,B,B) 0 5 OpenRead 0 2 0 3 0 root=2 iDb=0; T 6 Explain 6 3 216 SCAN T 0 7 Rewind 0 19 0 0 8 Column 0 2 6 0 r[6]= cursor 0 column 2 9 RealAffinity 6 0 0 0 10 Column 0 2 7 0 r[7]= cursor 0 column 2 11 RealAffinity 7 0 0 0 12 Column 0 2 4 0 r[4]= cursor 0 column 2 13 RealAffinity 4 0 0 0 14 Column 0 2 5 0 r[5]= cursor 0 column 2 15 RealAffinity 5 0 0 0 16 MakeRecord 4 4 9 0 r[9]=mkrec(r[4..7]) 17 SorterInsert 6 9 4 4 0 key=r[9] 18 Next 0 8 0 1 19 Explain 19 3 0 USE TEMP B-TREE FOR ORDER BY 0 20 OpenPseudo 7 10 6 0 6 columns in r[10] 21 SorterSort 6 28 0 0 22 SorterData 6 10 7 0 r[10]=data 23 Column 7 1 8 0 r[8]= cursor 7 column 1; 24 Column 7 3 7 0 r[7]= cursor 7 column 3; 25 Column 7 2 6 0 r[6]= cursor 7 column 2; 26 Yield 3 0 0 0 27 SorterNext 6 22 0 0 28 EndCoroutine 3 0 0 0 end (subquery-2) 29 OpenEphemeral 1 3 0 0 nColumn=3 30 OpenDup 2 1 0 0 31 OpenDup 3 1 0 0 32 OpenDup 4 1 0 0 33 Null 0 11 11 0 r[11..11]=NULL 34 Integer 1 12 0 0 r[12]=1 35 Integer 1 13 0 0 r[13]=1 36 Integer 0 14 0 0 r[14]=0 37 OpenDup 8 1 0 0 38 Explain 38 0 216 SCAN (subquery-2) 0 39 InitCoroutine 3 0 3 0 40 Yield 3 72 0 0 next row of 41 Copy 6 16 0 2 r[16]=r[6] 42 Copy 7 17 0 2 r[17]=r[7] 43 Copy 8 18 0 2 r[18]=r[8] 44 MakeRecord 16 3 19 0 r[19]=mkrec(r[16..18]) 45 Compare 16 11 1 k(1,B) 0 r[16] <-> r[11] 46 Jump 47 49 47 0 47 Gosub 25 73 0 0 call flush_partition 48 Copy 16 11 0 0 r[11]=r[16] 49 NewRowid 2 20 0 0 r[20]=rowid 50 Insert 2 19 20 0 intkey=r[20] data=r[19] 51 Ne 12 61 20 0 if r[20]!=r[12] goto 61 52 Null 0 1 0 0 r[1]=NULL 53 Rewind 3 0 0 0 54 Rewind 1 0 0 0 55 Rewind 4 0 0 0 56 Copy 17 21 0 0 r[21]=r[17] 57 Copy 21 22 0 0 r[22]=r[21] 58 Copy 21 23 0 0 r[23]=r[21] 59 Copy 21 24 0 0 r[24]=r[21] 60 Goto 0 71 0 0 61 Compare 21 17 1 k(1,B) 0 r[21] <-> r[17] 62 Jump 63 71 63 0 63 Copy 17 21 0 0 r[21]=r[17] 64 AddImm 14 1 0 0 r[14]=r[14]+1 65 Next 4 67 0 0 66 Goto 0 71 0 0 67 Column 4 1 27 0 r[27]= cursor 4 column 1 68 Compare 24 27 1 k(1,B) 0 r[24] <-> r[27] 69 Jump 70 64 70 0 70 Copy 27 24 0 0 r[24]=r[27] 71 Goto 0 40 0 0 72 Integer 113 25 0 0 r[25]=113 73 Rewind 2 110 0 0 74 AddImm 14 1 0 0 r[14]=r[14]+1 75 Next 4 77 0 0 76 Goto 0 81 0 0 77 Column 4 1 27 0 r[27]= cursor 4 column 1 78 Compare 24 27 1 k(1,B) 0 r[24] <-> r[27] 79 Jump 80 74 80 0 80 Copy 27 24 0 0 r[24]=r[27] 81 Rowid 1 27 0 0 r[27]= rowid of 1 82 Column 1 1 29 0 r[29]= cursor 1 column 1 83 Null 0 1 0 0 r[1]=NULL 84 SeekGE 8 91 13 0 key=r[13] 85 Rowid 8 28 0 0 r[28]= rowid of 8 86 Gt 14 91 28 0 if r[28]>r[14] goto 91 87 Column 8 2 26 0 r[26]= cursor 8 column 2 88 CollSeq 0 0 0 BINARY-8 0 89 AggStep 0 26 1 max(1) 1 accum=r[1] step(r[26]) 90 Next 8 85 0 0 91 AggFinal 1 1 0 max(1) 0 accum=r[1] N=1 92 Copy 1 2 0 0 r[2]=r[1] 93 Null 0 1 0 0 r[1]=NULL 94 Gosub 15 115 0 0 95 Next 1 97 0 0 96 Goto 0 110 0 0 97 Column 1 1 29 0 r[29]= cursor 1 column 1 98 Compare 23 29 1 k(1,B) 0 r[23] <-> r[29] 99 Jump 100 81 100 0 100 Copy 29 23 0 0 r[23]=r[29] 101 AddImm 13 1 0 0 r[13]=r[13]+1 102 Delete 3 0 0 2 103 Next 3 105 0 0 104 Goto 0 109 0 0 105 Column 3 1 29 0 r[29]= cursor 3 column 1 106 Compare 22 29 1 k(1,B) 0 r[22] <-> r[29] 107 Jump 108 101 108 0 108 Copy 29 22 0 0 r[22]=r[29] 109 Goto 0 81 0 0 110 ResetSorter 1 0 0 0 111 Integer 1 13 0 0 r[13]=1 112 Integer 0 14 0 0 r[14]=0 113 Return 25 0 0 0 114 Goto 0 119 0 0 115 Noop 0 0 0 0 inner-loop subroutine 116 Copy 2 31 0 0 r[31]=r[2] 117 ResultRow 31 1 0 0 output=r[31] 118 Return 15 0 0 0 end inner-loop subroutine 119 Halt 0 0 0 0 120 Transaction 0 0 1 0 1 usesStmtJournal=0 121 Goto 0 1 0 0 -2.25 1.0 4.75 x addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 37 0 0 Start at 37 1 Null 0 1 0 0 r[1]=NULL 2 OpenWrite 0 1 0 5 0 root=1 iDb=0; sqlite_master 3 Rewind 0 11 0 0 4 Column 0 2 2 0 r[2]= cursor 0 column 2 5 Ne 3 10 2 BINARY-8 82 if r[2]!=r[3] goto 10 6 Column 0 0 2 0 r[2]= cursor 0 column 0 7 Eq 4 10 2 BINARY-8 82 if r[2]==r[4] goto 10 8 Rowid 0 5 0 0 r[5]=sqlite_master.rowid 9 Delete 0 0 0 2 10 Next 0 4 0 1 11 Destroy 2 2 0 0 12 Null 0 6 7 0 r[6..7]=NULL 13 OpenEphemeral 2 0 6 0 nColumn=0 14 IfNot 2 22 1 0 15 OpenRead 1 1 0 4 0 root=1 iDb=0; sqlite_master 16 Rewind 1 22 0 0 17 Column 1 3 13 0 r[13]= cursor 1 column 3 18 Ne 2 21 13 BINARY-8 84 if r[13]!=r[2] goto 21 19 Rowid 1 7 0 0 r[7]= rowid of 1 20 Insert 2 6 7 0 intkey=r[7] data=r[6] 21 Next 1 17 0 1 22 OpenWrite 1 1 0 5 0 root=1 iDb=0; sqlite_master 23 Rewind 2 34 0 0 24 Rowid 2 7 0 0 r[7]= rowid of 2 25 NotExists 1 33 7 0 intkey=r[7] 26 Column 1 0 8 0 r[8]= cursor 1 column 0 27 Column 1 1 9 0 r[9]= cursor 1 column 1 28 Column 1 2 10 0 r[10]= cursor 1 column 2 29 Integer 2 11 0 0 r[11]=2 30 Column 1 4 12 0 r[12]= cursor 1 column 4 31 MakeRecord 8 5 15 BBBDB 0 r[15]=mkrec(r[8..12]) 32 Insert 1 15 7 0 intkey=r[7] data=r[15] 33 Next 2 24 0 0 34 DropTable 0 0 0 T 0 35 SetCookie 0 1 2 0 36 Halt 0 0 0 0 37 Transaction 0 1 1 0 1 usesStmtJournal=1 38 String8 0 3 0 T 0 r[3]='T' 39 String8 0 4 0 trigger 0 r[4]='trigger' 40 Goto 0 1 0 0 addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 31 0 0 Start at 31 1 ReadCookie 0 3 2 0 2 If 3 5 0 0 3 SetCookie 0 2 4 0 4 SetCookie 0 5 1 0 5 CreateBtree 0 2 1 0 r[2]=root iDb=0 flags=1 6 OpenWrite 0 1 0 5 0 root=1 iDb=0 7 NewRowid 0 1 0 0 r[1]=rowid 8 Blob 6 3 0  0 r[3]= (len=6) 9 Insert 0 3 1 8 intkey=r[1] data=r[3] 10 Close 0 0 0 0 11 Close 0 0 0 0 12 Null 0 4 5 0 r[4..5]=NULL 13 Noop 4 0 4 0 14 OpenWrite 3 1 0 5 0 root=1 iDb=0; sqlite_master 15 SeekRowid 3 17 1 0 intkey=r[1] 16 Rowid 3 5 0 0 r[5]= rowid of 3 17 IsNull 5 25 0 0 if r[5]==NULL goto 25 18 String8 0 6 0 table 0 r[6]='table' 19 String8 0 7 0 sqlite_stat1 0 r[7]='sqlite_stat1' 20 String8 0 8 0 sqlite_stat1 0 r[8]='sqlite_stat1' 21 Copy 2 9 0 0 r[9]=r[2] 22 String8 0 10 0 CREATE TABLE sqlite_stat1(tbl,idx,stat) 0 r[10]='CREATE TABLE sqlite_stat1(tbl,idx,stat)' 23 MakeRecord 6 5 4 BBBDB 0 r[4]=mkrec(r[6..10]) 24 Insert 3 4 5 0 intkey=r[5] data=r[4] 25 SetCookie 0 1 3 0 26 ParseSchema 0 0 0 tbl_name='sqlite_stat1' AND type!='trigger' 0 27 OpenWrite 0 2 0 3 16 root=2 iDb=0; sqlite_stat1 28 LoadAnalysis 0 0 0 0 29 Expire 0 0 0 0 30 Halt 0 0 0 0 31 Transaction 0 1 2 0 1 usesStmtJournal=1 32 Goto 0 1 0 0 ``` ## Flag ``` ```