/ Hex Artifact Content
Login

Artifact c04e9f9f948305706b88377c464c7f08ce7479f9:


0000: 23 20 32 30 31 30 20 41 75 67 75 73 74 20 34 0a  # 2010 August 4.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 68 65 20 66 6f  *****.#.# The fo
0170: 63 75 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65  cus of this file
0180: 20 69 73 20 74 65 73 74 69 6e 67 20 74 68 65 20   is testing the 
0190: 43 4c 49 20 73 68 65 6c 6c 20 74 6f 6f 6c 2e 0a  CLI shell tool..
01a0: 23 20 54 68 65 73 65 20 74 65 73 74 73 20 61 72  # These tests ar
01b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
01c0: 65 20 2e 69 6d 70 6f 72 74 20 63 6f 6d 6d 61 6e  e .import comman
01d0: 64 2e 0a 23 0a 23 20 24 49 64 3a 20 73 68 65 6c  d..#.# $Id: shel
01e0: 6c 35 2e 74 65 73 74 2c 76 20 31 2e 37 20 32 30  l5.test,v 1.7 20
01f0: 30 39 2f 30 37 2f 31 37 20 31 36 3a 35 34 3a 34  09/07/17 16:54:4
0200: 38 20 73 68 61 6e 65 68 20 45 78 70 20 24 0a 23  8 shaneh Exp $.#
0210: 0a 0a 23 20 54 65 73 74 20 70 6c 61 6e 3a 0a 23  ..# Test plan:.#
0220: 0a 23 20 20 20 73 68 65 6c 6c 35 2d 31 2e 2a 3a  .#   shell5-1.*:
0230: 20 42 61 73 69 63 20 74 65 73 74 73 20 73 70 65   Basic tests spe
0240: 63 69 66 69 63 20 74 6f 20 74 68 65 20 22 2e 69  cific to the ".i
0250: 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a  mport" command..
0260: 23 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  #.set testdir [f
0270: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0280: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0290: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 69  dir/tester.tcl.i
02a0: 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  f {$tcl_platform
02b0: 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 77 69 6e  (platform)=="win
02c0: 64 6f 77 73 22 7d 20 7b 0a 20 20 73 65 74 20 43  dows"} {.  set C
02d0: 4c 49 20 22 73 71 6c 69 74 65 33 2e 65 78 65 22  LI "sqlite3.exe"
02e0: 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 73 65 74 20  .} else {.  set 
02f0: 43 4c 49 20 22 2e 2f 73 71 6c 69 74 65 33 22 0a  CLI "./sqlite3".
0300: 7d 0a 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 65  }.if {![file exe
0310: 63 75 74 61 62 6c 65 20 24 43 4c 49 5d 7d 20 7b  cutable $CLI]} {
0320: 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20  .  finish_test. 
0330: 20 72 65 74 75 72 6e 0a 7d 0a 64 62 20 63 6c 6f   return.}.db clo
0340: 73 65 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  se.forcedelete t
0350: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a  est.db test.db-j
0360: 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 2d 77  ournal test.db-w
0370: 61 6c 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  al..#-----------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03c0: 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20 73  -.# Test cases s
03d0: 68 65 6c 6c 35 2d 31 2e 2a 3a 20 42 61 73 69 63  hell5-1.*: Basic
03e0: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65   handling of the
03f0: 20 2e 69 6d 70 6f 72 74 20 61 6e 64 20 2e 73 65   .import and .se
0400: 70 61 72 61 74 6f 72 20 63 6f 6d 6d 61 6e 64 73  parator commands
0410: 2e 0a 23 0a 0a 23 20 2e 69 6d 70 6f 72 74 20 46  ..#..# .import F
0420: 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 49 6d  ILE TABLE     Im
0430: 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46  port data from F
0440: 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 0a 64  ILE into TABLE.d
0450: 6f 5f 74 65 73 74 20 73 68 65 6c 6c 35 2d 31 2e  o_test shell5-1.
0460: 31 2e 31 20 7b 0a 20 20 63 61 74 63 68 63 6d 64  1.1 {.  catchcmd
0470: 20 22 74 65 73 74 2e 64 62 22 20 22 2e 69 6d 70   "test.db" ".imp
0480: 6f 72 74 22 0a 7d 20 7b 31 20 7b 55 73 61 67 65  ort".} {1 {Usage
0490: 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54  : .import FILE T
04a0: 41 42 4c 45 7d 7d 0a 64 6f 5f 74 65 73 74 20 73  ABLE}}.do_test s
04b0: 68 65 6c 6c 35 2d 31 2e 31 2e 32 20 7b 0a 20 20  hell5-1.1.2 {.  
04c0: 63 61 74 63 68 63 6d 64 20 22 74 65 73 74 2e 64  catchcmd "test.d
04d0: 62 22 20 22 2e 69 6d 70 6f 72 74 20 46 4f 4f 22  b" ".import FOO"
04e0: 0a 7d 20 7b 31 20 7b 55 73 61 67 65 3a 20 2e 69  .} {1 {Usage: .i
04f0: 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45  mport FILE TABLE
0500: 7d 7d 0a 23 64 6f 5f 74 65 73 74 20 73 68 65 6c  }}.#do_test shel
0510: 6c 35 2d 31 2e 31 2e 32 20 7b 0a 23 20 20 63 61  l5-1.1.2 {.#  ca
0520: 74 63 68 63 6d 64 20 22 74 65 73 74 2e 64 62 22  tchcmd "test.db"
0530: 20 22 2e 69 6d 70 6f 72 74 20 46 4f 4f 20 42 41   ".import FOO BA
0540: 52 22 0a 23 7d 20 7b 31 20 7b 45 72 72 6f 72 3a  R".#} {1 {Error:
0550: 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20   no such table: 
0560: 42 41 52 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 68  BAR}}.do_test sh
0570: 65 6c 6c 35 2d 31 2e 31 2e 33 20 7b 0a 20 20 23  ell5-1.1.3 {.  #
0580: 20 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65   too many argume
0590: 6e 74 73 0a 20 20 63 61 74 63 68 63 6d 64 20 22  nts.  catchcmd "
05a0: 74 65 73 74 2e 64 62 22 20 22 2e 69 6d 70 6f 72  test.db" ".impor
05b0: 74 20 46 4f 4f 20 42 41 52 20 42 41 44 22 0a 7d  t FOO BAR BAD".}
05c0: 20 7b 31 20 7b 55 73 61 67 65 3a 20 2e 69 6d 70   {1 {Usage: .imp
05d0: 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 7d 7d  ort FILE TABLE}}
05e0: 0a 0a 23 20 2e 73 65 70 61 72 61 74 6f 72 20 53  ..# .separator S
05f0: 54 52 49 4e 47 20 20 20 20 20 20 43 68 61 6e 67  TRING      Chang
0600: 65 20 73 65 70 61 72 61 74 6f 72 20 75 73 65 64  e separator used
0610: 20 62 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20   by output mode 
0620: 61 6e 64 20 2e 69 6d 70 6f 72 74 0a 64 6f 5f 74  and .import.do_t
0630: 65 73 74 20 73 68 65 6c 6c 35 2d 31 2e 32 2e 31  est shell5-1.2.1
0640: 20 7b 0a 20 20 63 61 74 63 68 63 6d 64 20 22 74   {.  catchcmd "t
0650: 65 73 74 2e 64 62 22 20 22 2e 73 65 70 61 72 61  est.db" ".separa
0660: 74 6f 72 22 0a 7d 20 7b 31 20 7b 55 73 61 67 65  tor".} {1 {Usage
0670: 3a 20 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c  : .separator COL
0680: 20 3f 52 4f 57 3f 7d 7d 0a 64 6f 5f 74 65 73 74   ?ROW?}}.do_test
0690: 20 73 68 65 6c 6c 35 2d 31 2e 32 2e 32 20 7b 0a   shell5-1.2.2 {.
06a0: 20 20 63 61 74 63 68 63 6d 64 20 22 74 65 73 74    catchcmd "test
06b0: 2e 64 62 22 20 22 2e 73 65 70 61 72 61 74 6f 72  .db" ".separator
06c0: 20 4f 4e 45 22 0a 7d 20 7b 30 20 7b 7d 7d 0a 64   ONE".} {0 {}}.d
06d0: 6f 5f 74 65 73 74 20 73 68 65 6c 6c 35 2d 31 2e  o_test shell5-1.
06e0: 32 2e 33 20 7b 0a 20 20 63 61 74 63 68 63 6d 64  2.3 {.  catchcmd
06f0: 20 22 74 65 73 74 2e 64 62 22 20 22 2e 73 65 70   "test.db" ".sep
0700: 61 72 61 74 6f 72 20 4f 4e 45 20 54 57 4f 22 0a  arator ONE TWO".
0710: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {0 {}}.do_test
0720: 20 73 68 65 6c 6c 35 2d 31 2e 32 2e 34 20 7b 0a   shell5-1.2.4 {.
0730: 20 20 23 20 74 6f 6f 20 6d 61 6e 79 20 61 72 67    # too many arg
0740: 75 6d 65 6e 74 73 0a 20 20 63 61 74 63 68 63 6d  uments.  catchcm
0750: 64 20 22 74 65 73 74 2e 64 62 22 20 22 2e 73 65  d "test.db" ".se
0760: 70 61 72 61 74 6f 72 20 4f 4e 45 20 54 57 4f 20  parator ONE TWO 
0770: 54 48 52 45 45 22 0a 7d 20 7b 31 20 7b 55 73 61  THREE".} {1 {Usa
0780: 67 65 3a 20 2e 73 65 70 61 72 61 74 6f 72 20 43  ge: .separator C
0790: 4f 4c 20 3f 52 4f 57 3f 7d 7d 0a 0a 23 20 63 6f  OL ?ROW?}}..# co
07a0: 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 73  lumn separator s
07b0: 68 6f 75 6c 64 20 64 65 66 61 75 6c 74 20 74 6f  hould default to
07c0: 20 22 7c 22 0a 64 6f 5f 74 65 73 74 20 73 68 65   "|".do_test she
07d0: 6c 6c 35 2d 31 2e 33 2e 31 2e 31 20 7b 0a 20 20  ll5-1.3.1.1 {.  
07e0: 73 65 74 20 72 65 73 20 5b 63 61 74 63 68 63 6d  set res [catchcm
07f0: 64 20 22 74 65 73 74 2e 64 62 22 20 22 2e 73 68  d "test.db" ".sh
0800: 6f 77 22 5d 0a 20 20 6c 69 73 74 20 5b 72 65 67  ow"].  list [reg
0810: 65 78 70 20 7b 63 6f 6c 73 65 70 61 72 61 74 6f  exp {colseparato
0820: 72 3a 20 5c 22 5c 7c 5c 22 7d 20 24 72 65 73 5d  r: \"\|\"} $res]
0830: 0a 7d 20 7b 31 7d 0a 0a 23 20 72 6f 77 20 73 65  .} {1}..# row se
0840: 70 61 72 61 74 6f 72 20 73 68 6f 75 6c 64 20 64  parator should d
0850: 65 66 61 75 6c 74 20 74 6f 20 22 5c 6e 22 0a 64  efault to "\n".d
0860: 6f 5f 74 65 73 74 20 73 68 65 6c 6c 35 2d 31 2e  o_test shell5-1.
0870: 33 2e 31 2e 32 20 7b 0a 20 20 73 65 74 20 72 65  3.1.2 {.  set re
0880: 73 20 5b 63 61 74 63 68 63 6d 64 20 22 74 65 73  s [catchcmd "tes
0890: 74 2e 64 62 22 20 22 2e 73 68 6f 77 22 5d 0a 20  t.db" ".show"]. 
08a0: 20 6c 69 73 74 20 5b 72 65 67 65 78 70 20 7b 72   list [regexp {r
08b0: 6f 77 73 65 70 61 72 61 74 6f 72 3a 20 5c 22 5c  owseparator: \"\
08c0: 5c 6e 5c 22 7d 20 24 72 65 73 5d 0a 7d 20 7b 31  \n\"} $res].} {1
08d0: 7d 0a 0a 23 20 73 65 74 20 73 65 70 61 72 61 74  }..# set separat
08e0: 6f 72 20 74 6f 20 64 69 66 66 65 72 65 6e 74 20  or to different 
08f0: 76 61 6c 75 65 2e 0a 23 20 63 68 65 63 6b 20 74  value..# check t
0900: 68 61 74 20 2e 73 68 6f 77 20 72 65 70 6f 72 74  hat .show report
0910: 73 20 6e 65 77 20 76 61 6c 75 65 0a 64 6f 5f 74  s new value.do_t
0920: 65 73 74 20 73 68 65 6c 6c 35 2d 31 2e 33 2e 32  est shell5-1.3.2
0930: 20 7b 0a 20 20 73 65 74 20 72 65 73 20 5b 63 61   {.  set res [ca
0940: 74 63 68 63 6d 64 20 22 74 65 73 74 2e 64 62 22  tchcmd "test.db"
0950: 20 7b 2e 73 65 70 61 72 61 74 6f 72 20 2c 0a 2e   {.separator ,..
0960: 73 68 6f 77 7d 5d 0a 20 20 6c 69 73 74 20 5b 72  show}].  list [r
0970: 65 67 65 78 70 20 7b 73 65 70 61 72 61 74 6f 72  egexp {separator
0980: 3a 20 5c 22 2c 5c 22 7d 20 24 72 65 73 5d 0a 7d  : \",\"} $res].}
0990: 20 7b 31 7d 0a 0a 23 20 69 6d 70 6f 72 74 20 66   {1}..# import f
09a0: 69 6c 65 20 64 6f 65 73 6e 27 74 20 65 78 69 73  ile doesn't exis
09b0: 74 0a 64 6f 5f 74 65 73 74 20 73 68 65 6c 6c 35  t.do_test shell5
09c0: 2d 31 2e 34 2e 31 20 7b 0a 20 20 66 6f 72 63 65  -1.4.1 {.  force
09d0: 64 65 6c 65 74 65 20 46 4f 4f 0a 20 20 73 65 74  delete FOO.  set
09e0: 20 72 65 73 20 5b 63 61 74 63 68 63 6d 64 20 22   res [catchcmd "
09f0: 74 65 73 74 2e 64 62 22 20 7b 43 52 45 41 54 45  test.db" {CREATE
0a00: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
0a10: 0a 2e 69 6d 70 6f 72 74 20 46 4f 4f 20 74 31 7d  ..import FOO t1}
0a20: 5d 0a 7d 20 7b 31 20 7b 45 72 72 6f 72 3a 20 63  ].} {1 {Error: c
0a30: 61 6e 6e 6f 74 20 6f 70 65 6e 20 22 46 4f 4f 22  annot open "FOO"
0a40: 7d 7d 0a 0a 23 20 65 6d 70 74 79 20 69 6d 70 6f  }}..# empty impo
0a50: 72 74 20 66 69 6c 65 0a 64 6f 5f 74 65 73 74 20  rt file.do_test 
0a60: 73 68 65 6c 6c 35 2d 31 2e 34 2e 32 20 7b 0a 20  shell5-1.4.2 {. 
0a70: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 73 68 65   forcedelete she
0a80: 6c 6c 35 2e 63 73 76 0a 20 20 73 65 74 20 69 6e  ll5.csv.  set in
0a90: 20 5b 6f 70 65 6e 20 73 68 65 6c 6c 35 2e 63 73   [open shell5.cs
0aa0: 76 20 77 5d 0a 20 20 63 6c 6f 73 65 20 24 69 6e  v w].  close $in
0ab0: 0a 20 20 73 65 74 20 72 65 73 20 5b 63 61 74 63  .  set res [catc
0ac0: 68 63 6d 64 20 22 74 65 73 74 2e 64 62 22 20 7b  hcmd "test.db" {
0ad0: 2e 69 6d 70 6f 72 74 20 73 68 65 6c 6c 35 2e 63  .import shell5.c
0ae0: 73 76 20 74 31 0a 53 45 4c 45 43 54 20 43 4f 55  sv t1.SELECT COU
0af0: 4e 54 28 2a 29 20 46 52 4f 4d 20 74 31 3b 7d 5d  NT(*) FROM t1;}]
0b00: 0a 7d 20 7b 30 20 30 7d 0a 0a 23 20 69 6d 70 6f  .} {0 0}..# impo
0b10: 72 74 20 66 69 6c 65 20 77 69 74 68 20 31 20 72  rt file with 1 r
0b20: 6f 77 2c 20 31 20 63 6f 6c 75 6d 6e 20 28 65 78  ow, 1 column (ex
0b30: 70 65 63 74 69 6e 67 20 32 20 63 6f 6c 73 29 0a  pecting 2 cols).
0b40: 64 6f 5f 74 65 73 74 20 73 68 65 6c 6c 35 2d 31  do_test shell5-1
0b50: 2e 34 2e 33 20 7b 0a 20 20 73 65 74 20 69 6e 20  .4.3 {.  set in 
0b60: 5b 6f 70 65 6e 20 73 68 65 6c 6c 35 2e 63 73 76  [open shell5.csv
0b70: 20 77 5d 0a 20 20 70 75 74 73 20 24 69 6e 20 22   w].  puts $in "
0b80: 31 22 0a 20 20 63 6c 6f 73 65 20 24 69 6e 0a 20  1".  close $in. 
0b90: 20 73 65 74 20 72 65 73 20 5b 63 61 74 63 68 63   set res [catchc
0ba0: 6d 64 20 22 74 65 73 74 2e 64 62 22 20 7b 2e 69  md "test.db" {.i
0bb0: 6d 70 6f 72 74 20 73 68 65 6c 6c 35 2e 63 73 76  mport shell5.csv
0bc0: 20 74 31 7d 5d 0a 7d 20 7b 31 20 7b 73 68 65 6c   t1}].} {1 {shel
0bd0: 6c 35 2e 63 73 76 3a 31 3a 20 65 78 70 65 63 74  l5.csv:1: expect
0be0: 65 64 20 32 20 63 6f 6c 75 6d 6e 73 20 62 75 74  ed 2 columns but
0bf0: 20 66 6f 75 6e 64 20 31 20 2d 20 66 69 6c 6c 69   found 1 - filli
0c00: 6e 67 20 74 68 65 20 72 65 73 74 20 77 69 74 68  ng the rest with
0c10: 20 4e 55 4c 4c 7d 7d 0a 0a 23 20 69 6d 70 6f 72   NULL}}..# impor
0c20: 74 20 66 69 6c 65 20 77 69 74 68 20 31 20 72 6f  t file with 1 ro
0c30: 77 2c 20 33 20 63 6f 6c 75 6d 6e 73 20 28 65 78  w, 3 columns (ex
0c40: 70 65 63 74 69 6e 67 20 32 20 63 6f 6c 73 29 0a  pecting 2 cols).
0c50: 64 6f 5f 74 65 73 74 20 73 68 65 6c 6c 35 2d 31  do_test shell5-1
0c60: 2e 34 2e 34 20 7b 0a 20 20 73 65 74 20 69 6e 20  .4.4 {.  set in 
0c70: 5b 6f 70 65 6e 20 73 68 65 6c 6c 35 2e 63 73 76  [open shell5.csv
0c80: 20 77 5d 0a 20 20 70 75 74 73 20 24 69 6e 20 22   w].  puts $in "
0c90: 31 7c 32 7c 33 22 0a 20 20 63 6c 6f 73 65 20 24  1|2|3".  close $
0ca0: 69 6e 0a 20 20 73 65 74 20 72 65 73 20 5b 63 61  in.  set res [ca
0cb0: 74 63 68 63 6d 64 20 22 74 65 73 74 2e 64 62 22  tchcmd "test.db"
0cc0: 20 7b 2e 69 6d 70 6f 72 74 20 73 68 65 6c 6c 35   {.import shell5
0cd0: 2e 63 73 76 20 74 31 7d 5d 0a 7d 20 7b 31 20 7b  .csv t1}].} {1 {
0ce0: 73 68 65 6c 6c 35 2e 63 73 76 3a 31 3a 20 65 78  shell5.csv:1: ex
0cf0: 70 65 63 74 65 64 20 32 20 63 6f 6c 75 6d 6e 73  pected 2 columns
0d00: 20 62 75 74 20 66 6f 75 6e 64 20 33 20 2d 20 65   but found 3 - e
0d10: 78 74 72 61 73 20 69 67 6e 6f 72 65 64 7d 7d 0a  xtras ignored}}.
0d20: 0a 23 20 69 6d 70 6f 72 74 20 66 69 6c 65 20 77  .# import file w
0d30: 69 74 68 20 31 20 72 6f 77 2c 20 32 20 63 6f 6c  ith 1 row, 2 col
0d40: 75 6d 6e 73 0a 64 6f 5f 74 65 73 74 20 73 68 65  umns.do_test she
0d50: 6c 6c 35 2d 31 2e 34 2e 35 20 7b 0a 20 20 73 65  ll5-1.4.5 {.  se
0d60: 74 20 69 6e 20 5b 6f 70 65 6e 20 73 68 65 6c 6c  t in [open shell
0d70: 35 2e 63 73 76 20 77 5d 0a 20 20 70 75 74 73 20  5.csv w].  puts 
0d80: 24 69 6e 20 22 31 7c 32 22 0a 20 20 63 6c 6f 73  $in "1|2".  clos
0d90: 65 20 24 69 6e 0a 20 20 73 65 74 20 72 65 73 20  e $in.  set res 
0da0: 5b 63 61 74 63 68 63 6d 64 20 22 74 65 73 74 2e  [catchcmd "test.
0db0: 64 62 22 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  db" {DELETE FROM
0dc0: 20 74 31 3b 0a 2e 69 6d 70 6f 72 74 20 73 68 65   t1;..import she
0dd0: 6c 6c 35 2e 63 73 76 20 74 31 0a 53 45 4c 45 43  ll5.csv t1.SELEC
0de0: 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20  T COUNT(*) FROM 
0df0: 74 31 3b 7d 5d 0a 7d 20 7b 30 20 31 7d 0a 0a 23  t1;}].} {0 1}..#
0e00: 20 69 6d 70 6f 72 74 20 66 69 6c 65 20 77 69 74   import file wit
0e10: 68 20 32 20 72 6f 77 73 2c 20 32 20 63 6f 6c 75  h 2 rows, 2 colu
0e20: 6d 6e 73 0a 23 20 6e 6f 74 65 20 77 65 20 65 6e  mns.# note we en
0e30: 64 20 75 70 20 77 69 74 68 20 33 20 72 6f 77 73  d up with 3 rows
0e40: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
0e50: 31 20 72 6f 77 20 0a 23 20 69 6d 70 6f 72 74 65  1 row .# importe
0e60: 64 20 61 62 6f 76 65 2e 0a 64 6f 5f 74 65 73 74  d above..do_test
0e70: 20 73 68 65 6c 6c 35 2d 31 2e 34 2e 36 20 7b 0a   shell5-1.4.6 {.
0e80: 20 20 73 65 74 20 69 6e 20 5b 6f 70 65 6e 20 73    set in [open s
0e90: 68 65 6c 6c 35 2e 63 73 76 20 77 5d 0a 20 20 70  hell5.csv w].  p
0ea0: 75 74 73 20 24 69 6e 20 22 32 7c 33 22 0a 20 20  uts $in "2|3".  
0eb0: 70 75 74 73 20 24 69 6e 20 22 33 7c 34 22 0a 20  puts $in "3|4". 
0ec0: 20 63 6c 6f 73 65 20 24 69 6e 0a 20 20 73 65 74   close $in.  set
0ed0: 20 72 65 73 20 5b 63 61 74 63 68 63 6d 64 20 22   res [catchcmd "
0ee0: 74 65 73 74 2e 64 62 22 20 7b 2e 69 6d 70 6f 72  test.db" {.impor
0ef0: 74 20 73 68 65 6c 6c 35 2e 63 73 76 20 74 31 0a  t shell5.csv t1.
0f00: 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a 29 20  SELECT COUNT(*) 
0f10: 46 52 4f 4d 20 74 31 3b 7d 5d 0a 7d 20 7b 30 20  FROM t1;}].} {0 
0f20: 33 7d 0a 0a 23 20 69 6d 70 6f 72 74 20 66 69 6c  3}..# import fil
0f30: 65 20 77 69 74 68 20 31 20 72 6f 77 2c 20 32 20  e with 1 row, 2 
0f40: 63 6f 6c 75 6d 6e 73 2c 20 75 73 69 6e 67 20 61  columns, using a
0f50: 20 63 6f 6d 6d 61 0a 64 6f 5f 74 65 73 74 20 73   comma.do_test s
0f60: 68 65 6c 6c 35 2d 31 2e 34 2e 37 20 7b 0a 20 20  hell5-1.4.7 {.  
0f70: 73 65 74 20 69 6e 20 5b 6f 70 65 6e 20 73 68 65  set in [open she
0f80: 6c 6c 35 2e 63 73 76 20 77 5d 0a 20 20 70 75 74  ll5.csv w].  put
0f90: 73 20 24 69 6e 20 22 34 2c 35 22 0a 20 20 63 6c  s $in "4,5".  cl
0fa0: 6f 73 65 20 24 69 6e 0a 20 20 73 65 74 20 72 65  ose $in.  set re
0fb0: 73 20 5b 63 61 74 63 68 63 6d 64 20 22 74 65 73  s [catchcmd "tes
0fc0: 74 2e 64 62 22 20 7b 2e 73 65 70 61 72 61 74 6f  t.db" {.separato
0fd0: 72 20 2c 0a 2e 69 6d 70 6f 72 74 20 73 68 65 6c  r ,..import shel
0fe0: 6c 35 2e 63 73 76 20 74 31 0a 53 45 4c 45 43 54  l5.csv t1.SELECT
0ff0: 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 74   COUNT(*) FROM t
1000: 31 3b 7d 5d 0a 7d 20 7b 30 20 34 7d 0a 0a 23 20  1;}].} {0 4}..# 
1010: 69 6d 70 6f 72 74 20 66 69 6c 65 20 77 69 74 68  import file with
1020: 20 31 20 72 6f 77 2c 20 32 20 63 6f 6c 75 6d 6e   1 row, 2 column
1030: 73 2c 20 74 65 78 74 20 64 61 74 61 0a 64 6f 5f  s, text data.do_
1040: 74 65 73 74 20 73 68 65 6c 6c 35 2d 31 2e 34 2e  test shell5-1.4.
1050: 38 2e 31 20 7b 0a 20 20 73 65 74 20 69 6e 20 5b  8.1 {.  set in [
1060: 6f 70 65 6e 20 73 68 65 6c 6c 35 2e 63 73 76 20  open shell5.csv 
1070: 77 5d 0a 20 20 70 75 74 73 20 24 69 6e 20 22 35  w].  puts $in "5
1080: 7c 4e 6f 77 20 69 73 20 74 68 65 20 74 69 6d 65  |Now is the time
1090: 20 66 6f 72 20 61 6c 6c 20 67 6f 6f 64 20 6d 65   for all good me
10a0: 6e 20 74 6f 20 63 6f 6d 65 20 74 6f 20 74 68 65  n to come to the
10b0: 20 61 69 64 20 6f 66 20 74 68 65 69 72 20 63 6f   aid of their co
10c0: 75 6e 74 72 79 2e 22 0a 20 20 63 6c 6f 73 65 20  untry.".  close 
10d0: 24 69 6e 0a 20 20 73 65 74 20 72 65 73 20 5b 63  $in.  set res [c
10e0: 61 74 63 68 63 6d 64 20 22 74 65 73 74 2e 64 62  atchcmd "test.db
10f0: 22 20 7b 2e 69 6d 70 6f 72 74 20 73 68 65 6c 6c  " {.import shell
1100: 35 2e 63 73 76 20 74 31 0a 53 45 4c 45 43 54 20  5.csv t1.SELECT 
1110: 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 74 31  COUNT(*) FROM t1
1120: 3b 7d 5d 0a 7d 20 7b 30 20 35 7d 0a 0a 64 6f 5f  ;}].} {0 5}..do_
1130: 74 65 73 74 20 73 68 65 6c 6c 35 2d 31 2e 34 2e  test shell5-1.4.
1140: 38 2e 32 20 7b 0a 20 20 63 61 74 63 68 63 6d 64  8.2 {.  catchcmd
1150: 20 22 74 65 73 74 2e 64 62 22 20 7b 53 45 4c 45   "test.db" {SELE
1160: 43 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  CT b FROM t1 WHE
1170: 52 45 20 61 3d 27 35 27 3b 7d 0a 7d 20 7b 30 20  RE a='5';}.} {0 
1180: 7b 4e 6f 77 20 69 73 20 74 68 65 20 74 69 6d 65  {Now is the time
1190: 20 66 6f 72 20 61 6c 6c 20 67 6f 6f 64 20 6d 65   for all good me
11a0: 6e 20 74 6f 20 63 6f 6d 65 20 74 6f 20 74 68 65  n to come to the
11b0: 20 61 69 64 20 6f 66 20 74 68 65 69 72 20 63 6f   aid of their co
11c0: 75 6e 74 72 79 2e 7d 7d 0a 0a 23 20 69 6d 70 6f  untry.}}..# impo
11d0: 72 74 20 66 69 6c 65 20 77 69 74 68 20 31 20 72  rt file with 1 r
11e0: 6f 77 2c 20 32 20 63 6f 6c 75 6d 6e 73 2c 20 71  ow, 2 columns, q
11f0: 75 6f 74 65 64 20 74 65 78 74 20 64 61 74 61 0a  uoted text data.
1200: 23 20 6e 6f 74 65 20 74 68 61 74 20 63 75 72 72  # note that curr
1210: 65 6e 74 6c 79 20 73 71 6c 69 74 65 20 64 6f 65  ently sqlite doe
1220: 73 6e 27 74 20 73 75 70 70 6f 72 74 20 71 75 6f  sn't support quo
1230: 74 65 64 20 66 69 65 6c 64 73 2c 20 61 6e 64 0a  ted fields, and.
1240: 23 20 69 6d 70 6f 72 74 73 20 74 68 65 20 65 6e  # imports the en
1250: 74 69 72 65 20 66 69 65 6c 64 2c 20 71 75 6f 74  tire field, quot
1260: 65 73 20 61 6e 64 20 61 6c 6c 2e 0a 64 6f 5f 74  es and all..do_t
1270: 65 73 74 20 73 68 65 6c 6c 35 2d 31 2e 34 2e 39  est shell5-1.4.9
1280: 2e 31 20 7b 0a 20 20 73 65 74 20 69 6e 20 5b 6f  .1 {.  set in [o
1290: 70 65 6e 20 73 68 65 6c 6c 35 2e 63 73 76 20 77  pen shell5.csv w
12a0: 5d 0a 20 20 70 75 74 73 20 24 69 6e 20 22 36 7c  ].  puts $in "6|
12b0: 27 4e 6f 77 20 69 73 20 74 68 65 20 74 69 6d 65  'Now is the time
12c0: 20 66 6f 72 20 61 6c 6c 20 67 6f 6f 64 20 6d 65   for all good me
12d0: 6e 20 74 6f 20 63 6f 6d 65 20 74 6f 20 74 68 65  n to come to the
12e0: 20 61 69 64 20 6f 66 20 74 68 65 69 72 20 63 6f   aid of their co
12f0: 75 6e 74 72 79 2e 27 22 0a 20 20 63 6c 6f 73 65  untry.'".  close
1300: 20 24 69 6e 0a 20 20 73 65 74 20 72 65 73 20 5b   $in.  set res [
1310: 63 61 74 63 68 63 6d 64 20 22 74 65 73 74 2e 64  catchcmd "test.d
1320: 62 22 20 7b 2e 69 6d 70 6f 72 74 20 73 68 65 6c  b" {.import shel
1330: 6c 35 2e 63 73 76 20 74 31 0a 53 45 4c 45 43 54  l5.csv t1.SELECT
1340: 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 74   COUNT(*) FROM t
1350: 31 3b 7d 5d 0a 7d 20 7b 30 20 36 7d 0a 0a 64 6f  1;}].} {0 6}..do
1360: 5f 74 65 73 74 20 73 68 65 6c 6c 35 2d 31 2e 34  _test shell5-1.4
1370: 2e 39 2e 32 20 7b 0a 20 20 63 61 74 63 68 63 6d  .9.2 {.  catchcm
1380: 64 20 22 74 65 73 74 2e 64 62 22 20 7b 53 45 4c  d "test.db" {SEL
1390: 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48  ECT b FROM t1 WH
13a0: 45 52 45 20 61 3d 27 36 27 3b 7d 0a 7d 20 7b 30  ERE a='6';}.} {0
13b0: 20 7b 27 4e 6f 77 20 69 73 20 74 68 65 20 74 69   {'Now is the ti
13c0: 6d 65 20 66 6f 72 20 61 6c 6c 20 67 6f 6f 64 20  me for all good 
13d0: 6d 65 6e 20 74 6f 20 63 6f 6d 65 20 74 6f 20 74  men to come to t
13e0: 68 65 20 61 69 64 20 6f 66 20 74 68 65 69 72 20  he aid of their 
13f0: 63 6f 75 6e 74 72 79 2e 27 7d 7d 0a 0a 23 20 69  country.'}}..# i
1400: 6d 70 6f 72 74 20 66 69 6c 65 20 77 69 74 68 20  mport file with 
1410: 31 20 72 6f 77 2c 20 32 20 63 6f 6c 75 6d 6e 73  1 row, 2 columns
1420: 2c 20 71 75 6f 74 65 64 20 74 65 78 74 20 64 61  , quoted text da
1430: 74 61 0a 64 6f 5f 74 65 73 74 20 73 68 65 6c 6c  ta.do_test shell
1440: 35 2d 31 2e 34 2e 31 30 2e 31 20 7b 0a 20 20 73  5-1.4.10.1 {.  s
1450: 65 74 20 69 6e 20 5b 6f 70 65 6e 20 73 68 65 6c  et in [open shel
1460: 6c 35 2e 63 73 76 20 77 5d 0a 20 20 70 75 74 73  l5.csv w].  puts
1470: 20 24 69 6e 20 22 37 7c 5c 22 4e 6f 77 20 69 73   $in "7|\"Now is
1480: 20 74 68 65 20 74 69 6d 65 20 66 6f 72 20 61 6c   the time for al
1490: 6c 20 67 6f 6f 64 20 6d 65 6e 20 74 6f 20 63 6f  l good men to co
14a0: 6d 65 20 74 6f 20 74 68 65 20 61 69 64 20 6f 66  me to the aid of
14b0: 20 74 68 65 69 72 20 63 6f 75 6e 74 72 79 2e 5c   their country.\
14c0: 22 22 0a 20 20 63 6c 6f 73 65 20 24 69 6e 0a 20  "".  close $in. 
14d0: 20 73 65 74 20 72 65 73 20 5b 63 61 74 63 68 63   set res [catchc
14e0: 6d 64 20 22 74 65 73 74 2e 64 62 22 20 7b 2e 69  md "test.db" {.i
14f0: 6d 70 6f 72 74 20 73 68 65 6c 6c 35 2e 63 73 76  mport shell5.csv
1500: 20 74 31 0a 53 45 4c 45 43 54 20 43 4f 55 4e 54   t1.SELECT COUNT
1510: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 7d 5d 0a 7d  (*) FROM t1;}].}
1520: 20 7b 30 20 37 7d 0a 0a 64 6f 5f 74 65 73 74 20   {0 7}..do_test 
1530: 73 68 65 6c 6c 35 2d 31 2e 34 2e 31 30 2e 32 20  shell5-1.4.10.2 
1540: 7b 0a 20 20 63 61 74 63 68 63 6d 64 20 22 74 65  {.  catchcmd "te
1550: 73 74 2e 64 62 22 20 7b 53 45 4c 45 43 54 20 62  st.db" {SELECT b
1560: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1570: 3d 27 37 27 3b 7d 0a 7d 20 7b 30 20 7b 4e 6f 77  ='7';}.} {0 {Now
1580: 20 69 73 20 74 68 65 20 74 69 6d 65 20 66 6f 72   is the time for
1590: 20 61 6c 6c 20 67 6f 6f 64 20 6d 65 6e 20 74 6f   all good men to
15a0: 20 63 6f 6d 65 20 74 6f 20 74 68 65 20 61 69 64   come to the aid
15b0: 20 6f 66 20 74 68 65 69 72 20 63 6f 75 6e 74 72   of their countr
15c0: 79 2e 7d 7d 0a 0a 23 20 63 68 65 63 6b 20 69 6d  y.}}..# check im
15d0: 70 6f 72 74 69 6e 67 20 76 65 72 79 20 6c 6f 6e  porting very lon
15e0: 67 20 66 69 65 6c 64 0a 64 6f 5f 74 65 73 74 20  g field.do_test 
15f0: 73 68 65 6c 6c 35 2d 31 2e 35 2e 31 20 7b 0a 20  shell5-1.5.1 {. 
1600: 20 73 65 74 20 73 74 72 20 5b 73 74 72 69 6e 67   set str [string
1610: 20 72 65 70 65 61 74 20 58 20 39 39 39 5d 0a 20   repeat X 999]. 
1620: 20 73 65 74 20 69 6e 20 5b 6f 70 65 6e 20 73 68   set in [open sh
1630: 65 6c 6c 35 2e 63 73 76 20 77 5d 0a 20 20 70 75  ell5.csv w].  pu
1640: 74 73 20 24 69 6e 20 22 38 7c 24 73 74 72 22 0a  ts $in "8|$str".
1650: 20 20 63 6c 6f 73 65 20 24 69 6e 0a 20 20 73 65    close $in.  se
1660: 74 20 72 65 73 20 5b 63 61 74 63 68 63 6d 64 20  t res [catchcmd 
1670: 22 74 65 73 74 2e 64 62 22 20 7b 2e 69 6d 70 6f  "test.db" {.impo
1680: 72 74 20 73 68 65 6c 6c 35 2e 63 73 76 20 74 31  rt shell5.csv t1
1690: 0a 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 62  .SELECT length(b
16a0: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
16b0: 61 3d 27 38 27 3b 7d 5d 0a 7d 20 7b 30 20 39 39  a='8';}].} {0 99
16c0: 39 7d 0a 0a 23 20 74 72 79 20 69 6d 70 6f 72 74  9}..# try import
16d0: 69 6e 67 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ing into a table
16e0: 20 77 69 74 68 20 61 20 6c 61 72 67 65 20 6e 75   with a large nu
16f0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e  mber of columns.
1700: 0a 23 20 54 68 69 73 20 69 73 20 6c 69 6d 69 74  .# This is limit
1710: 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 41 58  ed by SQLITE_MAX
1720: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
1730: 2c 20 77 68 69 63 68 20 64 65 66 61 75 6c 74 73  , which defaults
1740: 20 74 6f 20 39 39 39 2e 0a 73 65 74 20 63 6f 6c   to 999..set col
1750: 73 20 39 39 39 0a 64 6f 5f 74 65 73 74 20 73 68  s 999.do_test sh
1760: 65 6c 6c 35 2d 31 2e 36 2e 31 20 7b 0a 20 20 73  ell5-1.6.1 {.  s
1770: 65 74 20 64 61 74 61 20 7b 7d 0a 20 20 66 6f 72  et data {}.  for
1780: 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 24   {set i 1} {$i<$
1790: 63 6f 6c 73 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  cols} {incr i} {
17a0: 0a 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61  .    append data
17b0: 20 22 63 24 69 7c 22 0a 20 20 7d 0a 20 20 61 70   "c$i|".  }.  ap
17c0: 70 65 6e 64 20 64 61 74 61 20 22 63 24 63 6f 6c  pend data "c$col
17d0: 73 5c 6e 22 3b 0a 20 20 66 6f 72 20 7b 73 65 74  s\n";.  for {set
17e0: 20 69 20 31 7d 20 7b 24 69 3c 24 63 6f 6c 73 7d   i 1} {$i<$cols}
17f0: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
1800: 61 70 70 65 6e 64 20 64 61 74 61 20 22 24 69 7c  append data "$i|
1810: 22 0a 20 20 7d 0a 20 20 61 70 70 65 6e 64 20 64  ".  }.  append d
1820: 61 74 61 20 22 24 63 6f 6c 73 22 0a 20 20 73 65  ata "$cols".  se
1830: 74 20 69 6e 20 5b 6f 70 65 6e 20 73 68 65 6c 6c  t in [open shell
1840: 35 2e 63 73 76 20 77 5d 0a 20 20 70 75 74 73 20  5.csv w].  puts 
1850: 24 69 6e 20 24 64 61 74 61 0a 20 20 63 6c 6f 73  $in $data.  clos
1860: 65 20 24 69 6e 0a 20 20 73 65 74 20 72 65 73 20  e $in.  set res 
1870: 5b 63 61 74 63 68 63 6d 64 20 22 74 65 73 74 2e  [catchcmd "test.
1880: 64 62 22 20 7b 2e 69 6d 70 6f 72 74 20 73 68 65  db" {.import she
1890: 6c 6c 35 2e 63 73 76 20 74 32 0a 53 45 4c 45 43  ll5.csv t2.SELEC
18a0: 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20  T COUNT(*) FROM 
18b0: 74 32 3b 7d 5d 0a 7d 20 7b 30 20 31 7d 0a 0a 23  t2;}].} {0 1}..#
18c0: 20 74 72 79 20 69 6d 70 6f 72 74 69 6e 67 20 61   try importing a
18d0: 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 20 6f 66   large number of
18e0: 20 72 6f 77 73 0a 73 65 74 20 72 6f 77 73 20 39   rows.set rows 9
18f0: 39 39 39 0a 64 6f 5f 74 65 73 74 20 73 68 65 6c  999.do_test shel
1900: 6c 35 2d 31 2e 37 2e 31 20 7b 0a 20 20 73 65 74  l5-1.7.1 {.  set
1910: 20 69 6e 20 5b 6f 70 65 6e 20 73 68 65 6c 6c 35   in [open shell5
1920: 2e 63 73 76 20 77 5d 0a 20 20 70 75 74 73 20 24  .csv w].  puts $
1930: 69 6e 20 61 0a 20 20 66 6f 72 20 7b 73 65 74 20  in a.  for {set 
1940: 69 20 31 7d 20 7b 24 69 3c 3d 24 72 6f 77 73 7d  i 1} {$i<=$rows}
1950: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
1960: 70 75 74 73 20 24 69 6e 20 24 69 0a 20 20 7d 0a  puts $in $i.  }.
1970: 20 20 63 6c 6f 73 65 20 24 69 6e 0a 20 20 73 65    close $in.  se
1980: 74 20 72 65 73 20 5b 63 61 74 63 68 63 6d 64 20  t res [catchcmd 
1990: 22 74 65 73 74 2e 64 62 22 20 7b 2e 6d 6f 64 65  "test.db" {.mode
19a0: 20 63 73 76 0a 2e 69 6d 70 6f 72 74 20 73 68 65   csv..import she
19b0: 6c 6c 35 2e 63 73 76 20 74 33 0a 53 45 4c 45 43  ll5.csv t3.SELEC
19c0: 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20  T COUNT(*) FROM 
19d0: 74 33 3b 7d 5d 0a 7d 20 5b 6c 69 73 74 20 30 20  t3;}].} [list 0 
19e0: 24 72 6f 77 73 5d 0a 0a 23 20 49 6e 70 6f 72 74  $rows]..# Inport
19f0: 20 66 72 6f 6d 20 61 20 70 69 70 65 2e 20 20 28   from a pipe.  (
1a00: 55 6e 69 78 20 6f 6e 6c 79 2c 20 61 73 20 69 74  Unix only, as it
1a10: 20 72 65 71 75 69 72 65 73 20 22 61 77 6b 22 29   requires "awk")
1a20: 0a 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f  .if {$tcl_platfo
1a30: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75  rm(platform)=="u
1a40: 6e 69 78 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  nix"} {.  do_tes
1a50: 74 20 73 68 65 6c 6c 35 2d 31 2e 38 20 7b 0a 20  t shell5-1.8 {. 
1a60: 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74     forcedelete t
1a70: 65 73 74 2e 64 62 0a 20 20 20 20 63 61 74 63 68  est.db.    catch
1a80: 63 6d 64 20 74 65 73 74 2e 64 62 20 7b 2e 6d 6f  cmd test.db {.mo
1a90: 64 65 20 63 73 76 0a 2e 69 6d 70 6f 72 74 20 22  de csv..import "
1aa0: 7c 61 77 6b 20 27 45 4e 44 7b 70 72 69 6e 74 20  |awk 'END{print 
1ab0: 5c 22 78 2c 79 5c 22 3b 66 6f 72 28 69 3d 31 3b  \"x,y\";for(i=1;
1ac0: 69 3c 3d 35 3b 69 2b 2b 29 7b 70 72 69 6e 74 20  i<=5;i++){print 
1ad0: 69 20 5c 22 2c 74 68 69 73 20 69 73 20 5c 22 20  i \",this is \" 
1ae0: 69 7d 7d 27 22 20 74 31 0a 53 45 4c 45 43 54 20  i}}'" t1.SELECT 
1af0: 2a 20 46 52 4f 4d 20 74 31 3b 7d 0a 20 20 7d 20  * FROM t1;}.  } 
1b00: 7b 30 20 7b 31 2c 22 74 68 69 73 20 69 73 20 31  {0 {1,"this is 1
1b10: 22 0a 32 2c 22 74 68 69 73 20 69 73 20 32 22 0a  ".2,"this is 2".
1b20: 33 2c 22 74 68 69 73 20 69 73 20 33 22 0a 34 2c  3,"this is 3".4,
1b30: 22 74 68 69 73 20 69 73 20 34 22 0a 35 2c 22 74  "this is 4".5,"t
1b40: 68 69 73 20 69 73 20 35 22 7d 7d 0a 7d 0a 0a 23  his is 5"}}.}..#
1b50: 20 49 6d 70 6f 72 74 20 63 6f 6c 75 6d 6e 73 20   Import columns 
1b60: 63 6f 6e 74 61 69 6e 69 6e 67 20 71 75 6f 74 65  containing quote
1b70: 64 20 73 74 72 69 6e 67 73 0a 64 6f 5f 74 65 73  d strings.do_tes
1b80: 74 20 73 68 65 6c 6c 35 2d 31 2e 39 20 7b 0a 20  t shell5-1.9 {. 
1b90: 20 73 65 74 20 6f 75 74 20 5b 6f 70 65 6e 20 73   set out [open s
1ba0: 68 65 6c 6c 35 2e 63 73 76 20 77 5d 0a 20 20 66  hell5.csv w].  f
1bb0: 63 6f 6e 66 69 67 75 72 65 20 24 6f 75 74 20 2d  configure $out -
1bc0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6c 66 0a 20  translation lf. 
1bd0: 20 70 75 74 73 20 24 6f 75 74 20 7b 31 2c 22 22   puts $out {1,""
1be0: 2c 31 31 7d 0a 20 20 70 75 74 73 20 24 6f 75 74  ,11}.  puts $out
1bf0: 20 7b 32 2c 22 78 22 2c 32 32 7d 0a 20 20 70 75   {2,"x",22}.  pu
1c00: 74 73 20 24 6f 75 74 20 7b 33 2c 22 22 22 22 2c  ts $out {3,"""",
1c10: 33 33 7d 0a 20 20 70 75 74 73 20 24 6f 75 74 20  33}.  puts $out 
1c20: 7b 34 2c 22 68 65 6c 6c 6f 22 2c 34 34 7d 0a 20  {4,"hello",44}. 
1c30: 20 70 75 74 73 20 24 6f 75 74 20 22 35 2c 35 35   puts $out "5,55
1c40: 2c 5c 22 5c 22 5c 72 22 0a 20 20 70 75 74 73 20  ,\"\"\r".  puts 
1c50: 24 6f 75 74 20 7b 36 2c 36 36 2c 22 78 22 7d 0a  $out {6,66,"x"}.
1c60: 20 20 70 75 74 73 20 24 6f 75 74 20 7b 37 2c 37    puts $out {7,7
1c70: 37 2c 22 22 22 22 7d 0a 20 20 70 75 74 73 20 24  7,""""}.  puts $
1c80: 6f 75 74 20 7b 38 2c 38 38 2c 22 68 65 6c 6c 6f  out {8,88,"hello
1c90: 22 7d 0a 20 20 70 75 74 73 20 24 6f 75 74 20 7b  "}.  puts $out {
1ca0: 22 22 2c 39 2c 39 39 7d 0a 20 20 70 75 74 73 20  "",9,99}.  puts 
1cb0: 24 6f 75 74 20 7b 22 78 22 2c 31 30 2c 31 31 30  $out {"x",10,110
1cc0: 7d 0a 20 20 70 75 74 73 20 24 6f 75 74 20 7b 22  }.  puts $out {"
1cd0: 22 22 22 2c 31 31 2c 31 32 31 7d 0a 20 20 70 75  """,11,121}.  pu
1ce0: 74 73 20 24 6f 75 74 20 7b 22 68 65 6c 6c 6f 22  ts $out {"hello"
1cf0: 2c 31 32 2c 31 33 32 7d 0a 20 20 63 6c 6f 73 65  ,12,132}.  close
1d00: 20 24 6f 75 74 0a 20 20 66 6f 72 63 65 64 65 6c   $out.  forcedel
1d10: 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20 63 61  ete test.db.  ca
1d20: 74 63 68 63 6d 64 20 74 65 73 74 2e 64 62 20 7b  tchcmd test.db {
1d30: 2e 6d 6f 64 65 20 63 73 76 0a 20 20 20 20 43 52  .mode csv.    CR
1d40: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
1d50: 62 2c 63 29 3b 0a 2e 69 6d 70 6f 72 74 20 73 68  b,c);..import sh
1d60: 65 6c 6c 35 2e 63 73 76 20 74 31 0a 20 20 7d 0a  ell5.csv t1.  }.
1d70: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
1d80: 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c 20 7b  t.db.  db eval {
1d90: 53 45 4c 45 43 54 20 2a 2c 20 27 7c 27 20 46 52  SELECT *, '|' FR
1da0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 72  OM t1 ORDER BY r
1db0: 6f 77 69 64 7d 0a 7d 20 7b 31 20 7b 7d 20 31 31  owid}.} {1 {} 11
1dc0: 20 7c 20 32 20 78 20 32 32 20 7c 20 33 20 7b 22   | 2 x 22 | 3 {"
1dd0: 7d 20 33 33 20 7c 20 34 20 68 65 6c 6c 6f 20 34  } 33 | 4 hello 4
1de0: 34 20 7c 20 35 20 35 35 20 7b 7d 20 7c 20 36 20  4 | 5 55 {} | 6 
1df0: 36 36 20 78 20 7c 20 37 20 37 37 20 7b 22 7d 20  66 x | 7 77 {"} 
1e00: 7c 20 38 20 38 38 20 68 65 6c 6c 6f 20 7c 20 7b  | 8 88 hello | {
1e10: 7d 20 39 20 39 39 20 7c 20 78 20 31 30 20 31 31  } 9 99 | x 10 11
1e20: 30 20 7c 20 7b 22 7d 20 31 31 20 31 32 31 20 7c  0 | {"} 11 121 |
1e30: 20 68 65 6c 6c 6f 20 31 32 20 31 33 32 20 7c 7d   hello 12 132 |}
1e40: 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 49 6d 70  .db close..# Imp
1e50: 6f 72 74 20 63 6f 6c 75 6d 6e 73 20 63 6f 6e 74  ort columns cont
1e60: 61 69 6e 69 6e 67 20 71 75 6f 74 65 64 20 73 74  aining quoted st
1e70: 72 69 6e 67 73 0a 64 6f 5f 74 65 73 74 20 73 68  rings.do_test sh
1e80: 65 6c 6c 35 2d 31 2e 31 30 20 7b 0a 20 20 73 65  ell5-1.10 {.  se
1e90: 74 20 6f 75 74 20 5b 6f 70 65 6e 20 73 68 65 6c  t out [open shel
1ea0: 6c 35 2e 63 73 76 20 77 5d 0a 20 20 66 63 6f 6e  l5.csv w].  fcon
1eb0: 66 69 67 75 72 65 20 24 6f 75 74 20 2d 74 72 61  figure $out -tra
1ec0: 6e 73 6c 61 74 69 6f 6e 20 6c 66 0a 20 20 70 75  nslation lf.  pu
1ed0: 74 73 20 24 6f 75 74 20 7b 63 6f 6c 75 6d 6e 31  ts $out {column1
1ee0: 2c 63 6f 6c 75 6d 6e 32 2c 63 6f 6c 75 6d 6e 33  ,column2,column3
1ef0: 2c 63 6f 6c 75 6d 6e 34 7d 0a 20 20 70 75 74 73  ,column4}.  puts
1f00: 20 24 6f 75 74 20 22 66 69 65 6c 64 31 2c 66 69   $out "field1,fi
1f10: 65 6c 64 32 2c 5c 22 78 33 20 5c 22 5c 22 5c 72  eld2,\"x3 \"\"\r
1f20: 5c 6e 64 61 74 61 5c 22 5c 22 20 33 5c 22 2c 66  \ndata\"\" 3\",f
1f30: 69 65 6c 64 34 22 0a 20 20 70 75 74 73 20 24 6f  ield4".  puts $o
1f40: 75 74 20 22 78 31 2c 78 32 2c 5c 22 78 33 20 5c  ut "x1,x2,\"x3 \
1f50: 22 5c 22 5c 6e 64 61 74 61 5c 22 5c 22 20 33 5c  "\"\ndata\"\" 3\
1f60: 22 2c 78 34 22 0a 20 20 63 6c 6f 73 65 20 24 6f  ",x4".  close $o
1f70: 75 74 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65  ut.  forcedelete
1f80: 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68   test.db.  catch
1f90: 63 6d 64 20 74 65 73 74 2e 64 62 20 7b 2e 6d 6f  cmd test.db {.mo
1fa0: 64 65 20 63 73 76 0a 20 20 20 20 43 52 45 41 54  de csv.    CREAT
1fb0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
1fc0: 2c 64 29 3b 0a 2e 69 6d 70 6f 72 74 20 73 68 65  ,d);..import she
1fd0: 6c 6c 35 2e 63 73 76 20 74 31 0a 20 20 7d 0a 20  ll5.csv t1.  }. 
1fe0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
1ff0: 2e 64 62 0a 20 20 64 62 20 65 76 61 6c 20 7b 53  .db.  db eval {S
2000: 45 4c 45 43 54 20 68 65 78 28 63 29 20 46 52 4f  ELECT hex(c) FRO
2010: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 72 6f  M t1 ORDER BY ro
2020: 77 69 64 7d 0a 7d 20 7b 36 33 36 46 36 43 37 35  wid}.} {636F6C75
2030: 36 44 36 45 33 33 20 37 38 33 33 32 30 32 32 30  6D6E33 783320220
2040: 44 30 41 36 34 36 31 37 34 36 31 32 32 32 30 33  D0A6461746122203
2050: 33 20 37 38 33 33 32 30 32 32 30 41 36 34 36 31  3 783320220A6461
2060: 37 34 36 31 32 32 32 30 33 33 7d 0a 0a 23 20 42  7461222033}..# B
2070: 6c 61 6e 6b 20 6c 61 73 74 20 63 6f 6c 75 6d 6e  lank last column
2080: 20 77 69 74 68 20 5c 72 5c 6e 20 6c 69 6e 65 20   with \r\n line 
2090: 65 6e 64 69 6e 67 73 2e 0a 64 6f 5f 74 65 73 74  endings..do_test
20a0: 20 73 68 65 6c 6c 35 2d 31 2e 31 31 20 7b 0a 20   shell5-1.11 {. 
20b0: 20 73 65 74 20 6f 75 74 20 5b 6f 70 65 6e 20 73   set out [open s
20c0: 68 65 6c 6c 35 2e 63 73 76 20 77 5d 0a 20 20 66  hell5.csv w].  f
20d0: 63 6f 6e 66 69 67 75 72 65 20 24 6f 75 74 20 2d  configure $out -
20e0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61  translation bina
20f0: 72 79 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22  ry.  puts $out "
2100: 63 6f 6c 75 6d 6e 31 2c 63 6f 6c 75 6d 6e 32 2c  column1,column2,
2110: 63 6f 6c 75 6d 6e 33 5c 72 22 0a 20 20 70 75 74  column3\r".  put
2120: 73 20 24 6f 75 74 20 22 61 2c 62 2c 20 5c 72 22  s $out "a,b, \r"
2130: 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22 78 2c  .  puts $out "x,
2140: 79 2c 5c 72 22 0a 20 20 70 75 74 73 20 24 6f 75  y,\r".  puts $ou
2150: 74 20 22 70 2c 71 2c 72 5c 72 22 0a 20 20 63 6c  t "p,q,r\r".  cl
2160: 6f 73 65 20 24 6f 75 74 0a 20 20 63 61 74 63 68  ose $out.  catch
2170: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 66 6f   {db close}.  fo
2180: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
2190: 62 0a 20 20 63 61 74 63 68 63 6d 64 20 74 65 73  b.  catchcmd tes
21a0: 74 2e 64 62 20 7b 2e 6d 6f 64 65 20 63 73 76 0a  t.db {.mode csv.
21b0: 2e 69 6d 70 6f 72 74 20 73 68 65 6c 6c 35 2e 63  .import shell5.c
21c0: 73 76 20 74 31 0a 20 20 7d 0a 20 20 73 71 6c 69  sv t1.  }.  sqli
21d0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
21e0: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
21f0: 20 2a 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 7d   *, '|' FROM t1}
2200: 0a 7d 20 7b 61 20 62 20 7b 20 7d 20 7c 20 78 20  .} {a b { } | x 
2210: 79 20 7b 7d 20 7c 20 70 20 71 20 72 20 7c 7d 0a  y {} | p q r |}.
2220: 64 62 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d  db close..#-----
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 0a 72 65 73 65 74  -------.# .reset
2280: 5f 64 62 0a 73 71 6c 69 74 65 33 20 64 62 20 74  _db.sqlite3 db t
2290: 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 73  est.db.do_test s
22a0: 68 65 6c 6c 35 2d 32 2e 31 20 7b 0a 20 20 73 65  hell5-2.1 {.  se
22b0: 74 20 66 64 20 5b 6f 70 65 6e 20 73 68 65 6c 6c  t fd [open shell
22c0: 35 2e 63 73 76 20 77 5d 0a 20 20 70 75 74 73 20  5.csv w].  puts 
22d0: 24 66 64 20 22 2c 68 65 6c 6c 6f 22 0a 20 20 63  $fd ",hello".  c
22e0: 6c 6f 73 65 20 24 66 64 0a 20 20 63 61 74 63 68  lose $fd.  catch
22f0: 63 6d 64 20 74 65 73 74 2e 64 62 20 5b 73 74 72  cmd test.db [str
2300: 69 6e 67 20 74 72 69 6d 20 7b 0a 2e 6d 6f 64 65  ing trim {..mode
2310: 20 63 73 76 0a 43 52 45 41 54 45 20 54 41 42 4c   csv.CREATE TABL
2320: 45 20 74 31 28 61 2c 20 62 29 3b 0a 2e 69 6d 70  E t1(a, b);..imp
2330: 6f 72 74 20 73 68 65 6c 6c 35 2e 63 73 76 20 74  ort shell5.csv t
2340: 31 0a 20 20 7d 5d 0a 20 20 64 62 20 65 76 61 6c  1.  }].  db eval
2350: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
2360: 20 74 31 20 7d 0a 7d 20 7b 7b 7d 20 68 65 6c 6c   t1 }.} {{} hell
2370: 6f 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 68 65 6c  o}..do_test shel
2380: 6c 35 2d 32 2e 32 20 7b 0a 20 20 73 65 74 20 66  l5-2.2 {.  set f
2390: 64 20 5b 6f 70 65 6e 20 73 68 65 6c 6c 35 2e 63  d [open shell5.c
23a0: 73 76 20 77 5d 0a 20 20 70 75 74 73 20 24 66 64  sv w].  puts $fd
23b0: 20 7b 22 22 2c 68 65 6c 6c 6f 7d 0a 20 20 63 6c   {"",hello}.  cl
23c0: 6f 73 65 20 24 66 64 0a 20 20 63 61 74 63 68 63  ose $fd.  catchc
23d0: 6d 64 20 74 65 73 74 2e 64 62 20 5b 73 74 72 69  md test.db [stri
23e0: 6e 67 20 74 72 69 6d 20 7b 0a 2e 6d 6f 64 65 20  ng trim {..mode 
23f0: 63 73 76 0a 43 52 45 41 54 45 20 54 41 42 4c 45  csv.CREATE TABLE
2400: 20 74 32 28 61 2c 20 62 29 3b 0a 2e 69 6d 70 6f   t2(a, b);..impo
2410: 72 74 20 73 68 65 6c 6c 35 2e 63 73 76 20 74 32  rt shell5.csv t2
2420: 0a 20 20 7d 5d 0a 20 20 64 62 20 65 76 61 6c 20  .  }].  db eval 
2430: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
2440: 74 32 20 7d 0a 7d 20 7b 7b 7d 20 68 65 6c 6c 6f  t2 }.} {{} hello
2450: 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 68 65 6c 6c  }..do_test shell
2460: 35 2d 32 2e 33 20 7b 0a 20 20 73 65 74 20 66 64  5-2.3 {.  set fd
2470: 20 5b 6f 70 65 6e 20 73 68 65 6c 6c 35 2e 63 73   [open shell5.cs
2480: 76 20 77 5d 0a 20 20 70 75 74 73 20 24 66 64 20  v w].  puts $fd 
2490: 7b 22 78 22 22 79 22 2c 68 65 6c 6c 6f 7d 0a 20  {"x""y",hello}. 
24a0: 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 63 61 74   close $fd.  cat
24b0: 63 68 63 6d 64 20 74 65 73 74 2e 64 62 20 5b 73  chcmd test.db [s
24c0: 74 72 69 6e 67 20 74 72 69 6d 20 7b 0a 2e 6d 6f  tring trim {..mo
24d0: 64 65 20 63 73 76 0a 43 52 45 41 54 45 20 54 41  de csv.CREATE TA
24e0: 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 2e 69  BLE t3(a, b);..i
24f0: 6d 70 6f 72 74 20 73 68 65 6c 6c 35 2e 63 73 76  mport shell5.csv
2500: 20 74 33 0a 20 20 7d 5d 0a 20 20 64 62 20 65 76   t3.  }].  db ev
2510: 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  al { SELECT * FR
2520: 4f 4d 20 74 33 20 7d 0a 7d 20 7b 78 5c 22 79 20  OM t3 }.} {x\"y 
2530: 68 65 6c 6c 6f 7d 0a 0a 64 6f 5f 74 65 73 74 20  hello}..do_test 
2540: 73 68 65 6c 6c 35 2d 32 2e 34 20 7b 0a 20 20 73  shell5-2.4 {.  s
2550: 65 74 20 66 64 20 5b 6f 70 65 6e 20 73 68 65 6c  et fd [open shel
2560: 6c 35 2e 63 73 76 20 77 5d 0a 20 20 70 75 74 73  l5.csv w].  puts
2570: 20 24 66 64 20 7b 22 78 79 22 22 22 2c 68 65 6c   $fd {"xy""",hel
2580: 6c 6f 7d 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  lo}.  close $fd.
2590: 20 20 63 61 74 63 68 63 6d 64 20 74 65 73 74 2e    catchcmd test.
25a0: 64 62 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  db [string trim 
25b0: 7b 0a 2e 6d 6f 64 65 20 63 73 76 0a 43 52 45 41  {..mode csv.CREA
25c0: 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62  TE TABLE t4(a, b
25d0: 29 3b 0a 2e 69 6d 70 6f 72 74 20 73 68 65 6c 6c  );..import shell
25e0: 35 2e 63 73 76 20 74 34 0a 20 20 7d 5d 0a 20 20  5.csv t4.  }].  
25f0: 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54  db eval { SELECT
2600: 20 2a 20 46 52 4f 4d 20 74 34 20 7d 0a 7d 20 7b   * FROM t4 }.} {
2610: 78 79 5c 22 20 68 65 6c 6c 6f 7d 0a 0a 64 6f 5f  xy\" hello}..do_
2620: 74 65 73 74 20 73 68 65 6c 6c 35 2d 32 2e 35 20  test shell5-2.5 
2630: 7b 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  {.  set fd [open
2640: 20 73 68 65 6c 6c 35 2e 63 73 76 20 77 5d 0a 20   shell5.csv w]. 
2650: 20 70 75 74 73 20 24 66 64 20 7b 22 6f 6e 65 22   puts $fd {"one"
2660: 2c 22 32 22 7d 0a 20 20 70 75 74 73 20 24 66 64  ,"2"}.  puts $fd
2670: 20 7b 7d 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a   {}.  close $fd.
2680: 20 20 63 61 74 63 68 63 6d 64 20 74 65 73 74 2e    catchcmd test.
2690: 64 62 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  db [string trim 
26a0: 7b 0a 2e 6d 6f 64 65 20 63 73 76 0a 43 52 45 41  {..mode csv.CREA
26b0: 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62  TE TABLE t4(a, b
26c0: 29 3b 0a 2e 69 6d 70 6f 72 74 20 73 68 65 6c 6c  );..import shell
26d0: 35 2e 63 73 76 20 74 34 0a 20 20 7d 5d 0a 20 20  5.csv t4.  }].  
26e0: 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54  db eval { SELECT
26f0: 20 2a 20 46 52 4f 4d 20 74 34 20 7d 0a 7d 20 7b   * FROM t4 }.} {
2700: 78 79 5c 22 20 68 65 6c 6c 6f 20 6f 6e 65 20 32  xy\" hello one 2
2710: 20 7b 7d 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   {} {}}..#------
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66  ------.# Tests f
2770: 6f 72 20 74 68 65 20 73 68 65 6c 6c 20 22 61 73  or the shell "as
2780: 63 69 69 22 20 69 6d 70 6f 72 74 2f 65 78 70 6f  cii" import/expo
2790: 72 74 20 6d 6f 64 65 2e 0a 23 0a 64 6f 5f 74 65  rt mode..#.do_te
27a0: 73 74 20 73 68 65 6c 6c 35 2d 33 2e 31 20 7b 0a  st shell5-3.1 {.
27b0: 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 73    set fd [open s
27c0: 68 65 6c 6c 35 2e 63 73 76 20 77 5d 0a 20 20 66  hell5.csv w].  f
27d0: 63 6f 6e 66 69 67 75 72 65 20 24 66 64 20 2d 65  configure $fd -e
27e0: 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 20 2d  ncoding binary -
27f0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61  translation bina
2800: 72 79 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77  ry.  puts -nonew
2810: 6c 69 6e 65 20 24 66 64 20 22 5c 22 74 65 73 74  line $fd "\"test
2820: 20 31 5c 22 5c 78 31 46 2c 74 65 73 74 20 32 5c   1\"\x1F,test 2\
2830: 72 5c 6e 5c 78 31 45 22 0a 20 20 70 75 74 73 20  r\n\x1E".  puts 
2840: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 22  -nonewline $fd "
2850: 74 65 73 74 20 33 5c 78 31 46 74 65 73 74 20 34  test 3\x1Ftest 4
2860: 5c 6e 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  \n".  close $fd.
2870: 20 20 63 61 74 63 68 63 6d 64 20 74 65 73 74 2e    catchcmd test.
2880: 64 62 20 7b 0a 2e 6d 6f 64 65 20 61 73 63 69 69  db {..mode ascii
2890: 0a 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35  .CREATE TABLE t5
28a0: 28 61 2c 20 62 29 3b 0a 2e 69 6d 70 6f 72 74 20  (a, b);..import 
28b0: 73 68 65 6c 6c 35 2e 63 73 76 20 74 35 0a 20 20  shell5.csv t5.  
28c0: 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45  }.  db eval { SE
28d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 20 7d  LECT * FROM t5 }
28e0: 0a 7d 20 22 5c 7b 5c 22 74 65 73 74 20 31 5c 22  .} "\{\"test 1\"
28f0: 7d 20 5c 7b 2c 74 65 73 74 20 32 5c 72 5c 6e 5c  } \{,test 2\r\n\
2900: 7d 20 5c 7b 74 65 73 74 20 33 5c 7d 20 5c 7b 74  } \{test 3\} \{t
2910: 65 73 74 20 34 5c 6e 5c 7d 22 0a 0a 64 6f 5f 74  est 4\n\}"..do_t
2920: 65 73 74 20 73 68 65 6c 6c 35 2d 33 2e 32 20 7b  est shell5-3.2 {
2930: 0a 20 20 73 65 74 20 78 20 5b 63 61 74 63 68 63  .  set x [catchc
2940: 6d 64 20 74 65 73 74 2e 64 62 20 7b 0a 2e 6d 6f  md test.db {..mo
2950: 64 65 20 61 73 63 69 69 0a 53 45 4c 45 43 54 20  de ascii.SELECT 
2960: 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 7d 5d 0a  * FROM t5;.  }].
2970: 20 20 23 20 48 61 6e 64 6c 65 20 70 6c 61 74 66    # Handle platf
2980: 6f 72 6d 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20  orm end-of-line 
2990: 64 69 66 66 65 72 65 6e 63 65 73 0a 20 20 72 65  differences.  re
29a0: 67 73 75 62 20 2d 61 6c 6c 20 7b 5b 5c 6e 5c 72  gsub -all {[\n\r
29b0: 5d 3f 5c 6e 7d 20 24 78 20 3c 45 4f 4c 3e 20 78  ]?\n} $x <EOL> x
29c0: 0a 20 20 73 65 74 20 78 0a 7d 20 22 30 20 5c 7b  .  set x.} "0 \{
29d0: 5c 22 74 65 73 74 20 31 5c 22 5c 78 31 46 2c 74  \"test 1\"\x1F,t
29e0: 65 73 74 20 32 3c 45 4f 4c 3e 5c 78 31 45 74 65  est 2<EOL>\x1Ete
29f0: 73 74 20 33 5c 78 31 46 74 65 73 74 20 34 3c 45  st 3\x1Ftest 4<E
2a00: 4f 4c 3e 5c 78 31 45 5c 7d 22 0a 0a 64 6f 5f 74  OL>\x1E\}"..do_t
2a10: 65 73 74 20 73 68 65 6c 6c 35 2d 34 2e 31 20 7b  est shell5-4.1 {
2a20: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 73  .  forcedelete s
2a30: 68 65 6c 6c 35 2e 63 73 76 0a 20 20 73 65 74 20  hell5.csv.  set 
2a40: 66 64 20 5b 6f 70 65 6e 20 73 68 65 6c 6c 35 2e  fd [open shell5.
2a50: 63 73 76 20 77 5d 0a 20 20 70 75 74 73 20 24 66  csv w].  puts $f
2a60: 64 20 22 31 2c 32 2c 33 22 0a 20 20 70 75 74 73  d "1,2,3".  puts
2a70: 20 24 66 64 20 22 34 2c 35 22 0a 20 20 70 75 74   $fd "4,5".  put
2a80: 73 20 24 66 64 20 22 36 2c 37 2c 38 22 0a 20 20  s $fd "6,7,8".  
2a90: 63 6c 6f 73 65 20 24 66 64 0a 20 20 63 61 74 63  close $fd.  catc
2aa0: 68 63 6d 64 20 74 65 73 74 2e 64 62 20 5b 73 74  hcmd test.db [st
2ab0: 72 69 6e 67 20 74 72 69 6d 20 7b 0a 2e 6d 6f 64  ring trim {..mod
2ac0: 65 20 63 73 76 0a 43 52 45 41 54 45 20 54 41 42  e csv.CREATE TAB
2ad0: 4c 45 20 74 36 28 61 2c 20 62 2c 20 63 29 3b 0a  LE t6(a, b, c);.
2ae0: 2e 69 6d 70 6f 72 74 20 73 68 65 6c 6c 35 2e 63  .import shell5.c
2af0: 73 76 20 74 36 0a 20 20 7d 5d 0a 20 20 64 62 20  sv t6.  }].  db 
2b00: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
2b10: 46 52 4f 4d 20 74 36 20 4f 52 44 45 52 20 42 59  FROM t6 ORDER BY
2b20: 20 61 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20   a }.} {1 2 3 4 
2b30: 35 20 7b 7d 20 36 20 37 20 38 7d 0a 0a 64 6f 5f  5 {} 6 7 8}..do_
2b40: 74 65 73 74 20 73 68 65 6c 6c 35 2d 34 2e 32 20  test shell5-4.2 
2b50: 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  {.  forcedelete 
2b60: 73 68 65 6c 6c 35 2e 63 73 76 0a 20 20 73 65 74  shell5.csv.  set
2b70: 20 66 64 20 5b 6f 70 65 6e 20 73 68 65 6c 6c 35   fd [open shell5
2b80: 2e 63 73 76 20 77 5d 0a 20 20 70 75 74 73 20 24  .csv w].  puts $
2b90: 66 64 20 22 31 2c 32 2c 33 22 0a 20 20 70 75 74  fd "1,2,3".  put
2ba0: 73 20 24 66 64 20 22 34 2c 35 22 0a 20 20 70 75  s $fd "4,5".  pu
2bb0: 74 73 20 24 66 64 20 22 36 2c 37 2c 38 2c 39 22  ts $fd "6,7,8,9"
2bc0: 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 63  .  close $fd.  c
2bd0: 61 74 63 68 63 6d 64 20 74 65 73 74 2e 64 62 20  atchcmd test.db 
2be0: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 7b 0a 2e  [string trim {..
2bf0: 6d 6f 64 65 20 63 73 76 0a 43 52 45 41 54 45 20  mode csv.CREATE 
2c00: 54 41 42 4c 45 20 74 37 28 61 2c 20 62 2c 20 63  TABLE t7(a, b, c
2c10: 29 3b 0a 2e 69 6d 70 6f 72 74 20 73 68 65 6c 6c  );..import shell
2c20: 35 2e 63 73 76 20 74 37 0a 20 20 7d 5d 0a 20 20  5.csv t7.  }].  
2c30: 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54  db eval { SELECT
2c40: 20 2a 20 46 52 4f 4d 20 74 37 20 4f 52 44 45 52   * FROM t7 ORDER
2c50: 20 42 59 20 61 20 7d 0a 7d 20 7b 31 20 32 20 33   BY a }.} {1 2 3
2c60: 20 34 20 35 20 7b 7d 20 36 20 37 20 38 7d 0a 0a   4 5 {} 6 7 8}..
2c70: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.