mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-06 15:49:35 +03:00
Improved shell "dot" command argument handling. Ticket [f12a9eeedc].
FossilOrigin-Name: 9fb699193378bf812ef97889adc0b1a98ad56d5b
This commit is contained in:
26
manifest
26
manifest
@@ -1,8 +1,5 @@
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA1
|
||||
|
||||
C Fix\sthe\sbackup\sAPI\sso\sthat\sa\sbackup\sfrom\san\sempty\sdatabase\sto\sa\snon-empty\ndatabase\sworks.\s\sTicket\s[0bf974bdf9].\s\sThe\sonly\schanges\sare\sin\sassert()\nstatements.
|
||||
D 2009-11-06T04:13:18
|
||||
C Improved\sshell\s"dot"\scommand\sargument\shandling.\s\sTicket\s[f12a9eeedc].
|
||||
D 2009-11-06T17:20:17
|
||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||
F Makefile.in a77dfde96ad86aafd3f71651a4333a104debe86a
|
||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||
@@ -164,7 +161,7 @@ F src/random.c 676b9d7ac820fe81e6fb2394ac8c10cff7f38628
|
||||
F src/resolve.c f263d685bf21d0707b595455e0a0c95a3f5398f6
|
||||
F src/rowset.c c64dafba1f9fd876836c8db8682966b9d197eb1f
|
||||
F src/select.c cbe366a0ce114856e66f5daf0f848d7c48a88298
|
||||
F src/shell.c f66531a57fff927f95c98d99c28237d88e400c86
|
||||
F src/shell.c 07e6265ead0dc517c242276949d5a262ca8a87a7
|
||||
F src/sqlite.h.in 4464e9772122f0447305d425e04d122b6f1bffec
|
||||
F src/sqlite3ext.h 1db7d63ab5de4b3e6b83dd03d1a4e64fef6d2a17
|
||||
F src/sqliteInt.h 55d26b83d16107804693982028c8b3a075f5a836
|
||||
@@ -753,7 +750,7 @@ F tool/mksqlite3h.tcl eb100dce83f24b501b325b340f8b5eb8e5106b3b
|
||||
F tool/mksqlite3internalh.tcl 7b43894e21bcb1bb39e11547ce7e38a063357e87
|
||||
F tool/omittest.tcl 27d6f6e3b1e95aeb26a1c140e6eb57771c6d794a
|
||||
F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c
|
||||
F tool/shell1.test 404512b1c3f839e97e42666120346d267b5c5b47
|
||||
F tool/shell1.test 71fa122a37cfd8a4de39e7b53012aae3b1511096
|
||||
F tool/showdb.c 8ab8b3b53884312aafb7ef60982e255a6c31d238
|
||||
F tool/showjournal.c ec3b171be148656827c4949fbfb8ab4370822f87
|
||||
F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe
|
||||
@@ -765,14 +762,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||
P d410cd4e42ecf50a849f49cf3395ec169350e7cf
|
||||
R b6fd4922d8c93defdc16b7c4fc43d34c
|
||||
U drh
|
||||
Z c58c667f47a419949ef32e3c3c6a33b9
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
||||
|
||||
iD8DBQFK86JioxKgR168RlERArjsAJ4iUjlJBvgOkG5Q0ykoZ9HOp9lYXwCfXOv9
|
||||
56uC4JRhdJF56nAXOwquqLE=
|
||||
=qYH+
|
||||
-----END PGP SIGNATURE-----
|
||||
P ddb71cd9ed395804a13dc136bb7688a7627c798f
|
||||
R c0a38f994aec3b7175756a6deebcbc05
|
||||
U shaneh
|
||||
Z 41814e7c3b68e673756d4c35a2fa402a
|
||||
|
||||
@@ -1 +1 @@
|
||||
ddb71cd9ed395804a13dc136bb7688a7627c798f
|
||||
9fb699193378bf812ef97889adc0b1a98ad56d5b
|
||||
83
src/shell.c
83
src/shell.c
@@ -2140,7 +2140,8 @@ static char zHelp[] =
|
||||
" LIKE pattern TABLE.\n"
|
||||
".echo ON|OFF Turn command echo on or off\n"
|
||||
".exit Exit this program\n"
|
||||
".explain ON|OFF Turn output mode suitable for EXPLAIN on or off.\n"
|
||||
".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
|
||||
" With no args, it turns EXPLAIN on.\n"
|
||||
#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_SUBQUERY)
|
||||
".genfkey ?OPTIONS? Options are:\n"
|
||||
" --no-drop: Do not drop old fkey triggers.\n"
|
||||
@@ -2186,7 +2187,7 @@ static char zHelp[] =
|
||||
" If TABLE specified, only list tables matching\n"
|
||||
" LIKE pattern TABLE.\n"
|
||||
".timeout MS Try opening locked tables for MS milliseconds\n"
|
||||
".width NUM NUM ... Set column widths for \"column\" mode\n"
|
||||
".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
|
||||
;
|
||||
|
||||
static char zTimerHelp[] =
|
||||
@@ -2313,7 +2314,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
if( nArg==0 ) return 0; /* no tokens, no error */
|
||||
n = strlen30(azArg[0]);
|
||||
c = azArg[0][0];
|
||||
if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 && nArg>1 ){
|
||||
if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 && nArg>1 && nArg<4){
|
||||
const char *zDestFile;
|
||||
const char *zDb;
|
||||
sqlite3 *pDest;
|
||||
@@ -2349,11 +2350,11 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
sqlite3_close(pDest);
|
||||
}else
|
||||
|
||||
if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 ){
|
||||
if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
|
||||
bail_on_error = booleanValue(azArg[1]);
|
||||
}else
|
||||
|
||||
if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
|
||||
if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
|
||||
struct callback_data data;
|
||||
char *zErrMsg = 0;
|
||||
open_db(p);
|
||||
@@ -2372,7 +2373,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
}
|
||||
}else
|
||||
|
||||
if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
|
||||
if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
|
||||
char *zErrMsg = 0;
|
||||
open_db(p);
|
||||
/* When playing back a "dump", the content might appear in an order
|
||||
@@ -2425,15 +2426,15 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
}
|
||||
}else
|
||||
|
||||
if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 ){
|
||||
if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
|
||||
p->echoOn = booleanValue(azArg[1]);
|
||||
}else
|
||||
|
||||
if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
|
||||
if( c=='e' && strncmp(azArg[0], "exit", n)==0 && nArg==1 ){
|
||||
rc = 2;
|
||||
}else
|
||||
|
||||
if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
|
||||
if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
|
||||
int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
|
||||
if(val == 1) {
|
||||
if(!p->explainPrev.valid) {
|
||||
@@ -2480,7 +2481,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
#endif
|
||||
|
||||
if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
|
||||
strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){
|
||||
strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
|
||||
p->showHeader = booleanValue(azArg[1]);
|
||||
}else
|
||||
|
||||
@@ -2491,7 +2492,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
}
|
||||
}else
|
||||
|
||||
if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg>=3 ){
|
||||
if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
|
||||
char *zTable = azArg[2]; /* Insert data into this table */
|
||||
char *zFile = azArg[1]; /* The file from which to extract data */
|
||||
sqlite3_stmt *pStmt = NULL; /* A statement */
|
||||
@@ -2608,7 +2609,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
sqlite3_exec(p->db, zCommit, 0, 0, 0);
|
||||
}else
|
||||
|
||||
if( c=='i' && strncmp(azArg[0], "indices", n)==0 ){
|
||||
if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
|
||||
struct callback_data data;
|
||||
char *zErrMsg = 0;
|
||||
open_db(p);
|
||||
@@ -2687,35 +2688,31 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
}else
|
||||
#endif
|
||||
|
||||
if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){
|
||||
if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
|
||||
int n2 = strlen30(azArg[1]);
|
||||
if( strncmp(azArg[1],"line",n2)==0
|
||||
if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
|
||||
||
|
||||
strncmp(azArg[1],"lines",n2)==0 ){
|
||||
(n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
|
||||
p->mode = MODE_Line;
|
||||
}else if( strncmp(azArg[1],"column",n2)==0
|
||||
}else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
|
||||
||
|
||||
strncmp(azArg[1],"columns",n2)==0 ){
|
||||
(n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
|
||||
p->mode = MODE_Column;
|
||||
}else if( strncmp(azArg[1],"list",n2)==0 ){
|
||||
}else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
|
||||
p->mode = MODE_List;
|
||||
}else if( strncmp(azArg[1],"html",n2)==0 ){
|
||||
}else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
|
||||
p->mode = MODE_Html;
|
||||
}else if( strncmp(azArg[1],"tcl",n2)==0 ){
|
||||
}else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
|
||||
p->mode = MODE_Tcl;
|
||||
}else if( strncmp(azArg[1],"csv",n2)==0 ){
|
||||
}else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
|
||||
p->mode = MODE_Csv;
|
||||
sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
|
||||
}else if( strncmp(azArg[1],"tabs",n2)==0 ){
|
||||
}else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
|
||||
p->mode = MODE_List;
|
||||
sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
|
||||
}else if( strncmp(azArg[1],"insert",n2)==0 ){
|
||||
}else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
|
||||
p->mode = MODE_Insert;
|
||||
if( nArg>=3 ){
|
||||
set_table_name(p, azArg[2]);
|
||||
}else{
|
||||
set_table_name(p, "table");
|
||||
}
|
||||
}else {
|
||||
fprintf(stderr,"Error: mode should be one of: "
|
||||
"column csv html insert line list tabs tcl\n");
|
||||
@@ -2723,6 +2720,18 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
}
|
||||
}else
|
||||
|
||||
if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
|
||||
int n2 = strlen30(azArg[1]);
|
||||
if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
|
||||
p->mode = MODE_Insert;
|
||||
set_table_name(p, azArg[2]);
|
||||
}else {
|
||||
fprintf(stderr, "Error: invalid arguments: "
|
||||
" \"%s\". Enter \".help\" for help\n", azArg[2]);
|
||||
rc = 1;
|
||||
}
|
||||
}else
|
||||
|
||||
if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
|
||||
sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
|
||||
"%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
|
||||
@@ -2756,7 +2765,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
}
|
||||
}else
|
||||
|
||||
if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
|
||||
if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
|
||||
rc = 2;
|
||||
}else
|
||||
|
||||
@@ -2771,7 +2780,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
}
|
||||
}else
|
||||
|
||||
if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 ){
|
||||
if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
|
||||
const char *zSrcFile;
|
||||
const char *zDb;
|
||||
sqlite3 *pSrc;
|
||||
@@ -2818,7 +2827,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
sqlite3_close(pSrc);
|
||||
}else
|
||||
|
||||
if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
|
||||
if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
|
||||
struct callback_data data;
|
||||
char *zErrMsg = 0;
|
||||
open_db(p);
|
||||
@@ -2896,7 +2905,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
"%.*s", (int)sizeof(p->separator)-1, azArg[1]);
|
||||
}else
|
||||
|
||||
if( c=='s' && strncmp(azArg[0], "show", n)==0){
|
||||
if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
|
||||
int i;
|
||||
fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
|
||||
fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
|
||||
@@ -2917,7 +2926,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
fprintf(p->out,"\n");
|
||||
}else
|
||||
|
||||
if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
|
||||
if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
|
||||
char **azResult;
|
||||
int nRow;
|
||||
char *zErrMsg;
|
||||
@@ -2975,12 +2984,16 @@ static int do_meta_command(char *zLine, struct callback_data *p){
|
||||
sqlite3_free_table(azResult);
|
||||
}else
|
||||
|
||||
if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg>=2 ){
|
||||
if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
|
||||
open_db(p);
|
||||
sqlite3_busy_timeout(p->db, atoi(azArg[1]));
|
||||
}else if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 && nArg>1 ){
|
||||
}else
|
||||
|
||||
if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 && nArg==2 ){
|
||||
enableTimer = booleanValue(azArg[1]);
|
||||
}else if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
|
||||
}else
|
||||
|
||||
if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
|
||||
int j;
|
||||
assert( nArg<=ArraySize(azArg) );
|
||||
for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
|
||||
|
||||
365
tool/shell1.test
365
tool/shell1.test
@@ -16,7 +16,8 @@
|
||||
|
||||
# Test plan:
|
||||
#
|
||||
# shell-1.*: Basic test that command can be called.
|
||||
# shell-1.*: Basic "dot" command token parsing.
|
||||
# shell-2.*: Basic test that "dot" command can be called.
|
||||
#
|
||||
|
||||
package require sqlite3
|
||||
@@ -30,6 +31,7 @@ proc do_test {name cmd expected} {
|
||||
puts Error
|
||||
puts " Got: $res"
|
||||
puts " Expected: $expected"
|
||||
exit
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,78 +48,186 @@ proc catchcmd {cmd} {
|
||||
set out [open cmds.txt w]
|
||||
puts $out $cmd
|
||||
close $out
|
||||
set rc [catch { exec ./sqlite3 test.db < cmds.txt } msg]
|
||||
set rc [catch { exec ./sqlite test.db < cmds.txt } msg]
|
||||
list $rc $msg
|
||||
}
|
||||
|
||||
file delete -force test.db test.db.journal
|
||||
sqlite3 db test.db
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Test cases shell-1.* Basic test that command can be called.
|
||||
# Test cases shell-1.* Basic "dot" command token parsing.
|
||||
#
|
||||
|
||||
# check first token handling
|
||||
do_test shell-1.1.1 {
|
||||
catchcmd ".foo"
|
||||
} {1 {Error: unknown command or invalid arguments: "foo". Enter ".help" for help}}
|
||||
do_test shell-1.1.2 {
|
||||
catchcmd ".\"foo OFF\""
|
||||
} {1 {Error: unknown command or invalid arguments: "foo OFF". Enter ".help" for help}}
|
||||
do_test shell-1.1.3 {
|
||||
catchcmd ".\'foo OFF\'"
|
||||
} {1 {Error: unknown command or invalid arguments: "foo OFF". Enter ".help" for help}}
|
||||
|
||||
# unbalanced quotes
|
||||
do_test shell-1.2.1 {
|
||||
catchcmd ".\"foo OFF"
|
||||
} {1 {Error: unknown command or invalid arguments: "foo OFF". Enter ".help" for help}}
|
||||
do_test shell-1.2.2 {
|
||||
catchcmd ".\'foo OFF"
|
||||
} {1 {Error: unknown command or invalid arguments: "foo OFF". Enter ".help" for help}}
|
||||
do_test shell-1.2.3 {
|
||||
catchcmd ".explain \"OFF"
|
||||
} {0 {}}
|
||||
do_test shell-1.2.4 {
|
||||
catchcmd ".explain \'OFF"
|
||||
} {0 {}}
|
||||
do_test shell-1.2.5 {
|
||||
catchcmd ".mode \"insert FOO"
|
||||
} {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
|
||||
do_test shell-1.2.6 {
|
||||
catchcmd ".mode \'insert FOO"
|
||||
} {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
|
||||
|
||||
# check multiple tokens, and quoted tokens
|
||||
do_test shell-1.3.1 {
|
||||
catchcmd ".explain 1"
|
||||
} {0 {}}
|
||||
do_test shell-1.3.2 {
|
||||
catchcmd ".explain on"
|
||||
} {0 {}}
|
||||
do_test shell-1.3.3 {
|
||||
catchcmd ".explain \"1 2 3\""
|
||||
} {0 {}}
|
||||
do_test shell-1.3.4 {
|
||||
catchcmd ".explain \"OFF\""
|
||||
} {0 {}}
|
||||
do_test shell-1.3.5 {
|
||||
catchcmd ".\'explain\' \'OFF\'"
|
||||
} {0 {}}
|
||||
do_test shell-1.3.6 {
|
||||
catchcmd ".explain \'OFF\'"
|
||||
} {0 {}}
|
||||
do_test shell-1.3.7 {
|
||||
catchcmd ".\'explain\' \'OFF\'"
|
||||
} {0 {}}
|
||||
|
||||
# check quoted args are unquoted
|
||||
do_test shell-1.4.1 {
|
||||
catchcmd ".mode FOO"
|
||||
} {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
|
||||
do_test shell-1.4.2 {
|
||||
catchcmd ".mode csv"
|
||||
} {0 {}}
|
||||
do_test shell-1.4.2 {
|
||||
catchcmd ".mode \"csv\""
|
||||
} {0 {}}
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Test cases shell-2.* Basic test that "dot" command can be called.
|
||||
#
|
||||
|
||||
# .backup ?DB? FILE Backup DB (default "main") to FILE
|
||||
do_test shell-1.1.1 {
|
||||
do_test shell-2.1.1 {
|
||||
catchcmd ".backup"
|
||||
} {1 {Error: unknown command or invalid arguments: "backup". Enter ".help" for help}}
|
||||
do_test shell-2.1.2 {
|
||||
# catchcmd ".backup FOO"
|
||||
#TBD!!! this asserts currently
|
||||
} {}
|
||||
do_test shell-2.1.3 {
|
||||
catchcmd ".backup FOO BAR"
|
||||
} {1 {Error: unknown database FOO}}
|
||||
do_test shell-2.1.4 {
|
||||
# too many arguments
|
||||
catchcmd ".backup FOO BAR BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "backup". Enter ".help" for help}}
|
||||
|
||||
# .bail ON|OFF Stop after hitting an error. Default OFF
|
||||
do_test shell-1.2.1 {
|
||||
do_test shell-2.2.1 {
|
||||
catchcmd ".bail"
|
||||
} {1 {Error: unknown command or invalid arguments: "bail". Enter ".help" for help}}
|
||||
do_test shell-1.2.2 {
|
||||
do_test shell-2.2.2 {
|
||||
catchcmd ".bail ON"
|
||||
} {0 {}}
|
||||
do_test shell-1.2.3 {
|
||||
do_test shell-2.2.3 {
|
||||
catchcmd ".bail OFF"
|
||||
} {0 {}}
|
||||
do_test shell-2.2.4 {
|
||||
# too many arguments
|
||||
catchcmd ".bail OFF BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "bail". Enter ".help" for help}}
|
||||
|
||||
# .databases List names and files of attached databases
|
||||
do_test shell-1.3.1 {
|
||||
do_test shell-2.3.1 {
|
||||
set res [catchcmd ".databases"]
|
||||
regexp {0.*main.*test\.db} $res
|
||||
} {1}
|
||||
do_test shell-2.3.2 {
|
||||
# too many arguments
|
||||
catchcmd ".databases BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "databases". Enter ".help" for help}}
|
||||
|
||||
# .dump ?TABLE? ... Dump the database in an SQL text format
|
||||
# If TABLE specified, only dump tables matching
|
||||
# LIKE pattern TABLE.
|
||||
do_test shell-1.4.1 {
|
||||
do_test shell-2.4.1 {
|
||||
set res [catchcmd ".dump"]
|
||||
list [regexp {BEGIN TRANSACTION;} $res] \
|
||||
[regexp {COMMIT;} $res]
|
||||
} {1 1}
|
||||
do_test shell-1.4.2 {
|
||||
do_test shell-2.4.2 {
|
||||
set res [catchcmd ".dump FOO"]
|
||||
list [regexp {BEGIN TRANSACTION;} $res] \
|
||||
[regexp {COMMIT;} $res]
|
||||
} {1 1}
|
||||
do_test shell-2.4.3 {
|
||||
# too many arguments
|
||||
catchcmd ".dump FOO BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "dump". Enter ".help" for help}}
|
||||
|
||||
# .echo ON|OFF Turn command echo on or off
|
||||
do_test shell-1.5.1 {
|
||||
do_test shell-2.5.1 {
|
||||
catchcmd ".echo"
|
||||
} {1 {Error: unknown command or invalid arguments: "echo". Enter ".help" for help}}
|
||||
do_test shell-1.5.2 {
|
||||
do_test shell-2.5.2 {
|
||||
catchcmd ".echo ON"
|
||||
} {0 {}}
|
||||
do_test shell-1.5.3 {
|
||||
do_test shell-2.5.3 {
|
||||
catchcmd ".echo OFF"
|
||||
} {0 {}}
|
||||
do_test shell-2.5.4 {
|
||||
# too many arguments
|
||||
catchcmd ".echo OFF BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "echo". Enter ".help" for help}}
|
||||
|
||||
# .exit Exit this program
|
||||
do_test shell-1.6.1 {
|
||||
do_test shell-2.6.1 {
|
||||
catchcmd ".exit"
|
||||
} {0 {}}
|
||||
do_test shell-2.6.2 {
|
||||
# too many arguments
|
||||
catchcmd ".exit BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "exit". Enter ".help" for help}}
|
||||
|
||||
# .explain ON|OFF Turn output mode suitable for EXPLAIN on or off.
|
||||
do_test shell-1.7.1 {
|
||||
catchcmd ".echo"
|
||||
} {1 {Error: unknown command or invalid arguments: "echo". Enter ".help" for help}}
|
||||
do_test shell-1.7.2 {
|
||||
do_test shell-2.7.1 {
|
||||
catchcmd ".explain"
|
||||
# explain is the exception to the booleans. without an option, it turns it on.
|
||||
} {0 {}}
|
||||
do_test shell-2.7.2 {
|
||||
catchcmd ".explain ON"
|
||||
} {0 {}}
|
||||
do_test shell-1.7.3 {
|
||||
do_test shell-2.7.3 {
|
||||
catchcmd ".explain OFF"
|
||||
} {0 {}}
|
||||
do_test shell-2.7.4 {
|
||||
# too many arguments
|
||||
catchcmd ".explain OFF BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "explain". Enter ".help" for help}}
|
||||
|
||||
# .genfkey ?OPTIONS? Options are:
|
||||
# --no-drop: Do not drop old fkey triggers.
|
||||
@@ -125,58 +235,87 @@ do_test shell-1.7.3 {
|
||||
# --exec: Execute generated SQL immediately
|
||||
# See file tool/genfkey.README in the source
|
||||
# distribution for further information.
|
||||
do_test shell-1.8.1 {
|
||||
} {}
|
||||
do_test shell-2.8.1 {
|
||||
catchcmd ".genfkey"
|
||||
} {0 {}}
|
||||
do_test shell-2.8.2 {
|
||||
catchcmd ".genfkey FOO"
|
||||
} {1 {unknown option: FOO}}
|
||||
|
||||
# .header(s) ON|OFF Turn display of headers on or off
|
||||
do_test shell-1.9.1 {
|
||||
do_test shell-2.9.1 {
|
||||
catchcmd ".header"
|
||||
} {1 {Error: unknown command or invalid arguments: "header". Enter ".help" for help}}
|
||||
do_test shell-1.9.2 {
|
||||
do_test shell-2.9.2 {
|
||||
catchcmd ".header ON"
|
||||
} {0 {}}
|
||||
do_test shell-1.9.3 {
|
||||
do_test shell-2.9.3 {
|
||||
catchcmd ".header OFF"
|
||||
} {0 {}}
|
||||
do_test shell-1.9.4 {
|
||||
do_test shell-2.9.4 {
|
||||
# too many arguments
|
||||
catchcmd ".header OFF BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "header". Enter ".help" for help}}
|
||||
|
||||
do_test shell-2.9.5 {
|
||||
catchcmd ".headers"
|
||||
} {1 {Error: unknown command or invalid arguments: "headers". Enter ".help" for help}}
|
||||
do_test shell-1.9.5 {
|
||||
do_test shell-2.9.6 {
|
||||
catchcmd ".headers ON"
|
||||
} {0 {}}
|
||||
do_test shell-1.9.6 {
|
||||
do_test shell-2.9.7 {
|
||||
catchcmd ".headers OFF"
|
||||
} {0 {}}
|
||||
do_test shell-2.9.8 {
|
||||
# too many arguments
|
||||
catchcmd ".headers OFF BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "headers". Enter ".help" for help}}
|
||||
|
||||
# .help Show this message
|
||||
do_test shell-1.10.1 {
|
||||
do_test shell-2.10.1 {
|
||||
set res [catchcmd ".help"]
|
||||
# look for a few of the possible help commands
|
||||
list [regexp {.help} $res] \
|
||||
[regexp {.quit} $res] \
|
||||
[regexp {.show} $res]
|
||||
} {1 1 1}
|
||||
do_test shell-2.10.2 {
|
||||
# we allow .help to take extra args (it is help after all)
|
||||
set res [catchcmd ".help BAD"]
|
||||
# look for a few of the possible help commands
|
||||
list [regexp {.help} $res] \
|
||||
[regexp {.quit} $res] \
|
||||
[regexp {.show} $res]
|
||||
} {1 1 1}
|
||||
|
||||
# .import FILE TABLE Import data from FILE into TABLE
|
||||
do_test shell-1.11.1 {
|
||||
do_test shell-2.11.1 {
|
||||
catchcmd ".import"
|
||||
} {1 {Error: unknown command or invalid arguments: "import". Enter ".help" for help}}
|
||||
do_test shell-1.11.2 {
|
||||
do_test shell-2.11.2 {
|
||||
catchcmd ".import FOO"
|
||||
} {1 {Error: unknown command or invalid arguments: "import". Enter ".help" for help}}
|
||||
do_test shell-1.11.2 {
|
||||
do_test shell-2.11.2 {
|
||||
catchcmd ".import FOO BAR"
|
||||
} {1 {Error: no such table: BAR}}
|
||||
do_test shell-2.11.3 {
|
||||
# too many arguments
|
||||
catchcmd ".import FOO BAR BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "import". Enter ".help" for help}}
|
||||
|
||||
# .indices ?TABLE? Show names of all indices
|
||||
# If TABLE specified, only show indices for tables
|
||||
# matching LIKE pattern TABLE.
|
||||
do_test shell-1.12.1 {
|
||||
do_test shell-2.12.1 {
|
||||
catchcmd ".indices"
|
||||
} {0 {}}
|
||||
do_test shell-1.12.2 {
|
||||
do_test shell-2.12.2 {
|
||||
catchcmd ".indices FOO"
|
||||
} {0 {}}
|
||||
do_test shell-2.12.3 {
|
||||
# too many arguments
|
||||
catchcmd ".indices FOO BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "indices". Enter ".help" for help}}
|
||||
|
||||
# .mode MODE ?TABLE? Set output mode where MODE is one of:
|
||||
# csv Comma-separated values
|
||||
@@ -187,112 +326,166 @@ do_test shell-1.12.2 {
|
||||
# list Values delimited by .separator string
|
||||
# tabs Tab-separated values
|
||||
# tcl TCL list elements
|
||||
do_test shell-1.13.1 {
|
||||
do_test shell-2.13.1 {
|
||||
catchcmd ".mode"
|
||||
} {1 {Error: unknown command or invalid arguments: "mode". Enter ".help" for help}}
|
||||
do_test shell-1.13.2 {
|
||||
do_test shell-2.13.2 {
|
||||
catchcmd ".mode FOO"
|
||||
} {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
|
||||
do_test shell-1.13.3 {
|
||||
do_test shell-2.13.3 {
|
||||
catchcmd ".mode csv"
|
||||
} {0 {}}
|
||||
do_test shell-1.13.4 {
|
||||
do_test shell-2.13.4 {
|
||||
catchcmd ".mode column"
|
||||
} {0 {}}
|
||||
do_test shell-1.13.5 {
|
||||
do_test shell-2.13.5 {
|
||||
catchcmd ".mode html"
|
||||
} {0 {}}
|
||||
do_test shell-1.13.6 {
|
||||
do_test shell-2.13.6 {
|
||||
catchcmd ".mode insert"
|
||||
} {0 {}}
|
||||
do_test shell-1.13.7 {
|
||||
do_test shell-2.13.7 {
|
||||
catchcmd ".mode line"
|
||||
} {0 {}}
|
||||
do_test shell-1.13.8 {
|
||||
do_test shell-2.13.8 {
|
||||
catchcmd ".mode list"
|
||||
} {0 {}}
|
||||
do_test shell-1.13.9 {
|
||||
do_test shell-2.13.9 {
|
||||
catchcmd ".mode tabs"
|
||||
} {0 {}}
|
||||
do_test shell-1.13.10 {
|
||||
do_test shell-2.13.10 {
|
||||
catchcmd ".mode tcl"
|
||||
} {0 {}}
|
||||
do_test shell-2.13.11 {
|
||||
# too many arguments
|
||||
catchcmd ".mode tcl BAD"
|
||||
} {1 {Error: invalid arguments: "BAD". Enter ".help" for help}}
|
||||
|
||||
# don't allow partial mode type matches
|
||||
do_test shell-2.13.12 {
|
||||
catchcmd ".mode l"
|
||||
} {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
|
||||
do_test shell-2.13.13 {
|
||||
catchcmd ".mode li"
|
||||
} {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
|
||||
do_test shell-2.13.14 {
|
||||
catchcmd ".mode lin"
|
||||
} {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
|
||||
|
||||
# .nullvalue STRING Print STRING in place of NULL values
|
||||
do_test shell-1.14.1 {
|
||||
do_test shell-2.14.1 {
|
||||
catchcmd ".nullvalue"
|
||||
} {1 {Error: unknown command or invalid arguments: "nullvalue". Enter ".help" for help}}
|
||||
do_test shell-1.14.2 {
|
||||
do_test shell-2.14.2 {
|
||||
catchcmd ".nullvalue FOO"
|
||||
} {0 {}}
|
||||
do_test shell-2.14.3 {
|
||||
# too many arguments
|
||||
catchcmd ".nullvalue FOO BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "nullvalue". Enter ".help" for help}}
|
||||
|
||||
# .output FILENAME Send output to FILENAME
|
||||
do_test shell-1.15.1 {
|
||||
do_test shell-2.15.1 {
|
||||
catchcmd ".output"
|
||||
} {1 {Error: unknown command or invalid arguments: "output". Enter ".help" for help}}
|
||||
do_test shell-1.15.2 {
|
||||
do_test shell-2.15.2 {
|
||||
catchcmd ".output FOO"
|
||||
} {0 {}}
|
||||
do_test shell-2.15.3 {
|
||||
# too many arguments
|
||||
catchcmd ".output FOO BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "output". Enter ".help" for help}}
|
||||
|
||||
# .output stdout Send output to the screen
|
||||
do_test shell-1.16.1 {
|
||||
do_test shell-2.16.1 {
|
||||
catchcmd ".output stdout"
|
||||
} {0 {}}
|
||||
do_test shell-2.16.2 {
|
||||
# too many arguments
|
||||
catchcmd ".output stdout BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "output". Enter ".help" for help}}
|
||||
|
||||
# .prompt MAIN CONTINUE Replace the standard prompts
|
||||
do_test shell-1.17.1 {
|
||||
do_test shell-2.17.1 {
|
||||
catchcmd ".prompt"
|
||||
} {1 {Error: unknown command or invalid arguments: "prompt". Enter ".help" for help}}
|
||||
do_test shell-1.17.2 {
|
||||
do_test shell-2.17.2 {
|
||||
catchcmd ".prompt FOO"
|
||||
} {0 {}}
|
||||
do_test shell-1.17.3 {
|
||||
do_test shell-2.17.3 {
|
||||
catchcmd ".prompt FOO BAR"
|
||||
} {0 {}}
|
||||
do_test shell-2.17.4 {
|
||||
# too many arguments
|
||||
catchcmd ".prompt FOO BAR BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "prompt". Enter ".help" for help}}
|
||||
|
||||
# .quit Exit this program
|
||||
do_test shell-1.18.1 {
|
||||
do_test shell-2.18.1 {
|
||||
catchcmd ".quit"
|
||||
} {0 {}}
|
||||
do_test shell-2.18.2 {
|
||||
# too many arguments
|
||||
catchcmd ".quit BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "quit". Enter ".help" for help}}
|
||||
|
||||
# .read FILENAME Execute SQL in FILENAME
|
||||
do_test shell-1.19.1 {
|
||||
do_test shell-2.19.1 {
|
||||
catchcmd ".read"
|
||||
} {1 {Error: unknown command or invalid arguments: "read". Enter ".help" for help}}
|
||||
do_test shell-1.19.2 {
|
||||
do_test shell-2.19.2 {
|
||||
file delete -force FOO
|
||||
catchcmd ".read FOO"
|
||||
} {1 {Error: cannot open "FOO"}}
|
||||
do_test shell-2.19.3 {
|
||||
# too many arguments
|
||||
catchcmd ".read FOO BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "read". Enter ".help" for help}}
|
||||
|
||||
# .restore ?DB? FILE Restore content of DB (default "main") from FILE
|
||||
do_test shell-1.20.1 {
|
||||
do_test shell-2.20.1 {
|
||||
catchcmd ".restore"
|
||||
} {1 {Error: unknown command or invalid arguments: "restore". Enter ".help" for help}}
|
||||
do_test shell-1.20.2 {
|
||||
do_test shell-2.20.2 {
|
||||
# catchcmd ".restore FOO"
|
||||
#TBD!!! this asserts currently
|
||||
} {}
|
||||
do_test shell-2.20.3 {
|
||||
catchcmd ".restore FOO BAR"
|
||||
} {1 {Error: unknown database FOO}}
|
||||
do_test shell-2.20.4 {
|
||||
# too many arguments
|
||||
catchcmd ".restore FOO BAR BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "restore". Enter ".help" for help}}
|
||||
|
||||
# .schema ?TABLE? Show the CREATE statements
|
||||
# If TABLE specified, only show tables matching
|
||||
# LIKE pattern TABLE.
|
||||
do_test shell-1.21.1 {
|
||||
do_test shell-2.21.1 {
|
||||
catchcmd ".schema"
|
||||
} {0 {}}
|
||||
do_test shell-1.21.2 {
|
||||
do_test shell-2.21.2 {
|
||||
catchcmd ".schema FOO"
|
||||
} {0 {}}
|
||||
do_test shell-2.21.3 {
|
||||
# too many arguments
|
||||
catchcmd ".schema FOO BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "schema". Enter ".help" for help}}
|
||||
|
||||
# .separator STRING Change separator used by output mode and .import
|
||||
do_test shell-1.22.1 {
|
||||
do_test shell-2.22.1 {
|
||||
catchcmd ".separator"
|
||||
} {1 {Error: unknown command or invalid arguments: "separator". Enter ".help" for help}}
|
||||
do_test shell-1.22.2 {
|
||||
do_test shell-2.22.2 {
|
||||
catchcmd ".separator FOO"
|
||||
} {0 {}}
|
||||
do_test shell-2.22.3 {
|
||||
# too many arguments
|
||||
catchcmd ".separator FOO BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "separator". Enter ".help" for help}}
|
||||
|
||||
# .show Show the current values for various settings
|
||||
do_test shell-1.23.1 {
|
||||
do_test shell-2.23.1 {
|
||||
set res [catchcmd ".show"]
|
||||
list [regexp {echo:} $res] \
|
||||
[regexp {explain:} $res] \
|
||||
@@ -303,55 +496,71 @@ do_test shell-1.23.1 {
|
||||
[regexp {separator:} $res] \
|
||||
[regexp {width:} $res]
|
||||
} {1 1 1 1 1 1 1 1}
|
||||
do_test shell-2.23.2 {
|
||||
# too many arguments
|
||||
catchcmd ".show BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "show". Enter ".help" for help}}
|
||||
|
||||
# .tables ?TABLE? List names of tables
|
||||
# If TABLE specified, only list tables matching
|
||||
# LIKE pattern TABLE.
|
||||
do_test shell-1.24.1 {
|
||||
do_test shell-2.24.1 {
|
||||
catchcmd ".tables"
|
||||
} {0 {}}
|
||||
do_test shell-1.24.2 {
|
||||
do_test shell-2.24.2 {
|
||||
catchcmd ".tables FOO"
|
||||
} {0 {}}
|
||||
do_test shell-2.24.3 {
|
||||
# too many arguments
|
||||
catchcmd ".tables FOO BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "tables". Enter ".help" for help}}
|
||||
|
||||
# .timeout MS Try opening locked tables for MS milliseconds
|
||||
do_test shell-1.25.1 {
|
||||
do_test shell-2.25.1 {
|
||||
catchcmd ".timeout"
|
||||
} {1 {Error: unknown command or invalid arguments: "timeout". Enter ".help" for help}}
|
||||
do_test shell-1.25.2 {
|
||||
do_test shell-2.25.2 {
|
||||
catchcmd ".timeout zzz"
|
||||
#TBD!!! this should probably produce an error
|
||||
# this should be treated the same as a '0' timeout
|
||||
} {0 {}}
|
||||
do_test shell-1.25.2 {
|
||||
do_test shell-2.25.3 {
|
||||
catchcmd ".timeout 1"
|
||||
} {0 {}}
|
||||
do_test shell-2.25.4 {
|
||||
# too many arguments
|
||||
catchcmd ".timeout 1 BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "timeout". Enter ".help" for help}}
|
||||
|
||||
# .width NUM NUM ... Set column widths for "column" mode
|
||||
do_test shell-1.26.1 {
|
||||
do_test shell-2.26.1 {
|
||||
catchcmd ".width"
|
||||
#TBD!!! this should probably produce an error
|
||||
} {0 {}}
|
||||
do_test shell-1.26.2 {
|
||||
} {1 {Error: unknown command or invalid arguments: "width". Enter ".help" for help}}
|
||||
do_test shell-2.26.2 {
|
||||
catchcmd ".width xxx"
|
||||
#TBD!!! this should probably produce an error
|
||||
# this should be treated the same as a '0' width for col 1
|
||||
} {0 {}}
|
||||
do_test shell-1.26.3 {
|
||||
do_test shell-2.26.3 {
|
||||
catchcmd ".width xxx yyy"
|
||||
#TBD!!! this should probably produce an error
|
||||
# this should be treated the same as a '0' width for col 1 and 2
|
||||
} {0 {}}
|
||||
do_test shell-1.26.4 {
|
||||
do_test shell-2.26.4 {
|
||||
catchcmd ".width 1 1"
|
||||
# this should be treated the same as a '1' width for col 1 and 2
|
||||
} {0 {}}
|
||||
|
||||
# .timer ON|OFF Turn the CPU timer measurement on or off
|
||||
do_test shell-1.27.1 {
|
||||
do_test shell-2.27.1 {
|
||||
catchcmd ".timer"
|
||||
} {1 {Error: unknown command or invalid arguments: "timer". Enter ".help" for help}}
|
||||
do_test shell-1.27.2 {
|
||||
do_test shell-2.27.2 {
|
||||
catchcmd ".timer ON"
|
||||
} {0 {}}
|
||||
do_test shell-1.27.3 {
|
||||
do_test shell-2.27.3 {
|
||||
catchcmd ".timer OFF"
|
||||
} {0 {}}
|
||||
do_test shell-2.27.4 {
|
||||
# too many arguments
|
||||
catchcmd ".timer OFF BAD"
|
||||
} {1 {Error: unknown command or invalid arguments: "timer". Enter ".help" for help}}
|
||||
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user