135db31b2Sdrh# 2016-06-02 235db31b2Sdrh# 335db31b2Sdrh# The author disclaims copyright to this source code. In place of 435db31b2Sdrh# a legal notice, here is a blessing: 535db31b2Sdrh# 635db31b2Sdrh# May you do good and not evil. 735db31b2Sdrh# May you find forgiveness for yourself and forgive others. 835db31b2Sdrh# May you share freely, never taking more than you give. 935db31b2Sdrh# 1035db31b2Sdrh#*********************************************************************** 1135db31b2Sdrh# 1235db31b2Sdrh# Test cases for CSV virtual table. 1335db31b2Sdrh 1435db31b2Sdrhset testdir [file dirname $argv0] 1535db31b2Sdrhsource $testdir/tester.tcl 16a4c07346Smistachkinset testprefix csv01 1735db31b2Sdrh 1835db31b2Sdrhifcapable !vtab||!cte { finish_test ; return } 1935db31b2Sdrh 2035db31b2Sdrhload_static_extension db csv 2135db31b2Sdrh 2235db31b2Sdrhdo_execsql_test 1.0 { 2335db31b2Sdrh CREATE VIRTUAL TABLE temp.t1 USING csv( 2435db31b2Sdrh data= 2535db31b2Sdrh'1,2,3,4 2635db31b2Sdrh5,6,7,8 2735db31b2Sdrh9,10,11,12 2835db31b2Sdrh13,14,15,16 2935db31b2Sdrh', 3035db31b2Sdrh columns=4 3135db31b2Sdrh ); 3235db31b2Sdrh SELECT * FROM t1 WHERE c1=10; 3335db31b2Sdrh} {9 10 11 12} 3435db31b2Sdrhdo_execsql_test 1.1 { 3535db31b2Sdrh SELECT * FROM t1 WHERE c1='10'; 3635db31b2Sdrh} {9 10 11 12} 3735db31b2Sdrhdo_execsql_test 1.2 { 3835db31b2Sdrh SELECT rowid FROM t1; 3935db31b2Sdrh} {1 2 3 4} 4035db31b2Sdrh 416f147c54Sdrhdo_execsql_test 1.3 { 426f147c54Sdrh DROP TABLE temp.t1; 436f147c54Sdrh CREATE VIRTUAL TABLE temp.t1 USING csv( 446f147c54Sdrh data= 456f147c54Sdrh'a,b,"mix-bloom-eel","soft opinion" 466f147c54Sdrh1,2,3,4 476f147c54Sdrh5,6,7,8 486f147c54Sdrh9,10,11,12 496f147c54Sdrh13,14,15,16 506f147c54Sdrh', 516f147c54Sdrh header=1 526f147c54Sdrh ); 536f147c54Sdrh SELECT * FROM t1 WHERE "soft opinion"=12; 546f147c54Sdrh} {9 10 11 12} 556f147c54Sdrhdo_execsql_test 1.4 { 566f147c54Sdrh SELECT name FROM pragma_table_xinfo('t1'); 576f147c54Sdrh} {a b mix-bloom-eel {soft opinion}} 586f147c54Sdrh 596f147c54Sdrhdo_execsql_test 1.5 { 606f147c54Sdrh DROP TABLE temp.t1; 616f147c54Sdrh CREATE VIRTUAL TABLE temp.t1 USING csv( 626f147c54Sdrh data= 636f147c54Sdrh'a,b,"mix-bloom-eel","soft opinion" 646f147c54Sdrh1,2,3,4 656f147c54Sdrh5,6,7,8 666f147c54Sdrh9,10,11,12 676f147c54Sdrh13,14,15,16 686f147c54Sdrh', 696f147c54Sdrh header=false 706f147c54Sdrh ); 716f147c54Sdrh SELECT * FROM t1 WHERE c1='b'; 726f147c54Sdrh} {a b mix-bloom-eel {soft opinion}} 736f147c54Sdrhdo_execsql_test 1.6 { 746f147c54Sdrh SELECT name FROM pragma_table_xinfo('t1'); 756f147c54Sdrh} {c0 c1 c2 c3} 766f147c54Sdrh 776f147c54Sdrhdo_execsql_test 1.7 { 786f147c54Sdrh DROP TABLE temp.t1; 796f147c54Sdrh CREATE VIRTUAL TABLE temp.t1 USING csv( 806f147c54Sdrh data= 816f147c54Sdrh'a,b,"mix-bloom-eel","soft opinion" 826f147c54Sdrh1,2,3,4 836f147c54Sdrh5,6,7,8 846f147c54Sdrh9,10,11,12 856f147c54Sdrh13,14,15,16 866f147c54Sdrh', 876f147c54Sdrh header, 886f147c54Sdrh schema='CREATE TABLE x(x0,x1,x2,x3,x4)', 896f147c54Sdrh columns=5 906f147c54Sdrh ); 916f147c54Sdrh SELECT * FROM t1 WHERE x1='6'; 926f147c54Sdrh} {5 6 7 8 {}} 936f147c54Sdrhdo_execsql_test 1.8 { 946f147c54Sdrh SELECT name FROM pragma_table_xinfo('t1'); 956f147c54Sdrh} {x0 x1 x2 x3 x4} 966f147c54Sdrh 976f147c54Sdrh 9835db31b2Sdrhdo_execsql_test 2.0 { 9935db31b2Sdrh DROP TABLE t1; 10035db31b2Sdrh CREATE VIRTUAL TABLE temp.t2 USING csv( 10135db31b2Sdrh data= 10235db31b2Sdrh'1,2,3,4 10335db31b2Sdrh5,6,7,8 10435db31b2Sdrh9,10,11,12 10535db31b2Sdrh13,14,15,16 10635db31b2Sdrh', 10735db31b2Sdrh columns=4, 10835db31b2Sdrh schema='CREATE TABLE t2(a INT, b TEXT, c REAL, d BLOB)' 10935db31b2Sdrh ); 11035db31b2Sdrh SELECT * FROM t2 WHERE a=9; 11135db31b2Sdrh} {9 10 11 12} 11235db31b2Sdrhdo_execsql_test 2.1 { 11335db31b2Sdrh SELECT * FROM t2 WHERE b=10; 11435db31b2Sdrh} {9 10 11 12} 11535db31b2Sdrhdo_execsql_test 2.2 { 11635db31b2Sdrh SELECT * FROM t2 WHERE c=11; 11735db31b2Sdrh} {9 10 11 12} 11835db31b2Sdrhdo_execsql_test 2.3 { 11935db31b2Sdrh SELECT * FROM t2 WHERE d=12; 12035db31b2Sdrh} {} 12135db31b2Sdrhdo_execsql_test 2.4 { 12235db31b2Sdrh SELECT * FROM t2 WHERE d='12'; 12335db31b2Sdrh} {9 10 11 12} 12435db31b2Sdrhdo_execsql_test 2.5 { 12535db31b2Sdrh SELECT * FROM t2 WHERE a='9'; 12635db31b2Sdrh} {9 10 11 12} 12735db31b2Sdrh 12835db31b2Sdrhdo_execsql_test 3.0 { 12935db31b2Sdrh DROP TABLE t2; 13035db31b2Sdrh CREATE VIRTUAL TABLE temp.t3 USING csv( 13135db31b2Sdrh data= 13235db31b2Sdrh'1,2,3,4 13335db31b2Sdrh5,6,7,8 13435db31b2Sdrh9,10,11,12 13535db31b2Sdrh13,14,15,16 13635db31b2Sdrh', 13735db31b2Sdrh columns=4, 13835db31b2Sdrh schema= 13935db31b2Sdrh 'CREATE TABLE t3(a PRIMARY KEY,b TEXT,c TEXT,d TEXT) WITHOUT ROWID', 14035db31b2Sdrh testflags=1 14135db31b2Sdrh ); 14235db31b2Sdrh SELECT a FROM t3 WHERE b=6 OR c=7 OR d=12 ORDER BY +a; 14335db31b2Sdrh} {5 9} 14435db31b2Sdrhdo_execsql_test 3.1 { 14535db31b2Sdrh SELECT a FROM t3 WHERE +b=6 OR c=7 OR d=12 ORDER BY +a; 14635db31b2Sdrh} {5 9} 14735db31b2Sdrh 1487edcf627Sdrh# The rowid column is not visible on a WITHOUT ROWID virtual table 1497edcf627Sdrhdo_catchsql_test 3.2 { 1507edcf627Sdrh SELECT rowid, a FROM t3; 1517edcf627Sdrh} {1 {no such column: rowid}} 1527edcf627Sdrh 153e3740f27Sdrh# Multi-column WITHOUT ROWID virtual tables may not be writable. 154ac9c3d2cSdrhdo_catchsql_test 4.0 { 155ac9c3d2cSdrh DROP TABLE t3; 156ac9c3d2cSdrh CREATE VIRTUAL TABLE temp.t4 USING csv_wr( 157ac9c3d2cSdrh data= 158ac9c3d2cSdrh'1,2,3,4 159ac9c3d2cSdrh5,6,7,8 160ac9c3d2cSdrh9,10,11,12 161e3740f27Sdrh13,14,15,16', 162ac9c3d2cSdrh columns=4, 163ac9c3d2cSdrh schema= 164e3740f27Sdrh 'CREATE TABLE t3(a,b,c,d,PRIMARY KEY(a,b)) WITHOUT ROWID', 165ac9c3d2cSdrh testflags=1 166ac9c3d2cSdrh ); 1676f147c54Sdrh} {1 {bad schema: 'CREATE TABLE t3(a,b,c,d,PRIMARY KEY(a,b)) WITHOUT ROWID' - not an error}} 168ac9c3d2cSdrh 169e3740f27Sdrh# WITHOUT ROWID tables with a single-column PRIMARY KEY may be writable. 170e3740f27Sdrhdo_catchsql_test 4.1 { 171e3740f27Sdrh DROP TABLE IF EXISTS t4; 172e3740f27Sdrh CREATE VIRTUAL TABLE temp.t4 USING csv_wr( 173e3740f27Sdrh data= 174e3740f27Sdrh'1,2,3,4 175e3740f27Sdrh5,6,7,8 176e3740f27Sdrh9,10,11,12 177e3740f27Sdrh13,14,15,16', 178e3740f27Sdrh columns=4, 179e3740f27Sdrh schema= 180e3740f27Sdrh 'CREATE TABLE t3(a,b,c,d,PRIMARY KEY(b)) WITHOUT ROWID', 181e3740f27Sdrh testflags=1 182e3740f27Sdrh ); 183e3740f27Sdrh} {0 {}} 184e3740f27Sdrh 18509fc79bdSdando_catchsql_test 4.2 { 18609fc79bdSdan DROP TABLE IF EXISTS t5; 18709fc79bdSdan CREATE VIRTUAL TABLE temp.t5 USING csv_wr( 18809fc79bdSdan data= 18909fc79bdSdan '1,2,3,4 19009fc79bdSdan 5,6,7,8 19109fc79bdSdan 9,10,11,12 19209fc79bdSdan 13,14,15,16', 19309fc79bdSdan columns=4, 19409fc79bdSdan schema= 19509fc79bdSdan 'CREATE TABLE t3(a,b,c,d) WITHOUT ROWID', 19609fc79bdSdan testflags=1 19709fc79bdSdan ); 1986f147c54Sdrh} {1 {bad schema: 'CREATE TABLE t3(a,b,c,d) WITHOUT ROWID' - PRIMARY KEY missing on table t3}} 19909fc79bdSdan 2004d3e6140Sdrh# 2018-04-24 2014d3e6140Sdrh# Memory leak reported on the sqlite-users mailing list by Ralf Junker. 2024d3e6140Sdrh# 2034d3e6140Sdrhdo_catchsql_test 4.3 { 2044d3e6140Sdrh CREATE VIRTUAL TABLE IF NOT EXISTS temp.t1 2054d3e6140Sdrh USING csv(filename='FileDoesNotExist.csv'); 2064d3e6140Sdrh} {1 {cannot open 'FileDoesNotExist.csv' for reading}} 20709fc79bdSdan 208e893e2e4Sdrh# 2018-06-02 209e893e2e4Sdrh# Problem with single-column CSV support reported on the mailing list 210e893e2e4Sdrh# by Trent W. Buck. 211e893e2e4Sdrh# 212e893e2e4Sdrhdo_execsql_test 4.4 { 213e893e2e4Sdrh CREATE VIRTUAL TABLE temp.trent USING csv(data='1'); 214e893e2e4Sdrh SELECT * FROM trent; 215e893e2e4Sdrh} {1} 216e893e2e4Sdrh 21786252214Sdrh# 2018-12-26 21886252214Sdrh# Bug report on the mailing list 21986252214Sdrh# 22086252214Sdrhforcedelete csv01.csv 2211baae57aSdrhset fd [open csv01.csv wb] 22286252214Sdrhputs $fd "a,b,c,d\r\n1,2,3,4\r\none,two,three,four\r\n5,6,7,8" 22386252214Sdrhclose $fd 22486252214Sdrhdo_execsql_test 5.1 { 22586252214Sdrh CREATE VIRTUAL TABLE t5_1 USING csv(filename='csv01.csv'); 22686252214Sdrh SELECT name FROM temp.pragma_table_info('t5_1'); 22786252214Sdrh} {c0 c1 c2 c3} 22886252214Sdrhdo_execsql_test 5.2 { 22986252214Sdrh SELECT *, '|' FROM t5_1; 23086252214Sdrh} {a b c d | 1 2 3 4 | one two three four | 5 6 7 8 |} 23186252214Sdrhdo_execsql_test 5.3 { 23286252214Sdrh DROP TABLE t5_1; 23386252214Sdrh CREATE VIRTUAL TABLE t5_1 USING csv(filename='csv01.csv', header); 23486252214Sdrh SELECT name FROM temp.pragma_table_info('t5_1'); 23586252214Sdrh} {a b c d} 23686252214Sdrhdo_execsql_test 5.4 { 23786252214Sdrh SELECT *, '|' FROM t5_1; 23886252214Sdrh} {1 2 3 4 | one two three four | 5 6 7 8 |} 23986252214Sdrh 240c578e4f0Sdan#------------------------------------------------------------------------- 241c578e4f0Sdan 242c578e4f0Sdanproc randomtext {n} { 243c578e4f0Sdan string range [db one {SELECT hex(randomblob($n))}] 1 $n 244c578e4f0Sdan} 245c578e4f0Sdan 246c578e4f0Sdanfor {set ii 0} {$ii < 200} {incr ii} { 247c578e4f0Sdan reset_db 248c578e4f0Sdan load_static_extension db csv 249c578e4f0Sdan set fd [open csv.data w] 250c578e4f0Sdan puts $fd "a,b" 251c578e4f0Sdan puts $fd "[randomtext $ii],abcd" 252c578e4f0Sdan close $fd 253c578e4f0Sdan do_execsql_test 6.$ii.1 { 254c578e4f0Sdan CREATE VIRTUAL TABLE abc USING csv(filename='csv.data', header=true); 255c578e4f0Sdan } 256c578e4f0Sdan do_execsql_test 6.$ii.2 { 257c578e4f0Sdan SELECT count(*) FROM abc 258c578e4f0Sdan } 1 259c578e4f0Sdan} 260c578e4f0Sdan 261*e7ebe0aaSdanfor {set ii 0} {$ii < 20} {incr ii} { 262*e7ebe0aaSdan reset_db 263*e7ebe0aaSdan load_static_extension db csv 264*e7ebe0aaSdan set T [randomtext $ii] 265*e7ebe0aaSdan set fd [open csv.data w] 266*e7ebe0aaSdan puts $fd "a,b" 267*e7ebe0aaSdan puts -nonewline $fd "abcd,$T" 268*e7ebe0aaSdan close $fd 269*e7ebe0aaSdan do_execsql_test 7.$ii.1 { 270*e7ebe0aaSdan CREATE VIRTUAL TABLE abc USING csv(filename='csv.data', header=true); 271*e7ebe0aaSdan } 272*e7ebe0aaSdan breakpoint 273*e7ebe0aaSdan do_execsql_test 7.$ii.2 { 274*e7ebe0aaSdan SELECT * FROM abc 275*e7ebe0aaSdan } [list abcd $T] 276*e7ebe0aaSdan} 277*e7ebe0aaSdan 278*e7ebe0aaSdan 27935db31b2Sdrhfinish_test 280