xref: /sqlite-3.40.0/test/shell5.test (revision 049d487e)
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
35sqlite3 db test.db
36
37#----------------------------------------------------------------------------
38# Test cases shell5-1.*: Basic handling of the .import and .separator commands.
39#
40
41# .import FILE TABLE     Import data from FILE into TABLE
42do_test shell5-1.1.1 {
43  catchcmd "test.db" ".import"
44} {1 {Error: unknown command or invalid arguments:  "import". Enter ".help" for help}}
45do_test shell5-1.1.2 {
46  catchcmd "test.db" ".import FOO"
47} {1 {Error: unknown command or invalid arguments:  "import". Enter ".help" for help}}
48#do_test shell5-1.1.2 {
49#  catchcmd "test.db" ".import FOO BAR"
50#} {1 {Error: no such table: BAR}}
51do_test shell5-1.1.3 {
52  # too many arguments
53  catchcmd "test.db" ".import FOO BAR BAD"
54} {1 {Error: unknown command or invalid arguments:  "import". Enter ".help" for help}}
55
56# .separator STRING      Change separator used by output mode and .import
57do_test shell1-1.2.1 {
58  catchcmd "test.db" ".separator"
59} {1 {Error: unknown command or invalid arguments:  "separator". Enter ".help" for help}}
60do_test shell1-1.2.2 {
61  catchcmd "test.db" ".separator FOO"
62} {0 {}}
63do_test shell1-1.2.3 {
64  # too many arguments
65  catchcmd "test.db" ".separator FOO BAD"
66} {1 {Error: unknown command or invalid arguments:  "separator". Enter ".help" for help}}
67
68# separator should default to "|"
69do_test shell5-1.3.1 {
70  set res [catchcmd "test.db" ".show"]
71  list [regexp {separator: \"\|\"} $res]
72} {1}
73
74# set separator to different value.
75# check that .show reports new value
76do_test shell5-1.3.2 {
77  set res [catchcmd "test.db" {.separator ,
78.show}]
79  list [regexp {separator: \",\"} $res]
80} {1}
81
82# import file doesn't exist
83do_test shell5-1.4.1 {
84  file delete -force FOO
85  set res [catchcmd "test.db" {CREATE TABLE t1(a, b);
86.import FOO t1}]
87} {1 {Error: cannot open "FOO"}}
88
89# empty import file
90do_test shell5-1.4.2 {
91  file delete -force shell5.csv
92  set in [open shell5.csv w]
93  close $in
94  set res [catchcmd "test.db" {.import shell5.csv t1
95SELECT COUNT(*) FROM t1;}]
96} {0 0}
97
98# import file with 1 row, 1 column (expecting 2 cols)
99do_test shell5-1.4.3 {
100  set in [open shell5.csv w]
101  puts $in "1"
102  close $in
103  set res [catchcmd "test.db" {.import shell5.csv t1}]
104} {1 {shell5.csv:1: expected 2 columns but found 1 - filling the rest with NULL}}
105
106# import file with 1 row, 3 columns (expecting 2 cols)
107do_test shell5-1.4.4 {
108  set in [open shell5.csv w]
109  puts $in "1|2|3"
110  close $in
111  set res [catchcmd "test.db" {.import shell5.csv t1}]
112} {1 {shell5.csv:1: expected 2 columns but found 3 - extras ignored}}
113
114# import file with 1 row, 2 columns
115do_test shell5-1.4.5 {
116  set in [open shell5.csv w]
117  puts $in "1|2"
118  close $in
119  set res [catchcmd "test.db" {DELETE FROM t1;
120.import shell5.csv t1
121SELECT COUNT(*) FROM t1;}]
122} {0 1}
123
124# import file with 2 rows, 2 columns
125# note we end up with 3 rows because of the 1 row
126# imported above.
127do_test shell5-1.4.6 {
128  set in [open shell5.csv w]
129  puts $in "2|3"
130  puts $in "3|4"
131  close $in
132  set res [catchcmd "test.db" {.import shell5.csv t1
133SELECT COUNT(*) FROM t1;}]
134} {0 3}
135
136# import file with 1 row, 2 columns, using a comma
137do_test shell5-1.4.7 {
138  set in [open shell5.csv w]
139  puts $in "4,5"
140  close $in
141  set res [catchcmd "test.db" {.separator ,
142.import shell5.csv t1
143SELECT COUNT(*) FROM t1;}]
144} {0 4}
145
146# import file with 1 row, 2 columns, text data
147do_test shell5-1.4.8.1 {
148  set in [open shell5.csv w]
149  puts $in "5|Now is the time for all good men to come to the aid of their country."
150  close $in
151  set res [catchcmd "test.db" {.import shell5.csv t1
152SELECT COUNT(*) FROM t1;}]
153} {0 5}
154
155do_test shell5-1.4.8.2 {
156  catchcmd "test.db" {SELECT b FROM t1 WHERE a='5';}
157} {0 {Now is the time for all good men to come to the aid of their country.}}
158
159# import file with 1 row, 2 columns, quoted text data
160# note that currently sqlite doesn't support quoted fields, and
161# imports the entire field, quotes and all.
162do_test shell5-1.4.9.1 {
163  set in [open shell5.csv w]
164  puts $in "6|'Now is the time for all good men to come to the aid of their country.'"
165  close $in
166  set res [catchcmd "test.db" {.import shell5.csv t1
167SELECT COUNT(*) FROM t1;}]
168} {0 6}
169
170do_test shell5-1.4.9.2 {
171  catchcmd "test.db" {SELECT b FROM t1 WHERE a='6';}
172} {0 {'Now is the time for all good men to come to the aid of their country.'}}
173
174# import file with 1 row, 2 columns, quoted text data
175do_test shell5-1.4.10.1 {
176  set in [open shell5.csv w]
177  puts $in "7|\"Now is the time for all good men to come to the aid of their country.\""
178  close $in
179  set res [catchcmd "test.db" {.import shell5.csv t1
180SELECT COUNT(*) FROM t1;}]
181} {0 7}
182
183do_test shell5-1.4.10.2 {
184  catchcmd "test.db" {SELECT b FROM t1 WHERE a='7';}
185} {0 {Now is the time for all good men to come to the aid of their country.}}
186
187# check importing very long field
188do_test shell5-1.5.1 {
189  set str [string repeat X 999]
190  set in [open shell5.csv w]
191  puts $in "8|$str"
192  close $in
193  set res [catchcmd "test.db" {.import shell5.csv t1
194SELECT length(b) FROM t1 WHERE a='8';}]
195} {0 999}
196
197# try importing into a table with a large number of columns.
198# This is limited by SQLITE_MAX_VARIABLE_NUMBER, which defaults to 999.
199set cols 999
200do_test shell5-1.6.1 {
201  set data {}
202  for {set i 1} {$i<$cols} {incr i} {
203    append data "c$i|"
204  }
205  append data "c$cols\n";
206  for {set i 1} {$i<$cols} {incr i} {
207    append data "$i|"
208  }
209  append data "$cols"
210  set in [open shell5.csv w]
211  puts $in $data
212  close $in
213  set res [catchcmd "test.db" {.import shell5.csv t2
214SELECT COUNT(*) FROM t2;}]
215} {0 1}
216
217# try importing a large number of rows
218set rows 9999
219do_test shell5-1.7.1 {
220  set in [open shell5.csv w]
221  puts $in a
222  for {set i 1} {$i<=$rows} {incr i} {
223    puts $in $i
224  }
225  close $in
226  set res [catchcmd "test.db" {.mode csv
227.import shell5.csv t3
228SELECT COUNT(*) FROM t3;}]
229} [list 0 $rows]
230
231# Inport from a pipe.  (Unix only, as it requires "awk")
232if {$tcl_platform(platform)=="unix"} {
233  do_test shell5-1.8 {
234    file delete -force test.db
235    catchcmd test.db {.mode csv
236.import "|awk 'END{print \"x,y\";for(i=1;i<=5;i++){print i \",this is \" i}}'" t1
237SELECT * FROM t1;}
238  } {0 {1,"this is 1"
2392,"this is 2"
2403,"this is 3"
2414,"this is 4"
2425,"this is 5"}}
243}
244
245finish_test
246