I do not know if this is specific to the CSV module or is something generic. Here is a small test case. Note that the max(x) returns the wrong result for the virtual table vs the real table even though the plans are (from what I can tell) equivalent. file = test.csv ``` 1,1 4,4 3,3 2,2 1,1 8,8 7,7 ``` Session: ``` SQLite version 3.34.0 2020-10-05 19:05:20 Enter ".help" for usage hints. sqlite> create virtual table text using csv(filename=test.csv,schema='create table test(x,y)',columns=2); sqlite> select * from text; 1|1 4|4 3|3 2|2 1|1 8|8 7|7 sqlite> create table test as select * from text; sqlite> select * from test; 1|1 4|4 3|3 2|2 1|1 8|8 7|7 sqlite> .eqp full sqlite> select max(x) from text; QUERY PLAN `--SEARCH TABLE text VIRTUAL TABLE INDEX 0: (~24 rows) addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 19 0 0 Start at 19 1 Null 0 1 2 0 r[1..2]=NULL 2 VOpen 0 0 0 vtab:2BE057595E0 0 3 Explain 3 0 0 SEARCH TABLE text VIRTUAL TABLE INDEX 0: (~24 rows) 0 4 Noop 0 0 0 0 Begin WHERE-loop0: text 5 Integer 0 3 0 0 r[3]=0 6 Integer 0 4 0 0 r[4]=0 7 VFilter 0 14 3 0 iplan=r[3] zplan='' 8 Noop 0 0 0 0 Begin WHERE-core 9 VColumn 0 0 5 0 r[5]=vcolumn(0); text.x 10 CollSeq 0 0 0 BINARY-8 0 11 AggStep 0 5 1 max(1) 1 accum=r[1] step(r[5]) 12 Noop 0 0 0 0 End WHERE-core 13 VNext 0 8 0 0 14 Noop 0 0 0 0 End WHERE-loop0: text 15 AggFinal 1 1 0 max(1) 0 accum=r[1] N=1 16 Copy 1 6 0 0 r[6]=r[1] 17 ResultRow 6 1 0 0 output=r[6] 18 Halt 0 0 0 0 19 Transaction 0 0 2 0 1 usesStmtJournal=0 20 Goto 0 1 0 0 7 sqlite> select max(x) from test; QUERY PLAN `--SEARCH TABLE test (~1048576 rows) addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 18 0 0 Start at 18 1 Null 0 1 2 0 r[1..2]=NULL 2 OpenRead 0 2 0 1 0 root=2 iDb=0; test 3 ColumnsUsed 0 0 0 1 0 4 Explain 4 0 0 SEARCH TABLE test (~1048576 rows) 0 5 Noop 0 0 0 0 Begin WHERE-loop0: test 6 Rewind 0 13 0 0 7 Noop 0 0 0 0 Begin WHERE-core 8 Column 0 0 3 0 r[3]=test.x 9 CollSeq 0 0 0 BINARY-8 0 10 AggStep 0 3 1 max(1) 1 accum=r[1] step(r[3]) 11 Noop 0 0 0 0 End WHERE-core 12 Next 0 7 0 1 13 Noop 0 0 0 0 End WHERE-loop0: test 14 AggFinal 1 1 0 max(1) 0 accum=r[1] N=1 15 Copy 1 4 0 0 r[4]=r[1] 16 ResultRow 4 1 0 0 output=r[4] 17 Halt 0 0 0 0 18 Transaction 0 0 2 0 1 usesStmtJournal=0 19 Goto 0 1 0 0 8 sqlite> select max(x) from (select x from text order by x); QUERY PLAN |--CO-ROUTINE 1 | |--SCAN TABLE text VIRTUAL TABLE INDEX 0: (~24 rows) | `--USE TEMP B-TREE FOR ORDER BY `--SEARCH SUBQUERY 1 (~24 rows) addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 39 0 0 Start at 39 1 InitCoroutine 1 23 2 0 subquery_1 2 SorterOpen 2 3 0 k(1,B) 0 3 VOpen 1 0 0 vtab:2BE057595E0 0 4 Explain 4 0 0 SCAN TABLE text VIRTUAL TABLE INDEX 0: (~24 rows) 0 5 Noop 0 0 0 0 Begin WHERE-loop0: text 6 Integer 0 2 0 0 r[2]=0 7 Integer 0 3 0 0 r[3]=0 8 VFilter 1 15 2 0 iplan=r[2] zplan='' 9 Noop 0 0 0 0 Begin WHERE-core 10 VColumn 1 0 4 0 r[4]=vcolumn(0); text.x 11 MakeRecord 4 1 6 0 r[6]=mkrec(r[4]) 12 SorterInsert 2 6 4 1 0 key=r[6] 13 Noop 0 0 0 0 End WHERE-core 14 VNext 1 9 0 0 15 Noop 0 0 0 0 End WHERE-loop0: text 16 OpenPseudo 3 7 3 0 3 columns in r[7] 17 SorterSort 2 22 0 0 18 SorterData 2 7 3 0 r[7]=data 19 Column 3 0 5 0 r[5]=x 20 Yield 1 0 0 0 21 SorterNext 2 18 0 0 22 EndCoroutine 1 0 0 0 23 Null 0 8 9 0 r[8..9]=NULL 24 Explain 24 0 0 SEARCH SUBQUERY 1 (~24 rows) 0 25 Noop 0 0 0 0 Begin WHERE-loop0: subquery_1 26 InitCoroutine 1 0 2 0 27 Yield 1 34 0 0 next row of subquery_1 28 Noop 0 0 0 0 Begin WHERE-core 29 Copy 5 10 0 0 r[10]=r[5]; subquery_1.x 30 CollSeq 0 0 0 BINARY-8 0 31 AggStep 0 10 8 max(1) 1 accum=r[8] step(r[10]) 32 Noop 0 0 0 0 End WHERE-core 33 Goto 0 27 0 0 34 Noop 0 0 0 0 End WHERE-loop0: subquery_1 35 AggFinal 8 1 0 max(1) 0 accum=r[8] N=1 36 Copy 8 11 0 0 r[11]=r[8] 37 ResultRow 11 1 0 0 output=r[11] 38 Halt 0 0 0 0 39 Transaction 0 0 2 0 1 usesStmtJournal=0 40 Goto 0 1 0 0 8 sqlite> ```