1# 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# 21set testdir [file dirname $argv0] 22source $testdir/tester.tcl 23set CLI [test_find_cli] 24db close 25forcedelete test.db test.db-journal test.db-wal 26sqlite3 db test.db 27 28 29#---------------------------------------------------------------------------- 30# shell2-1.*: Misc. test of various tickets and reported errors. 31# 32 33# Batch mode not creating databases. 34# Reported on mailing list by Ken Zalewski. 35# Ticket [aeff892c57]. 36do_test shell2-1.1.1 { 37 forcedelete foo.db 38 set rc [ catchcmd "-batch foo.db" "CREATE TABLE t1(a);" ] 39 set fexist [file exist foo.db] 40 list $rc $fexist 41} {{0 {}} 1} 42 43# Shell silently ignores extra parameters. 44# Ticket [f5cb008a65]. 45do_test shell2-1.2.1 { 46 catchcmdex {:memory: "select+3" "select+4"} 47} {0 {3 484 49}} 50 51# Test a problem reported on the mailing list. The shell was at one point 52# returning the generic SQLITE_ERROR message ("SQL error or missing database") 53# instead of the "too many levels..." message in the test below. 54# 55do_test shell2-1.3 { 56 catchcmd "-batch test.db" { 57 PRAGMA recursive_triggers = ON; 58 CREATE TABLE t5(a PRIMARY KEY, b, c); 59 INSERT INTO t5 VALUES(1, 2, 3); 60 CREATE TRIGGER au_tble AFTER UPDATE ON t5 BEGIN 61 UPDATE OR IGNORE t5 SET a = new.a, c = 10; 62 END; 63 64 UPDATE OR REPLACE t5 SET a = 4 WHERE a = 1; 65 } 66} {1 {Runtime error near line 9: too many levels of trigger recursion}} 67 68 69 70# Shell not echoing all commands with echo on. 71# Ticket [eb620916be]. 72 73# Test with echo off 74# NB. whitespace is important 75do_test shell2-1.4.1 { 76 forcedelete foo.db 77 catchcmd "foo.db" {CREATE TABLE foo(a); 78INSERT INTO foo(a) VALUES(1); 79SELECT * FROM foo;} 80} {0 1} 81 82# Test with echo on using command line option 83# NB. whitespace is important 84do_test shell2-1.4.2 { 85 forcedelete foo.db 86 catchcmd "-echo foo.db" {CREATE TABLE foo(a); 87INSERT INTO foo(a) VALUES(1); 88SELECT * FROM foo;} 89} {0 {CREATE TABLE foo(a); 90INSERT INTO foo(a) VALUES(1); 91SELECT * FROM foo; 921}} 93 94# Test with echo on using dot command 95# NB. whitespace is important 96do_test shell2-1.4.3 { 97 forcedelete foo.db 98 catchcmd "foo.db" {.echo ON 99CREATE TABLE foo(a); 100INSERT INTO foo(a) VALUES(1); 101SELECT * FROM foo;} 102} {0 {CREATE TABLE foo(a); 103INSERT INTO foo(a) VALUES(1); 104SELECT * FROM foo; 1051}} 106 107# Test with echo on using dot command and 108# turning off mid- processing. 109# NB. whitespace is important 110do_test shell2-1.4.4 { 111 forcedelete foo.db 112 catchcmd "foo.db" {.echo ON 113CREATE TABLE foo(a); 114.echo OFF 115INSERT INTO foo(a) VALUES(1); 116SELECT * FROM foo;} 117} {0 {CREATE TABLE foo(a); 118.echo OFF 1191}} 120 121# Test with echo on using dot command and 122# multiple commands per line. 123# NB. whitespace is important 124do_test shell2-1.4.5 { 125 forcedelete foo.db 126 catchcmdex "foo.db" {.echo ON 127CREATE TABLE foo1(a); 128INSERT INTO foo1(a) VALUES(1); 129CREATE TABLE foo2(b); 130INSERT INTO foo2(b) VALUES(1); 131SELECT * FROM foo1; SELECT * FROM foo2; 132INSERT INTO foo1(a) VALUES(2); INSERT INTO foo2(b) VALUES(2); 133SELECT * FROM foo1; SELECT * FROM foo2; 134} 135} {0 {CREATE TABLE foo1(a); 136INSERT INTO foo1(a) VALUES(1); 137CREATE TABLE foo2(b); 138INSERT INTO foo2(b) VALUES(1); 139SELECT * FROM foo1; SELECT * FROM foo2; 1401 1411 142INSERT INTO foo1(a) VALUES(2); INSERT INTO foo2(b) VALUES(2); 143SELECT * FROM foo1; SELECT * FROM foo2; 1441 1452 1461 1472 148}} 149 150# Test with echo on and headers on using dot command and 151# multiple commands per line. 152# NB. whitespace is important 153do_test shell2-1.4.6 { 154 forcedelete foo.db 155 catchcmdex "foo.db" {.echo ON 156.headers ON 157CREATE TABLE foo1(a); 158INSERT INTO foo1(a) VALUES(1); 159CREATE TABLE foo2(b); 160INSERT INTO foo2(b) VALUES(1); 161SELECT * FROM foo1; SELECT * FROM foo2; 162INSERT INTO foo1(a) VALUES(2); INSERT INTO foo2(b) VALUES(2); 163SELECT * FROM foo1; SELECT * FROM foo2; 164} 165} {0 {.headers ON 166CREATE TABLE foo1(a); 167INSERT INTO foo1(a) VALUES(1); 168CREATE TABLE foo2(b); 169INSERT INTO foo2(b) VALUES(1); 170SELECT * FROM foo1; SELECT * FROM foo2; 171a 1721 173b 1741 175INSERT INTO foo1(a) VALUES(2); INSERT INTO foo2(b) VALUES(2); 176SELECT * FROM foo1; SELECT * FROM foo2; 177a 1781 1792 180b 1811 1822 183}} 184 185# Test for rejection of incomplete input at EOF. 186# Reported at https://sqlite.org/forum/forumpost/718f489a43be3197 187do_test shell2-1.4.7 { 188 catchcmd ":memory:" { 189 SELECT 'unclosed;} 190} {1 {Parse error near line 2: unrecognized token: "'unclosed;" 191 SELECT 'unclosed; 192 ^--- error here}} 193 194finish_test 195