xref: /sqlite-3.40.0/test/shell5.test (revision a3fdec71)
1# 2010 August 4
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11#
12# The focus of this file is testing the CLI shell tool.
13# These tests are specific to the .import command.
14#
15# $Id: shell5.test,v 1.7 2009/07/17 16:54:48 shaneh Exp $
16#
17
18# Test plan:
19#
20#   shell5-1.*: Basic tests specific to the ".import" command.
21#
22set testdir [file dirname $argv0]
23source $testdir/tester.tcl
24if {$tcl_platform(platform)=="windows"} {
25  set CLI "sqlite3.exe"
26} else {
27  set CLI "./sqlite3"
28}
29if {![file executable $CLI]} {
30  finish_test
31  return
32}
33db close
34forcedelete test.db test.db-journal test.db-wal
35
36#----------------------------------------------------------------------------
37# Test cases shell5-1.*: Basic handling of the .import and .separator commands.
38#
39
40# .import FILE TABLE     Import data from FILE into TABLE
41do_test shell5-1.1.1 {
42  catchcmd "test.db" ".import"
43} {1 {Error: unknown command or invalid arguments:  "import". Enter ".help" for help}}
44do_test shell5-1.1.2 {
45  catchcmd "test.db" ".import FOO"
46} {1 {Error: unknown command or invalid arguments:  "import". Enter ".help" for help}}
47#do_test shell5-1.1.2 {
48#  catchcmd "test.db" ".import FOO BAR"
49#} {1 {Error: no such table: BAR}}
50do_test shell5-1.1.3 {
51  # too many arguments
52  catchcmd "test.db" ".import FOO BAR BAD"
53} {1 {Error: unknown command or invalid arguments:  "import". Enter ".help" for help}}
54
55# .separator STRING      Change separator used by output mode and .import
56do_test shell1-1.2.1 {
57  catchcmd "test.db" ".separator"
58} {1 {Error: unknown command or invalid arguments:  "separator". Enter ".help" for help}}
59do_test shell1-1.2.2 {
60  catchcmd "test.db" ".separator FOO"
61} {0 {}}
62do_test shell1-1.2.3 {
63  # too many arguments
64  catchcmd "test.db" ".separator FOO BAD"
65} {1 {Error: unknown command or invalid arguments:  "separator". Enter ".help" for help}}
66
67# separator should default to "|"
68do_test shell5-1.3.1 {
69  set res [catchcmd "test.db" ".show"]
70  list [regexp {separator: \"\|\"} $res]
71} {1}
72
73# set separator to different value.
74# check that .show reports new value
75do_test shell5-1.3.2 {
76  set res [catchcmd "test.db" {.separator ,
77.show}]
78  list [regexp {separator: \",\"} $res]
79} {1}
80
81# import file doesn't exist
82do_test shell5-1.4.1 {
83  forcedelete FOO
84  set res [catchcmd "test.db" {CREATE TABLE t1(a, b);
85.import FOO t1}]
86} {1 {Error: cannot open "FOO"}}
87
88# empty import file
89do_test shell5-1.4.2 {
90  forcedelete shell5.csv
91  set in [open shell5.csv w]
92  close $in
93  set res [catchcmd "test.db" {.import shell5.csv t1
94SELECT COUNT(*) FROM t1;}]
95} {0 0}
96
97# import file with 1 row, 1 column (expecting 2 cols)
98do_test shell5-1.4.3 {
99  set in [open shell5.csv w]
100  puts $in "1"
101  close $in
102  set res [catchcmd "test.db" {.import shell5.csv t1}]
103} {1 {shell5.csv:1: expected 2 columns but found 1 - filling the rest with NULL}}
104
105# import file with 1 row, 3 columns (expecting 2 cols)
106do_test shell5-1.4.4 {
107  set in [open shell5.csv w]
108  puts $in "1|2|3"
109  close $in
110  set res [catchcmd "test.db" {.import shell5.csv t1}]
111} {1 {shell5.csv:1: expected 2 columns but found 3 - extras ignored}}
112
113# import file with 1 row, 2 columns
114do_test shell5-1.4.5 {
115  set in [open shell5.csv w]
116  puts $in "1|2"
117  close $in
118  set res [catchcmd "test.db" {DELETE FROM t1;
119.import shell5.csv t1
120SELECT COUNT(*) FROM t1;}]
121} {0 1}
122
123# import file with 2 rows, 2 columns
124# note we end up with 3 rows because of the 1 row
125# imported above.
126do_test shell5-1.4.6 {
127  set in [open shell5.csv w]
128  puts $in "2|3"
129  puts $in "3|4"
130  close $in
131  set res [catchcmd "test.db" {.import shell5.csv t1
132SELECT COUNT(*) FROM t1;}]
133} {0 3}
134
135# import file with 1 row, 2 columns, using a comma
136do_test shell5-1.4.7 {
137  set in [open shell5.csv w]
138  puts $in "4,5"
139  close $in
140  set res [catchcmd "test.db" {.separator ,
141.import shell5.csv t1
142SELECT COUNT(*) FROM t1;}]
143} {0 4}
144
145# import file with 1 row, 2 columns, text data
146do_test shell5-1.4.8.1 {
147  set in [open shell5.csv w]
148  puts $in "5|Now is the time for all good men to come to the aid of their country."
149  close $in
150  set res [catchcmd "test.db" {.import shell5.csv t1
151SELECT COUNT(*) FROM t1;}]
152} {0 5}
153
154do_test shell5-1.4.8.2 {
155  catchcmd "test.db" {SELECT b FROM t1 WHERE a='5';}
156} {0 {Now is the time for all good men to come to the aid of their country.}}
157
158# import file with 1 row, 2 columns, quoted text data
159# note that currently sqlite doesn't support quoted fields, and
160# imports the entire field, quotes and all.
161do_test shell5-1.4.9.1 {
162  set in [open shell5.csv w]
163  puts $in "6|'Now is the time for all good men to come to the aid of their country.'"
164  close $in
165  set res [catchcmd "test.db" {.import shell5.csv t1
166SELECT COUNT(*) FROM t1;}]
167} {0 6}
168
169do_test shell5-1.4.9.2 {
170  catchcmd "test.db" {SELECT b FROM t1 WHERE a='6';}
171} {0 {'Now is the time for all good men to come to the aid of their country.'}}
172
173# import file with 1 row, 2 columns, quoted text data
174do_test shell5-1.4.10.1 {
175  set in [open shell5.csv w]
176  puts $in "7|\"Now is the time for all good men to come to the aid of their country.\""
177  close $in
178  set res [catchcmd "test.db" {.import shell5.csv t1
179SELECT COUNT(*) FROM t1;}]
180} {0 7}
181
182do_test shell5-1.4.10.2 {
183  catchcmd "test.db" {SELECT b FROM t1 WHERE a='7';}
184} {0 {Now is the time for all good men to come to the aid of their country.}}
185
186# check importing very long field
187do_test shell5-1.5.1 {
188  set str [string repeat X 999]
189  set in [open shell5.csv w]
190  puts $in "8|$str"
191  close $in
192  set res [catchcmd "test.db" {.import shell5.csv t1
193SELECT length(b) FROM t1 WHERE a='8';}]
194} {0 999}
195
196# try importing into a table with a large number of columns.
197# This is limited by SQLITE_MAX_VARIABLE_NUMBER, which defaults to 999.
198set cols 999
199do_test shell5-1.6.1 {
200  set data {}
201  for {set i 1} {$i<$cols} {incr i} {
202    append data "c$i|"
203  }
204  append data "c$cols\n";
205  for {set i 1} {$i<$cols} {incr i} {
206    append data "$i|"
207  }
208  append data "$cols"
209  set in [open shell5.csv w]
210  puts $in $data
211  close $in
212  set res [catchcmd "test.db" {.import shell5.csv t2
213SELECT COUNT(*) FROM t2;}]
214} {0 1}
215
216# try importing a large number of rows
217set rows 9999
218do_test shell5-1.7.1 {
219  set in [open shell5.csv w]
220  puts $in a
221  for {set i 1} {$i<=$rows} {incr i} {
222    puts $in $i
223  }
224  close $in
225  set res [catchcmd "test.db" {.mode csv
226.import shell5.csv t3
227SELECT COUNT(*) FROM t3;}]
228} [list 0 $rows]
229
230# Inport from a pipe.  (Unix only, as it requires "awk")
231if {$tcl_platform(platform)=="unix"} {
232  do_test shell5-1.8 {
233    forcedelete test.db
234    catchcmd test.db {.mode csv
235.import "|awk 'END{print \"x,y\";for(i=1;i<=5;i++){print i \",this is \" i}}'" t1
236SELECT * FROM t1;}
237  } {0 {1,"this is 1"
2382,"this is 2"
2393,"this is 3"
2404,"this is 4"
2415,"this is 5"}}
242}
243
244# Import columns containing quoted strings
245do_test shell5-1.9 {
246  set out [open shell5.csv w]
247  fconfigure $out -translation lf
248  puts $out {1,"",11}
249  puts $out {2,"x",22}
250  puts $out {3,"""",33}
251  puts $out {4,"hello",44}
252  puts $out "5,55,\"\"\r"
253  puts $out {6,66,"x"}
254  puts $out {7,77,""""}
255  puts $out {8,88,"hello"}
256  puts $out {"",9,99}
257  puts $out {"x",10,110}
258  puts $out {"""",11,121}
259  puts $out {"hello",12,132}
260  close $out
261  forcedelete test.db
262  catchcmd test.db {.mode csv
263    CREATE TABLE t1(a,b,c);
264.import shell5.csv t1
265  }
266  sqlite3 db test.db
267  db eval {SELECT *, '|' FROM t1 ORDER BY rowid}
268} {1 {} 11 | 2 x 22 | 3 {"} 33 | 4 hello 44 | 5 55 {} | 6 66 x | 7 77 {"} | 8 88 hello | {} 9 99 | x 10 110 | {"} 11 121 | hello 12 132 |}
269db close
270
271# Import columns containing quoted strings
272do_test shell5-1.10 {
273  set out [open shell5.csv w]
274  fconfigure $out -translation lf
275  puts $out {column1,column2,column3,column4}
276  puts $out "field1,field2,\"x3 \"\"\r\ndata\"\" 3\",field4"
277  puts $out "x1,x2,\"x3 \"\"\ndata\"\" 3\",x4"
278  close $out
279  forcedelete test.db
280  catchcmd test.db {.mode csv
281    CREATE TABLE t1(a,b,c,d);
282.import shell5.csv t1
283  }
284  sqlite3 db test.db
285  db eval {SELECT hex(c) FROM t1 ORDER BY rowid}
286} {636F6C756D6E33 783320220D0A64617461222033 783320220A64617461222033}
287
288db close
289
290finish_test
291