Home | History | Annotate | Download | only in tool
      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: shell1.test,v 1.7 2009/07/17 16:54:48 shaneh Exp $
     15 #
     16 
     17 # Test plan:
     18 #
     19 #   shell1-1.*: Basic command line option handling.
     20 #   shell1-2.*: Basic "dot" command token parsing.
     21 #   shell1-3.*: Basic test that "dot" command can be called.
     22 #
     23 
     24 package require sqlite3
     25 
     26 set CLI "./sqlite3"
     27 
     28 proc do_test {name cmd expected} {
     29   puts -nonewline "$name ..."
     30   set res [uplevel $cmd]
     31   if {$res eq $expected} {
     32     puts Ok
     33   } else {
     34     puts Error
     35     puts "  Got: $res"
     36     puts "  Expected: $expected"
     37     exit
     38   }
     39 }
     40 
     41 proc execsql {sql} {
     42   uplevel [list db eval $sql]
     43 }
     44 
     45 proc catchsql {sql} {
     46   set rc [catch {uplevel [list db eval $sql]} msg]
     47   list $rc $msg
     48 }
     49 
     50 proc catchcmd {db {cmd ""}} {
     51   global CLI
     52   set out [open cmds.txt w]
     53   puts $out $cmd
     54   close $out
     55   set line "exec $CLI $db < cmds.txt"
     56   set rc [catch { eval $line } msg]
     57   list $rc $msg
     58 }
     59 
     60 file delete -force test.db test.db.journal
     61 sqlite3 db test.db
     62 
     63 #----------------------------------------------------------------------------
     64 # Test cases shell1-1.*: Basic command line option handling.
     65 #
     66 
     67 # invalid option
     68 do_test shell1-1.1.1 {
     69   set res [catchcmd "-bad test.db" ""]
     70   set rc [lindex $res 0]
     71   list $rc \
     72        [regexp {Error: unknown option: -bad} $res]
     73 } {1 1}
     74 # error on extra options
     75 do_test shell1-1.1.2 {
     76   set res [catchcmd "-bad test.db \"select 3\" \"select 4\"" ""]
     77   set rc [lindex $res 0]
     78   list $rc \
     79        [regexp {Error: too many options: "select 4"} $res]
     80 } {1 1}
     81 # error on extra options
     82 do_test shell1-1.1.3 {
     83   set res [catchcmd "-bad FOO test.db BAD" ".quit"]
     84   set rc [lindex $res 0]
     85   list $rc \
     86        [regexp {Error: too many options: "BAD"} $res]
     87 } {1 1}
     88 
     89 # -help
     90 do_test shell1-1.2.1 {
     91   set res [catchcmd "-help test.db" ""]
     92   set rc [lindex $res 0]
     93   list $rc \
     94        [regexp {Usage} $res] \
     95        [regexp {\-init} $res] \
     96        [regexp {\-version} $res]
     97 } {1 1 1 1}
     98 
     99 # -init filename       read/process named file
    100 do_test shell1-1.3.1 {
    101   catchcmd "-init FOO test.db" ""
    102 } {0 {}}
    103 do_test shell1-1.3.2 {
    104   set res [catchcmd "-init FOO test.db .quit BAD" ""]
    105   set rc [lindex $res 0]
    106   list $rc \
    107        [regexp {Error: too many options: "BAD"} $res]
    108 } {1 1}
    109 
    110 # -echo                print commands before execution
    111 do_test shell1-1.4.1 {
    112   catchcmd "-echo test.db" "" 
    113 } {0 {}}
    114 
    115 # -[no]header          turn headers on or off
    116 do_test shell1-1.5.1 {
    117   catchcmd "-header test.db" "" 
    118 } {0 {}}
    119 do_test shell1-1.5.2 {
    120   catchcmd "-noheader test.db" "" 
    121 } {0 {}}
    122 
    123 # -bail                stop after hitting an error
    124 do_test shell1-1.6.1 {
    125   catchcmd "-bail test.db" "" 
    126 } {0 {}}
    127 
    128 # -interactive         force interactive I/O
    129 do_test shell1-1.7.1 {
    130   set res [catchcmd "-interactive test.db" ".quit"]
    131   set rc [lindex $res 0]
    132   list $rc \
    133        [regexp {SQLite version} $res] \
    134        [regexp {Enter SQL statements} $res]
    135 } {0 1 1}
    136 
    137 # -batch               force batch I/O
    138 do_test shell1-1.8.1 {
    139   catchcmd "-batch test.db" "" 
    140 } {0 {}}
    141 
    142 # -column              set output mode to 'column'
    143 do_test shell1-1.9.1 {
    144   catchcmd "-column test.db" "" 
    145 } {0 {}}
    146 
    147 # -csv                 set output mode to 'csv'
    148 do_test shell1-1.10.1 {
    149   catchcmd "-csv test.db" "" 
    150 } {0 {}}
    151 
    152 # -html                set output mode to HTML
    153 do_test shell1-1.11.1 {
    154   catchcmd "-html test.db" "" 
    155 } {0 {}}
    156 
    157 # -line                set output mode to 'line'
    158 do_test shell1-1.12.1 {
    159   catchcmd "-line test.db" "" 
    160 } {0 {}}
    161 
    162 # -list                set output mode to 'list'
    163 do_test shell1-1.13.1 {
    164   catchcmd "-list test.db" "" 
    165 } {0 {}}
    166 
    167 # -separator 'x'       set output field separator (|)
    168 do_test shell1-1.14.1 {
    169   catchcmd "-separator 'x' test.db" "" 
    170 } {0 {}}
    171 do_test shell1-1.14.2 {
    172   catchcmd "-separator x test.db" "" 
    173 } {0 {}}
    174 do_test shell1-1.14.3 {
    175   set res [catchcmd "-separator" ""]
    176   set rc [lindex $res 0]
    177   list $rc \
    178        [regexp {Error: missing argument for option: -separator} $res]
    179 } {1 1}
    180 
    181 # -stats               print memory stats before each finalize
    182 do_test shell1-1.14b.1 {
    183   catchcmd "-stats test.db" "" 
    184 } {0 {}}
    185 
    186 # -nullvalue 'text'    set text string for NULL values
    187 do_test shell1-1.15.1 {
    188   catchcmd "-nullvalue 'x' test.db" ""
    189 } {0 {}}
    190 do_test shell1-1.15.2 {
    191   catchcmd "-nullvalue x test.db" ""
    192 } {0 {}}
    193 do_test shell1-1.15.3 {
    194   set res [catchcmd "-nullvalue" ""]
    195   set rc [lindex $res 0]
    196   list $rc \
    197        [regexp {Error: missing argument for option: -nullvalue} $res]
    198 } {1 1}
    199 
    200 # -version             show SQLite version
    201 do_test shell1-1.16.1 {
    202   catchcmd "-version test.db" "" 
    203 } {0 3.7.6.3}
    204 
    205 #----------------------------------------------------------------------------
    206 # Test cases shell1-2.*: Basic "dot" command token parsing.
    207 #
    208 
    209 # check first token handling
    210 do_test shell1-2.1.1 {
    211   catchcmd "test.db" ".foo" 
    212 } {1 {Error: unknown command or invalid arguments:  "foo". Enter ".help" for help}}
    213 do_test shell1-2.1.2 {
    214   catchcmd "test.db" ".\"foo OFF\""
    215 } {1 {Error: unknown command or invalid arguments:  "foo OFF". Enter ".help" for help}}
    216 do_test shell1-2.1.3 {
    217   catchcmd "test.db" ".\'foo OFF\'"
    218 } {1 {Error: unknown command or invalid arguments:  "foo OFF". Enter ".help" for help}}
    219 
    220 # unbalanced quotes
    221 do_test shell1-2.2.1 {
    222   catchcmd "test.db" ".\"foo OFF"
    223 } {1 {Error: unknown command or invalid arguments:  "foo OFF". Enter ".help" for help}}
    224 do_test shell1-2.2.2 {
    225   catchcmd "test.db" ".\'foo OFF"
    226 } {1 {Error: unknown command or invalid arguments:  "foo OFF". Enter ".help" for help}}
    227 do_test shell1-2.2.3 {
    228   catchcmd "test.db" ".explain \"OFF"
    229 } {0 {}}
    230 do_test shell1-2.2.4 {
    231   catchcmd "test.db" ".explain \'OFF"
    232 } {0 {}}
    233 do_test shell1-2.2.5 {
    234   catchcmd "test.db" ".mode \"insert FOO"
    235 } {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
    236 do_test shell1-2.2.6 {
    237   catchcmd "test.db" ".mode \'insert FOO"
    238 } {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
    239 
    240 # check multiple tokens, and quoted tokens
    241 do_test shell1-2.3.1 {
    242   catchcmd "test.db" ".explain 1"
    243 } {0 {}}
    244 do_test shell1-2.3.2 {
    245   catchcmd "test.db" ".explain on"
    246 } {0 {}}
    247 do_test shell1-2.3.3 {
    248   catchcmd "test.db" ".explain \"1 2 3\""
    249 } {0 {}}
    250 do_test shell1-2.3.4 {
    251   catchcmd "test.db" ".explain \"OFF\""
    252 } {0 {}}
    253 do_test shell1-2.3.5 {
    254   catchcmd "test.db" ".\'explain\' \'OFF\'"
    255 } {0 {}}
    256 do_test shell1-2.3.6 {
    257   catchcmd "test.db" ".explain \'OFF\'"
    258 } {0 {}}
    259 do_test shell1-2.3.7 {
    260   catchcmd "test.db" ".\'explain\' \'OFF\'"
    261 } {0 {}}
    262 
    263 # check quoted args are unquoted
    264 do_test shell1-2.4.1 {
    265   catchcmd "test.db" ".mode FOO"
    266 } {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
    267 do_test shell1-2.4.2 {
    268   catchcmd "test.db" ".mode csv"
    269 } {0 {}}
    270 do_test shell1-2.4.2 {
    271   catchcmd "test.db" ".mode \"csv\""
    272 } {0 {}}
    273 
    274 
    275 #----------------------------------------------------------------------------
    276 # Test cases shell1-3.*: Basic test that "dot" command can be called.
    277 #
    278 
    279 # .backup ?DB? FILE      Backup DB (default "main") to FILE
    280 do_test shell1-3.1.1 {
    281   catchcmd "test.db" ".backup"
    282 } {1 {Error: unknown command or invalid arguments:  "backup". Enter ".help" for help}}
    283 do_test shell1-3.1.2 {
    284   catchcmd "test.db" ".backup FOO"
    285 } {0 {}}
    286 do_test shell1-3.1.3 {
    287   catchcmd "test.db" ".backup FOO BAR"
    288 } {1 {Error: unknown database FOO}}
    289 do_test shell1-3.1.4 {
    290   # too many arguments
    291   catchcmd "test.db" ".backup FOO BAR BAD"
    292 } {1 {Error: unknown command or invalid arguments:  "backup". Enter ".help" for help}}
    293 
    294 # .bail ON|OFF           Stop after hitting an error.  Default OFF
    295 do_test shell1-3.2.1 {
    296   catchcmd "test.db" ".bail"
    297 } {1 {Error: unknown command or invalid arguments:  "bail". Enter ".help" for help}}
    298 do_test shell1-3.2.2 {
    299   catchcmd "test.db" ".bail ON"
    300 } {0 {}}
    301 do_test shell1-3.2.3 {
    302   catchcmd "test.db" ".bail OFF"
    303 } {0 {}}
    304 do_test shell1-3.2.4 {
    305   # too many arguments
    306   catchcmd "test.db" ".bail OFF BAD"
    307 } {1 {Error: unknown command or invalid arguments:  "bail". Enter ".help" for help}}
    308 
    309 # .databases             List names and files of attached databases
    310 do_test shell1-3.3.1 {
    311   set res [catchcmd "test.db" ".databases"]
    312   regexp {0.*main.*test\.db} $res
    313 } {1}
    314 do_test shell1-3.3.2 {
    315   # too many arguments
    316   catchcmd "test.db" ".databases BAD"
    317 } {1 {Error: unknown command or invalid arguments:  "databases". Enter ".help" for help}}
    318 
    319 # .dump ?TABLE? ...      Dump the database in an SQL text format
    320 #                          If TABLE specified, only dump tables matching
    321 #                          LIKE pattern TABLE.
    322 do_test shell1-3.4.1 {
    323   set res [catchcmd "test.db" ".dump"]
    324   list [regexp {BEGIN TRANSACTION;} $res] \
    325        [regexp {COMMIT;} $res]
    326 } {1 1}
    327 do_test shell1-3.4.2 {
    328   set res [catchcmd "test.db" ".dump FOO"]
    329   list [regexp {BEGIN TRANSACTION;} $res] \
    330        [regexp {COMMIT;} $res]
    331 } {1 1}
    332 do_test shell1-3.4.3 {
    333   # too many arguments
    334   catchcmd "test.db" ".dump FOO BAD"
    335 } {1 {Error: unknown command or invalid arguments:  "dump". Enter ".help" for help}}
    336 
    337 # .echo ON|OFF           Turn command echo on or off
    338 do_test shell1-3.5.1 {
    339   catchcmd "test.db" ".echo"
    340 } {1 {Error: unknown command or invalid arguments:  "echo". Enter ".help" for help}}
    341 do_test shell1-3.5.2 {
    342   catchcmd "test.db" ".echo ON"
    343 } {0 {}}
    344 do_test shell1-3.5.3 {
    345   catchcmd "test.db" ".echo OFF"
    346 } {0 {}}
    347 do_test shell1-3.5.4 {
    348   # too many arguments
    349   catchcmd "test.db" ".echo OFF BAD"
    350 } {1 {Error: unknown command or invalid arguments:  "echo". Enter ".help" for help}}
    351 
    352 # .exit                  Exit this program
    353 do_test shell1-3.6.1 {
    354   catchcmd "test.db" ".exit"
    355 } {0 {}}
    356 do_test shell1-3.6.2 {
    357   # too many arguments
    358   catchcmd "test.db" ".exit BAD"
    359 } {1 {Error: unknown command or invalid arguments:  "exit". Enter ".help" for help}}
    360 
    361 # .explain ON|OFF        Turn output mode suitable for EXPLAIN on or off.
    362 do_test shell1-3.7.1 {
    363   catchcmd "test.db" ".explain"
    364   # explain is the exception to the booleans.  without an option, it turns it on.
    365 } {0 {}}
    366 do_test shell1-3.7.2 {
    367   catchcmd "test.db" ".explain ON"
    368 } {0 {}}
    369 do_test shell1-3.7.3 {
    370   catchcmd "test.db" ".explain OFF"
    371 } {0 {}}
    372 do_test shell1-3.7.4 {
    373   # too many arguments
    374   catchcmd "test.db" ".explain OFF BAD"
    375 } {1 {Error: unknown command or invalid arguments:  "explain". Enter ".help" for help}}
    376 
    377 
    378 # .header(s) ON|OFF      Turn display of headers on or off
    379 do_test shell1-3.9.1 {
    380   catchcmd "test.db" ".header"
    381 } {1 {Error: unknown command or invalid arguments:  "header". Enter ".help" for help}}
    382 do_test shell1-3.9.2 {
    383   catchcmd "test.db" ".header ON"
    384 } {0 {}}
    385 do_test shell1-3.9.3 {
    386   catchcmd "test.db" ".header OFF"
    387 } {0 {}}
    388 do_test shell1-3.9.4 {
    389   # too many arguments
    390   catchcmd "test.db" ".header OFF BAD"
    391 } {1 {Error: unknown command or invalid arguments:  "header". Enter ".help" for help}}
    392 
    393 do_test shell1-3.9.5 {
    394   catchcmd "test.db" ".headers"
    395 } {1 {Error: unknown command or invalid arguments:  "headers". Enter ".help" for help}}
    396 do_test shell1-3.9.6 {
    397   catchcmd "test.db" ".headers ON"
    398 } {0 {}}
    399 do_test shell1-3.9.7 {
    400   catchcmd "test.db" ".headers OFF"
    401 } {0 {}}
    402 do_test shell1-3.9.8 {
    403   # too many arguments
    404   catchcmd "test.db" ".headers OFF BAD"
    405 } {1 {Error: unknown command or invalid arguments:  "headers". Enter ".help" for help}}
    406 
    407 # .help                  Show this message
    408 do_test shell1-3.10.1 {
    409   set res [catchcmd "test.db" ".help"]
    410   # look for a few of the possible help commands
    411   list [regexp {.help} $res] \
    412        [regexp {.quit} $res] \
    413        [regexp {.show} $res]
    414 } {1 1 1}
    415 do_test shell1-3.10.2 {
    416   # we allow .help to take extra args (it is help after all)
    417   set res [catchcmd "test.db" ".help BAD"]
    418   # look for a few of the possible help commands
    419   list [regexp {.help} $res] \
    420        [regexp {.quit} $res] \
    421        [regexp {.show} $res]
    422 } {1 1 1}
    423 
    424 # .import FILE TABLE     Import data from FILE into TABLE
    425 do_test shell1-3.11.1 {
    426   catchcmd "test.db" ".import"
    427 } {1 {Error: unknown command or invalid arguments:  "import". Enter ".help" for help}}
    428 do_test shell1-3.11.2 {
    429   catchcmd "test.db" ".import FOO"
    430 } {1 {Error: unknown command or invalid arguments:  "import". Enter ".help" for help}}
    431 do_test shell1-3.11.2 {
    432   catchcmd "test.db" ".import FOO BAR"
    433 } {1 {Error: no such table: BAR}}
    434 do_test shell1-3.11.3 {
    435   # too many arguments
    436   catchcmd "test.db" ".import FOO BAR BAD"
    437 } {1 {Error: unknown command or invalid arguments:  "import". Enter ".help" for help}}
    438 
    439 # .indices ?TABLE?       Show names of all indices
    440 #                          If TABLE specified, only show indices for tables
    441 #                          matching LIKE pattern TABLE.
    442 do_test shell1-3.12.1 {
    443   catchcmd "test.db" ".indices"
    444 } {0 {}}
    445 do_test shell1-3.12.2 {
    446   catchcmd "test.db" ".indices FOO"
    447 } {0 {}}
    448 do_test shell1-3.12.3 {
    449   # too many arguments
    450   catchcmd "test.db" ".indices FOO BAD"
    451 } {1 {Error: unknown command or invalid arguments:  "indices". Enter ".help" for help}}
    452 
    453 # .mode MODE ?TABLE?     Set output mode where MODE is one of:
    454 #                          csv      Comma-separated values
    455 #                          column   Left-aligned columns.  (See .width)
    456 #                          html     HTML <table> code
    457 #                          insert   SQL insert statements for TABLE
    458 #                          line     One value per line
    459 #                          list     Values delimited by .separator string
    460 #                          tabs     Tab-separated values
    461 #                          tcl      TCL list elements
    462 do_test shell1-3.13.1 {
    463   catchcmd "test.db" ".mode"
    464 } {1 {Error: unknown command or invalid arguments:  "mode". Enter ".help" for help}}
    465 do_test shell1-3.13.2 {
    466   catchcmd "test.db" ".mode FOO"
    467 } {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
    468 do_test shell1-3.13.3 {
    469   catchcmd "test.db" ".mode csv"
    470 } {0 {}}
    471 do_test shell1-3.13.4 {
    472   catchcmd "test.db" ".mode column"
    473 } {0 {}}
    474 do_test shell1-3.13.5 {
    475   catchcmd "test.db" ".mode html"
    476 } {0 {}}
    477 do_test shell1-3.13.6 {
    478   catchcmd "test.db" ".mode insert"
    479 } {0 {}}
    480 do_test shell1-3.13.7 {
    481   catchcmd "test.db" ".mode line"
    482 } {0 {}}
    483 do_test shell1-3.13.8 {
    484   catchcmd "test.db" ".mode list"
    485 } {0 {}}
    486 do_test shell1-3.13.9 {
    487   catchcmd "test.db" ".mode tabs"
    488 } {0 {}}
    489 do_test shell1-3.13.10 {
    490   catchcmd "test.db" ".mode tcl"
    491 } {0 {}}
    492 do_test shell1-3.13.11 {
    493   # too many arguments
    494   catchcmd "test.db" ".mode tcl BAD"
    495 } {1 {Error: invalid arguments:  "BAD". Enter ".help" for help}}
    496 
    497 # don't allow partial mode type matches
    498 do_test shell1-3.13.12 {
    499   catchcmd "test.db" ".mode l"
    500 } {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
    501 do_test shell1-3.13.13 {
    502   catchcmd "test.db" ".mode li"
    503 } {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
    504 do_test shell1-3.13.14 {
    505   catchcmd "test.db" ".mode lin"
    506 } {1 {Error: mode should be one of: column csv html insert line list tabs tcl}}
    507 
    508 # .nullvalue STRING      Print STRING in place of NULL values
    509 do_test shell1-3.14.1 {
    510   catchcmd "test.db" ".nullvalue"
    511 } {1 {Error: unknown command or invalid arguments:  "nullvalue". Enter ".help" for help}}
    512 do_test shell1-3.14.2 {
    513   catchcmd "test.db" ".nullvalue FOO"
    514 } {0 {}}
    515 do_test shell1-3.14.3 {
    516   # too many arguments
    517   catchcmd "test.db" ".nullvalue FOO BAD"
    518 } {1 {Error: unknown command or invalid arguments:  "nullvalue". Enter ".help" for help}}
    519 
    520 # .output FILENAME       Send output to FILENAME
    521 do_test shell1-3.15.1 {
    522   catchcmd "test.db" ".output"
    523 } {1 {Error: unknown command or invalid arguments:  "output". Enter ".help" for help}}
    524 do_test shell1-3.15.2 {
    525   catchcmd "test.db" ".output FOO"
    526 } {0 {}}
    527 do_test shell1-3.15.3 {
    528   # too many arguments
    529   catchcmd "test.db" ".output FOO BAD"
    530 } {1 {Error: unknown command or invalid arguments:  "output". Enter ".help" for help}}
    531 
    532 # .output stdout         Send output to the screen
    533 do_test shell1-3.16.1 {
    534   catchcmd "test.db" ".output stdout"
    535 } {0 {}}
    536 do_test shell1-3.16.2 {
    537   # too many arguments
    538   catchcmd "test.db" ".output stdout BAD"
    539 } {1 {Error: unknown command or invalid arguments:  "output". Enter ".help" for help}}
    540 
    541 # .prompt MAIN CONTINUE  Replace the standard prompts
    542 do_test shell1-3.17.1 {
    543   catchcmd "test.db" ".prompt"
    544 } {1 {Error: unknown command or invalid arguments:  "prompt". Enter ".help" for help}}
    545 do_test shell1-3.17.2 {
    546   catchcmd "test.db" ".prompt FOO"
    547 } {0 {}}
    548 do_test shell1-3.17.3 {
    549   catchcmd "test.db" ".prompt FOO BAR"
    550 } {0 {}}
    551 do_test shell1-3.17.4 {
    552   # too many arguments
    553   catchcmd "test.db" ".prompt FOO BAR BAD"
    554 } {1 {Error: unknown command or invalid arguments:  "prompt". Enter ".help" for help}}
    555 
    556 # .quit                  Exit this program
    557 do_test shell1-3.18.1 {
    558   catchcmd "test.db" ".quit"
    559 } {0 {}}
    560 do_test shell1-3.18.2 {
    561   # too many arguments
    562   catchcmd "test.db" ".quit BAD"
    563 } {1 {Error: unknown command or invalid arguments:  "quit". Enter ".help" for help}}
    564 
    565 # .read FILENAME         Execute SQL in FILENAME
    566 do_test shell1-3.19.1 {
    567   catchcmd "test.db" ".read"
    568 } {1 {Error: unknown command or invalid arguments:  "read". Enter ".help" for help}}
    569 do_test shell1-3.19.2 {
    570   file delete -force FOO
    571   catchcmd "test.db" ".read FOO"
    572 } {1 {Error: cannot open "FOO"}}
    573 do_test shell1-3.19.3 {
    574   # too many arguments
    575   catchcmd "test.db" ".read FOO BAD"
    576 } {1 {Error: unknown command or invalid arguments:  "read". Enter ".help" for help}}
    577 
    578 # .restore ?DB? FILE     Restore content of DB (default "main") from FILE
    579 do_test shell1-3.20.1 {
    580   catchcmd "test.db" ".restore"
    581 } {1 {Error: unknown command or invalid arguments:  "restore". Enter ".help" for help}}
    582 do_test shell1-3.20.2 {
    583   catchcmd "test.db" ".restore FOO"
    584 } {0 {}}
    585 do_test shell1-3.20.3 {
    586   catchcmd "test.db" ".restore FOO BAR"
    587 } {1 {Error: unknown database FOO}}
    588 do_test shell1-3.20.4 {
    589   # too many arguments
    590   catchcmd "test.db" ".restore FOO BAR BAD"
    591 } {1 {Error: unknown command or invalid arguments:  "restore". Enter ".help" for help}}
    592 
    593 # .schema ?TABLE?        Show the CREATE statements
    594 #                          If TABLE specified, only show tables matching
    595 #                          LIKE pattern TABLE.
    596 do_test shell1-3.21.1 {
    597   catchcmd "test.db" ".schema"
    598 } {0 {}}
    599 do_test shell1-3.21.2 {
    600   catchcmd "test.db" ".schema FOO"
    601 } {0 {}}
    602 do_test shell1-3.21.3 {
    603   # too many arguments
    604   catchcmd "test.db" ".schema FOO BAD"
    605 } {1 {Error: unknown command or invalid arguments:  "schema". Enter ".help" for help}}
    606 
    607 # .separator STRING      Change separator used by output mode and .import
    608 do_test shell1-3.22.1 {
    609   catchcmd "test.db" ".separator"
    610 } {1 {Error: unknown command or invalid arguments:  "separator". Enter ".help" for help}}
    611 do_test shell1-3.22.2 {
    612   catchcmd "test.db" ".separator FOO"
    613 } {0 {}}
    614 do_test shell1-3.22.3 {
    615   # too many arguments
    616   catchcmd "test.db" ".separator FOO BAD"
    617 } {1 {Error: unknown command or invalid arguments:  "separator". Enter ".help" for help}}
    618 
    619 # .show                  Show the current values for various settings
    620 do_test shell1-3.23.1 {
    621   set res [catchcmd "test.db" ".show"]
    622   list [regexp {echo:} $res] \
    623        [regexp {explain:} $res] \
    624        [regexp {headers:} $res] \
    625        [regexp {mode:} $res] \
    626        [regexp {nullvalue:} $res] \
    627        [regexp {output:} $res] \
    628        [regexp {separator:} $res] \
    629        [regexp {stats:} $res] \
    630        [regexp {width:} $res]
    631 } {1 1 1 1 1 1 1 1 1}
    632 do_test shell1-3.23.2 {
    633   # too many arguments
    634   catchcmd "test.db" ".show BAD"
    635 } {1 {Error: unknown command or invalid arguments:  "show". Enter ".help" for help}}
    636 
    637 # .stats ON|OFF          Turn stats on or off
    638 do_test shell1-3.23b.1 {
    639   catchcmd "test.db" ".stats"
    640 } {1 {Error: unknown command or invalid arguments:  "stats". Enter ".help" for help}}
    641 do_test shell1-3.23b.2 {
    642   catchcmd "test.db" ".stats ON"
    643 } {0 {}}
    644 do_test shell1-3.23b.3 {
    645   catchcmd "test.db" ".stats OFF"
    646 } {0 {}}
    647 do_test shell1-3.23b.4 {
    648   # too many arguments
    649   catchcmd "test.db" ".stats OFF BAD"
    650 } {1 {Error: unknown command or invalid arguments:  "stats". Enter ".help" for help}}
    651 
    652 # .tables ?TABLE?        List names of tables
    653 #                          If TABLE specified, only list tables matching
    654 #                          LIKE pattern TABLE.
    655 do_test shell1-3.24.1 {
    656   catchcmd "test.db" ".tables"
    657 } {0 {}}
    658 do_test shell1-3.24.2 {
    659   catchcmd "test.db" ".tables FOO"
    660 } {0 {}}
    661 do_test shell1-3.24.3 {
    662   # too many arguments
    663   catchcmd "test.db" ".tables FOO BAD"
    664 } {1 {Error: unknown command or invalid arguments:  "tables". Enter ".help" for help}}
    665 
    666 # .timeout MS            Try opening locked tables for MS milliseconds
    667 do_test shell1-3.25.1 {
    668   catchcmd "test.db" ".timeout"
    669 } {1 {Error: unknown command or invalid arguments:  "timeout". Enter ".help" for help}}
    670 do_test shell1-3.25.2 {
    671   catchcmd "test.db" ".timeout zzz"
    672   # this should be treated the same as a '0' timeout
    673 } {0 {}}
    674 do_test shell1-3.25.3 {
    675   catchcmd "test.db" ".timeout 1"
    676 } {0 {}}
    677 do_test shell1-3.25.4 {
    678   # too many arguments
    679   catchcmd "test.db" ".timeout 1 BAD"
    680 } {1 {Error: unknown command or invalid arguments:  "timeout". Enter ".help" for help}}
    681 
    682 # .width NUM NUM ...     Set column widths for "column" mode
    683 do_test shell1-3.26.1 {
    684   catchcmd "test.db" ".width"
    685 } {1 {Error: unknown command or invalid arguments:  "width". Enter ".help" for help}}
    686 do_test shell1-3.26.2 {
    687   catchcmd "test.db" ".width xxx"
    688   # this should be treated the same as a '0' width for col 1
    689 } {0 {}}
    690 do_test shell1-3.26.3 {
    691   catchcmd "test.db" ".width xxx yyy"
    692   # this should be treated the same as a '0' width for col 1 and 2
    693 } {0 {}}
    694 do_test shell1-3.26.4 {
    695   catchcmd "test.db" ".width 1 1"
    696   # this should be treated the same as a '1' width for col 1 and 2
    697 } {0 {}}
    698 
    699 # .timer ON|OFF          Turn the CPU timer measurement on or off
    700 do_test shell1-3.27.1 {
    701   catchcmd "test.db" ".timer"
    702 } {1 {Error: unknown command or invalid arguments:  "timer". Enter ".help" for help}}
    703 do_test shell1-3.27.2 {
    704   catchcmd "test.db" ".timer ON"
    705 } {0 {}}
    706 do_test shell1-3.27.3 {
    707   catchcmd "test.db" ".timer OFF"
    708 } {0 {}}
    709 do_test shell1-3.27.4 {
    710   # too many arguments
    711   catchcmd "test.db" ".timer OFF BAD"
    712 } {1 {Error: unknown command or invalid arguments:  "timer". Enter ".help" for help}}
    713 
    714 puts "CLI tests completed successfully"
    715