xref: /sqlite-3.40.0/test/csv01.test (revision e7ebe0aa)
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