blob: b63fafc3656e666e62566527332f142aa92721d9 [file] [log] [blame]
shanehac81cd72009-11-10 17:07:30 +00001# 2009 Nov 11
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#
14# $Id: shell2.test,v 1.7 2009/07/17 16:54:48 shaneh Exp $
15#
16
17# Test plan:
18#
19# shell2-1.*: Misc. test of various tickets and reported errors.
20#
21
22package require sqlite3
23
shanehca7dfda2009-12-17 21:07:54 +000024set CLI "./sqlite3"
shaneh5fc25012009-11-11 04:17:07 +000025
shanehac81cd72009-11-10 17:07:30 +000026proc do_test {name cmd expected} {
27 puts -nonewline "$name ..."
28 set res [uplevel $cmd]
29 if {$res eq $expected} {
30 puts Ok
31 } else {
32 puts Error
33 puts " Got: $res"
34 puts " Expected: $expected"
35 exit
36 }
37}
38
39proc execsql {sql} {
40 uplevel [list db eval $sql]
41}
42
43proc catchsql {sql} {
44 set rc [catch {uplevel [list db eval $sql]} msg]
45 list $rc $msg
46}
47
shanehca7dfda2009-12-17 21:07:54 +000048proc catchcmd {db {cmd ""}} {
shaneh5fc25012009-11-11 04:17:07 +000049 global CLI
shanehac81cd72009-11-10 17:07:30 +000050 set out [open cmds.txt w]
51 puts $out $cmd
52 close $out
shaneh5fc25012009-11-11 04:17:07 +000053 set line "exec $CLI $db < cmds.txt"
54 set rc [catch { eval $line } msg]
shanehac81cd72009-11-10 17:07:30 +000055 list $rc $msg
56}
57
58file delete -force test.db test.db.journal
59sqlite3 db test.db
60
61
62#----------------------------------------------------------------------------
63# shell2-1.*: Misc. test of various tickets and reported errors.
64#
65
66# Batch mode not creating databases.
shaneh5fc25012009-11-11 04:17:07 +000067# Reported on mailing list by Ken Zalewski.
shanehac81cd72009-11-10 17:07:30 +000068# Ticket [aeff892c57].
69do_test shell2-1.1.1 {
70 file delete -force foo.db
shaneh5fc25012009-11-11 04:17:07 +000071 set rc [ catchcmd "-batch foo.db" "CREATE TABLE t1(a);" ]
shanehac81cd72009-11-10 17:07:30 +000072 set fexist [file exist foo.db]
73 list $rc $fexist
74} {{0 {}} 1}
75
shaneh5fc25012009-11-11 04:17:07 +000076# Shell silently ignores extra parameters.
77# Ticket [f5cb008a65].
78do_test shell2-1.2.1 {
79 set rc [catch { eval exec $CLI \":memory:\" \"select 3\" \"select 4\" } msg]
80 list $rc \
81 [regexp {Error: too many options: "select 4"} $msg]
82} {1 1}
83
dan4564ced2010-01-05 04:59:56 +000084# Test a problem reported on the mailing list. The shell was at one point
85# returning the generic SQLITE_ERROR message ("SQL error or missing database")
86# instead of the "too many levels..." message in the test below.
87#
88do_test shell2-1.3 {
89 catchcmd "-batch test.db" {
90 PRAGMA recursive_triggers = ON;
91 CREATE TABLE t5(a PRIMARY KEY, b, c);
92 INSERT INTO t5 VALUES(1, 2, 3);
93 CREATE TRIGGER au_tble AFTER UPDATE ON t5 BEGIN
94 UPDATE OR IGNORE t5 SET a = new.a, c = 10;
95 END;
96
97 UPDATE OR REPLACE t5 SET a = 4 WHERE a = 1;
98 }
99} {1 {Error: near line 9: too many levels of trigger recursion}}
shanehca7dfda2009-12-17 21:07:54 +0000100
shaneh5fc25012009-11-11 04:17:07 +0000101
shanehb7977c52010-01-18 18:17:10 +0000102
103# Shell not echoing all commands with echo on.
104# Ticket [eb620916be].
105
106# Test with echo off
107# NB. whitespace is important
108do_test shell2-1.4.1 {
109 file delete -force foo.db
110 catchcmd "foo.db" {CREATE TABLE foo(a);
111INSERT INTO foo(a) VALUES(1);
112SELECT * FROM foo;}
113} {0 1}
114
115# Test with echo on using command line option
116# NB. whitespace is important
117do_test shell2-1.4.2 {
118 file delete -force foo.db
119 catchcmd "-echo foo.db" {CREATE TABLE foo(a);
120INSERT INTO foo(a) VALUES(1);
121SELECT * FROM foo;}
122} {0 {CREATE TABLE foo(a);
123INSERT INTO foo(a) VALUES(1);
124SELECT * FROM foo;
1251}}
126
127# Test with echo on using dot command
128# NB. whitespace is important
129do_test shell2-1.4.3 {
130 file delete -force foo.db
131 catchcmd "foo.db" {.echo ON
132CREATE TABLE foo(a);
133INSERT INTO foo(a) VALUES(1);
134SELECT * FROM foo;}
135} {0 {CREATE TABLE foo(a);
136INSERT INTO foo(a) VALUES(1);
137SELECT * FROM foo;
1381}}
139
140# Test with echo on using dot command and
141# turning off mid- processing.
142# NB. whitespace is important
143do_test shell2-1.4.4 {
144 file delete -force foo.db
145 catchcmd "foo.db" {.echo ON
146CREATE TABLE foo(a);
147.echo OFF
148INSERT INTO foo(a) VALUES(1);
149SELECT * FROM foo;}
150} {0 {CREATE TABLE foo(a);
151.echo OFF
1521}}
153
154# Test with echo on using dot command and
155# multiple commands per line.
156# NB. whitespace is important
157do_test shell2-1.4.5 {
158 file delete -force foo.db
159 catchcmd "foo.db" {.echo ON
160CREATE TABLE foo1(a);
161INSERT INTO foo1(a) VALUES(1);
162CREATE TABLE foo2(b);
163INSERT INTO foo2(b) VALUES(1);
164SELECT * FROM foo1; SELECT * FROM foo2;
165INSERT INTO foo1(a) VALUES(2); INSERT INTO foo2(b) VALUES(2);
166SELECT * FROM foo1; SELECT * FROM foo2;
167}
168} {0 {CREATE TABLE foo1(a);
169INSERT INTO foo1(a) VALUES(1);
170CREATE TABLE foo2(b);
171INSERT INTO foo2(b) VALUES(1);
172SELECT * FROM foo1;
1731
174SELECT * FROM foo2;
1751
176INSERT INTO foo1(a) VALUES(2);
177INSERT INTO foo2(b) VALUES(2);
178SELECT * FROM foo1;
1791
1802
181SELECT * FROM foo2;
1821
1832}}
184
185# Test with echo on and headers on using dot command and
186# multiple commands per line.
187# NB. whitespace is important
188do_test shell2-1.4.6 {
189 file delete -force foo.db
190 catchcmd "foo.db" {.echo ON
191.headers ON
192CREATE TABLE foo1(a);
193INSERT INTO foo1(a) VALUES(1);
194CREATE TABLE foo2(b);
195INSERT INTO foo2(b) VALUES(1);
196SELECT * FROM foo1; SELECT * FROM foo2;
197INSERT INTO foo1(a) VALUES(2); INSERT INTO foo2(b) VALUES(2);
198SELECT * FROM foo1; SELECT * FROM foo2;
199}
200} {0 {.headers ON
201CREATE TABLE foo1(a);
202INSERT INTO foo1(a) VALUES(1);
203CREATE TABLE foo2(b);
204INSERT INTO foo2(b) VALUES(1);
205SELECT * FROM foo1;
206a
2071
208SELECT * FROM foo2;
209b
2101
211INSERT INTO foo1(a) VALUES(2);
212INSERT INTO foo2(b) VALUES(2);
213SELECT * FROM foo1;
214a
2151
2162
217SELECT * FROM foo2;
218b
2191
2202}}
drh74bec6b2010-07-19 15:01:43 +0000221
222puts "CLI tests completed successfully"