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