/ Hex Artifact Content
Login

Artifact c860847f1bd66175ef7cb724326a1700e0295820:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  us of this file 
01c0: 69 73 20 74 65 73 74 69 6e 67 20 74 68 65 20 43  is testing the C
01d0: 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23  OPY statement..#
01e0: 0a 23 20 24 49 64 3a 20 63 6f 70 79 2e 74 65 73  .# $Id: copy.tes
01f0: 74 2c 76 20 31 2e 31 34 20 32 30 30 33 2f 30 36  t,v 1.14 2003/06
0200: 2f 30 32 20 32 32 3a 35 30 3a 32 37 20 64 72 68  /02 22:50:27 drh
0210: 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74   Exp $..set test
0220: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0230: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0240: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
0250: 2e 74 63 6c 0a 0a 23 20 43 72 65 61 74 65 20 61  .tcl..# Create a
0260: 20 66 69 6c 65 20 6f 66 20 64 61 74 61 20 66 72   file of data fr
0270: 6f 6d 20 77 68 69 63 68 20 74 6f 20 63 6f 70 79  om which to copy
0280: 2e 0a 23 0a 73 65 74 20 66 20 5b 6f 70 65 6e 20  ..#.set f [open 
0290: 64 61 74 61 31 2e 74 78 74 20 77 5d 0a 70 75 74  data1.txt w].put
02a0: 73 20 24 66 20 22 31 31 5c 74 32 32 5c 74 33 33  s $f "11\t22\t33
02b0: 22 0a 70 75 74 73 20 24 66 20 22 32 32 5c 74 33  ".puts $f "22\t3
02c0: 33 5c 74 31 31 22 0a 63 6c 6f 73 65 20 24 66 0a  3\t11".close $f.
02d0: 73 65 74 20 66 20 5b 6f 70 65 6e 20 64 61 74 61  set f [open data
02e0: 32 2e 74 78 74 20 77 5d 0a 70 75 74 73 20 24 66  2.txt w].puts $f
02f0: 20 22 31 31 5c 74 32 32 5c 74 33 33 22 0a 70 75   "11\t22\t33".pu
0300: 74 73 20 24 66 20 22 5c 5c 2e 22 0a 70 75 74 73  ts $f "\\.".puts
0310: 20 24 66 20 22 32 32 5c 74 33 33 5c 74 31 31 22   $f "22\t33\t11"
0320: 0a 63 6c 6f 73 65 20 24 66 0a 73 65 74 20 66 20  .close $f.set f 
0330: 5b 6f 70 65 6e 20 64 61 74 61 33 2e 74 78 74 20  [open data3.txt 
0340: 77 5d 0a 70 75 74 73 20 24 66 20 22 31 31 5c 74  w].puts $f "11\t
0350: 32 32 5c 74 33 33 5c 74 34 34 22 0a 70 75 74 73  22\t33\t44".puts
0360: 20 24 66 20 22 32 32 5c 74 33 33 5c 74 31 31 22   $f "22\t33\t11"
0370: 0a 63 6c 6f 73 65 20 24 66 0a 73 65 74 20 66 20  .close $f.set f 
0380: 5b 6f 70 65 6e 20 64 61 74 61 34 2e 74 78 74 20  [open data4.txt 
0390: 77 5d 0a 70 75 74 73 20 24 66 20 22 31 31 20 7c  w].puts $f "11 |
03a0: 20 32 32 20 7c 20 33 33 22 0a 70 75 74 73 20 24   22 | 33".puts $
03b0: 66 20 22 32 32 20 7c 20 33 33 20 7c 20 31 31 22  f "22 | 33 | 11"
03c0: 0a 63 6c 6f 73 65 20 24 66 0a 73 65 74 20 66 20  .close $f.set f 
03d0: 5b 6f 70 65 6e 20 64 61 74 61 35 2e 74 78 74 20  [open data5.txt 
03e0: 77 5d 0a 70 75 74 73 20 24 66 20 22 31 31 7c 32  w].puts $f "11|2
03f0: 32 7c 33 33 22 0a 70 75 74 73 20 24 66 20 22 32  2|33".puts $f "2
0400: 32 7c 33 33 7c 31 31 22 0a 63 6c 6f 73 65 20 24  2|33|11".close $
0410: 66 0a 73 65 74 20 66 20 5b 6f 70 65 6e 20 64 61  f.set f [open da
0420: 74 61 58 2e 74 78 74 20 77 5d 0a 70 75 74 73 20  taX.txt w].puts 
0430: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 20 22 31  -nonewline $f "1
0440: 31 7c 32 32 7c 33 33 5c 72 22 0a 70 75 74 73 20  1|22|33\r".puts 
0450: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 20 22 32  -nonewline $f "2
0460: 32 7c 33 33 7c 34 34 5c 72 5c 6e 22 0a 70 75 74  2|33|44\r\n".put
0470: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 20  s -nonewline $f 
0480: 22 33 33 7c 34 34 7c 35 35 5c 6e 22 0a 70 75 74  "33|44|55\n".put
0490: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 20  s -nonewline $f 
04a0: 22 34 34 7c 35 35 7c 36 36 5c 72 22 0a 70 75 74  "44|55|66\r".put
04b0: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 20  s -nonewline $f 
04c0: 22 35 35 7c 36 36 7c 37 37 5c 72 5c 6e 22 0a 70  "55|66|77\r\n".p
04d0: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
04e0: 66 20 22 36 36 7c 37 37 7c 38 38 5c 6e 22 0a 63  f "66|77|88\n".c
04f0: 6c 6f 73 65 20 24 66 0a 0a 23 20 54 72 79 20 74  lose $f..# Try t
0500: 6f 20 43 4f 50 59 20 69 6e 74 6f 20 61 20 6e 6f  o COPY into a no
0510: 6e 2d 65 78 69 73 74 61 6e 74 20 74 61 62 6c 65  n-existant table
0520: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 63 6f 70 79  ..#.do_test copy
0530: 2d 31 2e 31 20 7b 0a 20 20 73 65 74 20 76 20 5b  -1.1 {.  set v [
0540: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
0550: 43 4f 50 59 20 74 65 73 74 31 20 46 52 4f 4d 20  COPY test1 FROM 
0560: 27 64 61 74 61 31 2e 74 78 74 27 7d 7d 20 6d 73  'data1.txt'}} ms
0570: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24  g].  lappend v $
0580: 6d 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  msg.} {1 {no suc
0590: 68 20 74 61 62 6c 65 3a 20 74 65 73 74 31 7d 7d  h table: test1}}
05a0: 0a 0a 23 20 54 72 79 20 74 6f 20 69 6e 73 65 72  ..# Try to inser
05b0: 74 20 69 6e 74 6f 20 73 71 6c 69 74 65 5f 6d 61  t into sqlite_ma
05c0: 73 74 65 72 0a 23 0a 64 6f 5f 74 65 73 74 20 63  ster.#.do_test c
05d0: 6f 70 79 2d 31 2e 32 20 7b 0a 20 20 73 65 74 20  opy-1.2 {.  set 
05e0: 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  v [catch {execsq
05f0: 6c 20 7b 43 4f 50 59 20 73 71 6c 69 74 65 5f 6d  l {COPY sqlite_m
0600: 61 73 74 65 72 20 46 52 4f 4d 20 27 64 61 74 61  aster FROM 'data
0610: 32 2e 74 78 74 27 7d 7d 20 6d 73 67 5d 0a 20 20  2.txt'}} msg].  
0620: 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d  lappend v $msg.}
0630: 20 7b 31 20 7b 74 61 62 6c 65 20 73 71 6c 69 74   {1 {table sqlit
0640: 65 5f 6d 61 73 74 65 72 20 6d 61 79 20 6e 6f 74  e_master may not
0650: 20 62 65 20 6d 6f 64 69 66 69 65 64 7d 7d 0a 0a   be modified}}..
0660: 23 20 44 6f 20 73 6f 6d 65 20 61 63 74 75 61 6c  # Do some actual
0670: 20 69 6e 73 65 72 74 73 0a 23 0a 64 6f 5f 74 65   inserts.#.do_te
0680: 73 74 20 63 6f 70 79 2d 31 2e 33 20 7b 0a 20 20  st copy-1.3 {.  
0690: 65 78 65 63 73 71 6c 20 7b 43 52 45 41 54 45 20  execsql {CREATE 
06a0: 54 41 42 4c 45 20 74 65 73 74 31 28 6f 6e 65 20  TABLE test1(one 
06b0: 69 6e 74 2c 20 74 77 6f 20 69 6e 74 2c 20 74 68  int, two int, th
06c0: 72 65 65 20 69 6e 74 29 7d 0a 20 20 65 78 65 63  ree int)}.  exec
06d0: 73 71 6c 20 7b 43 4f 50 59 20 74 65 73 74 31 20  sql {COPY test1 
06e0: 46 52 4f 4d 20 27 64 61 74 61 31 2e 74 78 74 27  FROM 'data1.txt'
06f0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  }.  execsql {SEL
0700: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 73 74 31  ECT * FROM test1
0710: 20 4f 52 44 45 52 20 42 59 20 6f 6e 65 7d 0a 7d   ORDER BY one}.}
0720: 20 7b 31 31 20 32 32 20 33 33 20 32 32 20 33 33   {11 22 33 22 33
0730: 20 31 31 7d 0a 0a 23 20 4d 61 6b 65 20 73 75 72   11}..# Make sur
0740: 65 20 69 6e 70 75 74 20 74 65 72 6d 69 6e 61 74  e input terminat
0750: 65 73 20 61 74 20 5c 2e 0a 23 0a 64 6f 5f 74 65  es at \..#.do_te
0760: 73 74 20 63 6f 70 79 2d 31 2e 34 20 7b 0a 20 20  st copy-1.4 {.  
0770: 65 78 65 63 73 71 6c 20 7b 44 45 4c 45 54 45 20  execsql {DELETE 
0780: 46 52 4f 4d 20 74 65 73 74 31 7d 0a 20 20 65 78  FROM test1}.  ex
0790: 65 63 73 71 6c 20 7b 43 4f 50 59 20 74 65 73 74  ecsql {COPY test
07a0: 31 20 46 52 4f 4d 20 27 64 61 74 61 32 2e 74 78  1 FROM 'data2.tx
07b0: 74 27 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  t'}.  execsql {S
07c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 73  ELECT * FROM tes
07d0: 74 31 20 4f 52 44 45 52 20 42 59 20 6f 6e 65 7d  t1 ORDER BY one}
07e0: 0a 7d 20 7b 31 31 20 32 32 20 33 33 7d 0a 0a 23  .} {11 22 33}..#
07f0: 20 54 65 73 74 20 6f 75 74 20 74 68 65 20 55 53   Test out the US
0800: 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20 63  ING DELIMITERS c
0810: 6c 61 75 73 65 0a 23 0a 64 6f 5f 74 65 73 74 20  lause.#.do_test 
0820: 63 6f 70 79 2d 31 2e 35 20 7b 0a 20 20 65 78 65  copy-1.5 {.  exe
0830: 63 73 71 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f  csql {DELETE FRO
0840: 4d 20 74 65 73 74 31 7d 0a 20 20 65 78 65 63 73  M test1}.  execs
0850: 71 6c 20 7b 43 4f 50 59 20 74 65 73 74 31 20 46  ql {COPY test1 F
0860: 52 4f 4d 20 27 64 61 74 61 34 2e 74 78 74 27 20  ROM 'data4.txt' 
0870: 55 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53  USING DELIMITERS
0880: 20 27 20 7c 20 27 7d 0a 20 20 65 78 65 63 73 71   ' | '}.  execsq
0890: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
08a0: 20 74 65 73 74 31 20 4f 52 44 45 52 20 42 59 20   test1 ORDER BY 
08b0: 6f 6e 65 7d 0a 7d 20 7b 31 31 20 32 32 20 33 33  one}.} {11 22 33
08c0: 20 32 32 20 33 33 20 31 31 7d 0a 64 6f 5f 74 65   22 33 11}.do_te
08d0: 73 74 20 63 6f 70 79 2d 31 2e 36 20 7b 0a 20 20  st copy-1.6 {.  
08e0: 65 78 65 63 73 71 6c 20 7b 44 45 4c 45 54 45 20  execsql {DELETE 
08f0: 46 52 4f 4d 20 74 65 73 74 31 7d 0a 20 20 65 78  FROM test1}.  ex
0900: 65 63 73 71 6c 20 7b 43 4f 50 59 20 74 65 73 74  ecsql {COPY test
0910: 31 20 46 52 4f 4d 20 27 64 61 74 61 35 2e 74 78  1 FROM 'data5.tx
0920: 74 27 20 55 53 49 4e 47 20 44 45 4c 49 4d 49 54  t' USING DELIMIT
0930: 45 52 53 20 27 7c 27 7d 0a 20 20 65 78 65 63 73  ERS '|'}.  execs
0940: 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql {SELECT * FRO
0950: 4d 20 74 65 73 74 31 20 4f 52 44 45 52 20 42 59  M test1 ORDER BY
0960: 20 6f 6e 65 7d 0a 7d 20 7b 31 31 20 32 32 20 33   one}.} {11 22 3
0970: 33 20 32 32 20 33 33 20 31 31 7d 0a 64 6f 5f 74  3 22 33 11}.do_t
0980: 65 73 74 20 63 6f 70 79 2d 31 2e 37 20 7b 0a 20  est copy-1.7 {. 
0990: 20 65 78 65 63 73 71 6c 20 7b 44 45 4c 45 54 45   execsql {DELETE
09a0: 20 46 52 4f 4d 20 74 65 73 74 31 7d 0a 20 20 65   FROM test1}.  e
09b0: 78 65 63 73 71 6c 20 7b 43 4f 50 59 20 74 65 73  xecsql {COPY tes
09c0: 74 31 20 46 52 4f 4d 20 27 64 61 74 61 34 2e 74  t1 FROM 'data4.t
09d0: 78 74 27 20 55 53 49 4e 47 20 44 45 4c 49 4d 49  xt' USING DELIMI
09e0: 54 45 52 53 20 27 7c 27 7d 0a 20 20 65 78 65 63  TERS '|'}.  exec
09f0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
0a00: 4f 4d 20 74 65 73 74 31 20 4f 52 44 45 52 20 42  OM test1 ORDER B
0a10: 59 20 6f 6e 65 7d 0a 7d 20 7b 7b 31 31 20 7d 20  Y one}.} {{11 } 
0a20: 7b 20 32 32 20 7d 20 7b 20 33 33 7d 20 7b 32 32  { 22 } { 33} {22
0a30: 20 7d 20 7b 20 33 33 20 7d 20 7b 20 31 31 7d 7d   } { 33 } { 11}}
0a40: 0a 0a 23 20 54 72 79 20 63 6f 70 79 69 6e 67 20  ..# Try copying 
0a50: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 74 68 61  into a table tha
0a60: 74 20 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  t has one or mor
0a70: 65 20 69 6e 64 69 63 65 73 2e 0a 23 0a 64 6f 5f  e indices..#.do_
0a80: 74 65 73 74 20 63 6f 70 79 2d 31 2e 38 20 7b 0a  test copy-1.8 {.
0a90: 20 20 65 78 65 63 73 71 6c 20 7b 44 45 4c 45 54    execsql {DELET
0aa0: 45 20 46 52 4f 4d 20 74 65 73 74 31 7d 0a 20 20  E FROM test1}.  
0ab0: 65 78 65 63 73 71 6c 20 7b 43 52 45 41 54 45 20  execsql {CREATE 
0ac0: 49 4e 44 45 58 20 69 6e 64 65 78 31 20 4f 4e 20  INDEX index1 ON 
0ad0: 74 65 73 74 31 28 6f 6e 65 29 7d 0a 20 20 65 78  test1(one)}.  ex
0ae0: 65 63 73 71 6c 20 7b 43 52 45 41 54 45 20 49 4e  ecsql {CREATE IN
0af0: 44 45 58 20 69 6e 64 65 78 32 20 4f 4e 20 74 65  DEX index2 ON te
0b00: 73 74 31 28 74 77 6f 29 7d 0a 20 20 65 78 65 63  st1(two)}.  exec
0b10: 73 71 6c 20 7b 43 52 45 41 54 45 20 49 4e 44 45  sql {CREATE INDE
0b20: 58 20 69 6e 64 65 78 33 20 4f 4e 20 74 65 73 74  X index3 ON test
0b30: 31 28 74 68 72 65 65 29 7d 0a 20 20 65 78 65 63  1(three)}.  exec
0b40: 73 71 6c 20 7b 43 4f 50 59 20 74 65 73 74 31 20  sql {COPY test1 
0b50: 66 72 6f 6d 20 27 64 61 74 61 31 2e 74 78 74 27  from 'data1.txt'
0b60: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  }.  execsql {SEL
0b70: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 73 74 31  ECT * FROM test1
0b80: 20 57 48 45 52 45 20 6f 6e 65 3d 31 31 7d 0a 7d   WHERE one=11}.}
0b90: 20 7b 31 31 20 32 32 20 33 33 7d 0a 64 6f 5f 74   {11 22 33}.do_t
0ba0: 65 73 74 20 63 6f 70 79 2d 31 2e 38 62 20 7b 0a  est copy-1.8b {.
0bb0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
0bc0: 54 20 2a 20 46 52 4f 4d 20 74 65 73 74 31 20 57  T * FROM test1 W
0bd0: 48 45 52 45 20 6f 6e 65 3d 32 32 7d 0a 7d 20 7b  HERE one=22}.} {
0be0: 32 32 20 33 33 20 31 31 7d 0a 64 6f 5f 74 65 73  22 33 11}.do_tes
0bf0: 74 20 63 6f 70 79 2d 31 2e 38 63 20 7b 0a 20 20  t copy-1.8c {.  
0c00: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0c10: 2a 20 46 52 4f 4d 20 74 65 73 74 31 20 57 48 45  * FROM test1 WHE
0c20: 52 45 20 74 77 6f 3d 32 32 7d 0a 7d 20 7b 31 31  RE two=22}.} {11
0c30: 20 32 32 20 33 33 7d 0a 64 6f 5f 74 65 73 74 20   22 33}.do_test 
0c40: 63 6f 70 79 2d 31 2e 38 64 20 7b 0a 20 20 65 78  copy-1.8d {.  ex
0c50: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  ecsql {SELECT * 
0c60: 46 52 4f 4d 20 74 65 73 74 31 20 57 48 45 52 45  FROM test1 WHERE
0c70: 20 74 68 72 65 65 3d 31 31 7d 0a 7d 20 7b 32 32   three=11}.} {22
0c80: 20 33 33 20 31 31 7d 0a 0a 0a 23 20 54 72 79 20   33 11}...# Try 
0c90: 69 6e 73 65 72 74 69 6e 67 20 72 65 61 6c 6c 79  inserting really
0ca0: 20 6c 6f 6e 67 20 64 61 74 61 0a 23 0a 73 65 74   long data.#.set
0cb0: 20 78 20 7b 7d 0a 66 6f 72 20 7b 73 65 74 20 69   x {}.for {set i
0cc0: 20 30 7d 20 7b 24 69 3c 31 30 30 7d 20 7b 69 6e   0} {$i<100} {in
0cd0: 63 72 20 69 7d 20 7b 0a 20 20 61 70 70 65 6e 64  cr i} {.  append
0ce0: 20 78 20 22 28 24 69 29 2d 61 62 63 64 65 66 67   x "($i)-abcdefg
0cf0: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 79 76 77  hijklmnopqrstyvw
0d00: 78 79 7a 2d 41 42 43 44 45 46 47 48 49 4a 4b 4c  xyz-ABCDEFGHIJKL
0d10: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 2d 22  MNOPQRSTUVWXYZ-"
0d20: 0a 7d 0a 64 6f 5f 74 65 73 74 20 63 6f 70 79 2d  .}.do_test copy-
0d30: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
0d40: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65  {CREATE TABLE te
0d50: 73 74 32 28 61 20 69 6e 74 2c 20 78 20 74 65 78  st2(a int, x tex
0d60: 74 29 7d 0a 20 20 73 65 74 20 66 20 5b 6f 70 65  t)}.  set f [ope
0d70: 6e 20 64 61 74 61 32 31 2e 74 78 74 20 77 5d 0a  n data21.txt w].
0d80: 20 20 70 75 74 73 20 24 66 20 22 31 32 33 5c 74    puts $f "123\t
0d90: 24 78 22 0a 20 20 63 6c 6f 73 65 20 24 66 0a 20  $x".  close $f. 
0da0: 20 65 78 65 63 73 71 6c 20 7b 43 4f 50 59 20 74   execsql {COPY t
0db0: 65 73 74 32 20 46 52 4f 4d 20 27 64 61 74 61 32  est2 FROM 'data2
0dc0: 31 2e 74 78 74 27 7d 0a 20 20 65 78 65 63 73 71  1.txt'}.  execsq
0dd0: 6c 20 7b 53 45 4c 45 43 54 20 78 20 66 72 6f 6d  l {SELECT x from
0de0: 20 74 65 73 74 32 7d 0a 7d 20 24 78 0a 66 69 6c   test2}.} $x.fil
0df0: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
0e00: 64 61 74 61 32 31 2e 74 78 74 0a 0a 23 20 54 65  data21.txt..# Te
0e10: 73 74 20 74 68 65 20 65 73 63 61 70 65 20 63 68  st the escape ch
0e20: 61 72 61 63 74 65 72 20 6d 65 63 68 61 6e 69 73  aracter mechanis
0e30: 6d 0a 23 0a 64 6f 5f 74 65 73 74 20 63 6f 70 79  m.#.do_test copy
0e40: 2d 33 2e 31 20 7b 0a 20 20 73 65 74 20 66 64 20  -3.1 {.  set fd 
0e50: 5b 6f 70 65 6e 20 64 61 74 61 36 2e 74 78 74 20  [open data6.txt 
0e60: 77 5d 0a 20 20 70 75 74 73 20 24 66 64 20 22 68  w].  puts $fd "h
0e70: 65 6c 6c 6f 5c 5c 5c 74 77 6f 72 6c 64 5c 74 31  ello\\\tworld\t1
0e80: 22 0a 20 20 70 75 74 73 20 24 66 64 20 22 68 65  ".  puts $fd "he
0e90: 6c 6c 6f 5c 74 77 6f 72 6c 64 5c 5c 5c 74 32 22  llo\tworld\\\t2"
0ea0: 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 65  .  close $fd.  e
0eb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
0ec0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 74  ATE TABLE t1(a t
0ed0: 65 78 74 2c 20 62 20 74 65 78 74 29 3b 0a 20 20  ext, b text);.  
0ee0: 20 20 43 4f 50 59 20 74 31 20 46 52 4f 4d 20 27    COPY t1 FROM '
0ef0: 64 61 74 61 36 2e 74 78 74 27 3b 0a 20 20 20 20  data6.txt';.    
0f00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0f10: 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d   ORDER BY a;.  }
0f20: 0a 7d 20 7b 68 65 6c 6c 6f 20 7b 77 6f 72 6c 64  .} {hello {world
0f30: 09 32 7d 20 7b 68 65 6c 6c 6f 09 77 6f 72 6c 64  .2} {hello.world
0f40: 7d 20 31 7d 0a 64 6f 5f 74 65 73 74 20 63 6f 70  } 1}.do_test cop
0f50: 79 2d 33 2e 32 20 7b 0a 20 20 73 65 74 20 66 64  y-3.2 {.  set fd
0f60: 20 5b 6f 70 65 6e 20 64 61 74 61 36 2e 74 78 74   [open data6.txt
0f70: 20 77 5d 0a 20 20 70 75 74 73 20 24 66 64 20 22   w].  puts $fd "
0f80: 31 5c 74 68 65 6c 6c 6f 5c 5c 5c 6e 77 6f 72 6c  1\thello\\\nworl
0f90: 64 22 0a 20 20 70 75 74 73 20 24 66 64 20 22 32  d".  puts $fd "2
0fa0: 5c 74 68 65 6c 6c 6f 20 77 6f 72 6c 64 22 0a 20  \thello world". 
0fb0: 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 65 78 65   close $fd.  exe
0fc0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
0fd0: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43  E FROM t1;.    C
0fe0: 4f 50 59 20 74 31 20 46 52 4f 4d 20 27 64 61 74  OPY t1 FROM 'dat
0ff0: 61 36 2e 74 78 74 27 3b 0a 20 20 20 20 53 45 4c  a6.txt';.    SEL
1000: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52  ECT * FROM t1 OR
1010: 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20  DER BY a;.  }.} 
1020: 7b 31 20 7b 68 65 6c 6c 6f 0a 77 6f 72 6c 64 7d  {1 {hello.world}
1030: 20 32 20 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d   2 {hello world}
1040: 7d 0a 0a 23 20 54 65 73 74 20 74 68 65 20 65 6d  }..# Test the em
1050: 62 65 64 64 65 64 20 4e 55 4c 4c 20 6c 6f 67 69  bedded NULL logi
1060: 63 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 63 6f 70  c..#.do_test cop
1070: 79 2d 34 2e 31 20 7b 0a 20 20 73 65 74 20 66 64  y-4.1 {.  set fd
1080: 20 5b 6f 70 65 6e 20 64 61 74 61 36 2e 74 78 74   [open data6.txt
1090: 20 77 5d 0a 20 20 70 75 74 73 20 24 66 64 20 22   w].  puts $fd "
10a0: 31 5c 74 5c 5c 4e 22 0a 20 20 70 75 74 73 20 24  1\t\\N".  puts $
10b0: 66 64 20 22 5c 5c 4e 5c 74 68 65 6c 6c 6f 20 77  fd "\\N\thello w
10c0: 6f 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24 66  orld".  close $f
10d0: 64 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  d.  execsql {.  
10e0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
10f0: 3b 0a 20 20 20 20 43 4f 50 59 20 74 31 20 46 52  ;.    COPY t1 FR
1100: 4f 4d 20 27 64 61 74 61 36 2e 74 78 74 27 3b 0a  OM 'data6.txt';.
1110: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1120: 4d 20 74 31 20 57 48 45 52 45 20 61 20 49 53 20  M t1 WHERE a IS 
1130: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20  NULL;.  }.} {{} 
1140: 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 7d 0a 64  {hello world}}.d
1150: 6f 5f 74 65 73 74 20 63 6f 70 79 2d 34 2e 32 20  o_test copy-4.2 
1160: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1170: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1180: 74 31 20 57 48 45 52 45 20 62 20 49 53 20 4e 55  t1 WHERE b IS NU
1190: 4c 4c 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 7d 7d  LL;.  }.} {1 {}}
11a0: 0a 0a 23 20 54 65 73 74 20 74 68 65 20 63 6f 6e  ..# Test the con
11b0: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
11c0: 20 6c 6f 67 69 63 20 66 6f 72 20 43 4f 50 59 0a   logic for COPY.
11d0: 23 0a 64 6f 5f 74 65 73 74 20 63 6f 70 79 2d 35  #.do_test copy-5
11e0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
11f0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
1200: 74 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  t1;.    CREATE T
1210: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
1220: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
1230: 20 55 4e 49 51 55 45 2c 20 63 29 3b 0a 20 20 20   UNIQUE, c);.   
1240: 20 43 4f 50 59 20 74 31 20 46 52 4f 4d 20 27 64   COPY t1 FROM 'd
1250: 61 74 61 35 2e 74 78 74 27 20 55 53 49 4e 47 20  ata5.txt' USING 
1260: 44 45 4c 49 4d 49 54 45 52 53 20 27 7c 27 3b 0a  DELIMITERS '|';.
1270: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1280: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 31 20  M t1;.  }.} {11 
1290: 32 32 20 33 33 20 32 32 20 33 33 20 31 31 7d 0a  22 33 22 33 11}.
12a0: 64 6f 5f 74 65 73 74 20 63 6f 70 79 2d 35 2e 32  do_test copy-5.2
12b0: 20 7b 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65   {.  set fd [ope
12c0: 6e 20 64 61 74 61 36 2e 74 78 74 20 77 5d 0a 20  n data6.txt w]. 
12d0: 20 70 75 74 73 20 24 66 64 20 22 33 33 7c 32 32   puts $fd "33|22
12e0: 7c 34 34 22 0a 20 20 63 6c 6f 73 65 20 24 66 64  |44".  close $fd
12f0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1300: 20 20 43 4f 50 59 20 74 31 20 46 52 4f 4d 20 27    COPY t1 FROM '
1310: 64 61 74 61 36 2e 74 78 74 27 20 55 53 49 4e 47  data6.txt' USING
1320: 20 44 45 4c 49 4d 49 54 45 52 53 20 27 7c 27 3b   DELIMITERS '|';
1330: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1340: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
1350: 7b 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 73  {uniqueness cons
1360: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
1370: 64 6f 5f 74 65 73 74 20 63 6f 70 79 2d 35 2e 33  do_test copy-5.3
1380: 20 7b 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65   {.  set fd [ope
1390: 6e 20 64 61 74 61 36 2e 74 78 74 20 77 5d 0a 20  n data6.txt w]. 
13a0: 20 70 75 74 73 20 24 66 64 20 22 33 33 7c 32 32   puts $fd "33|22
13b0: 7c 34 34 22 0a 20 20 63 6c 6f 73 65 20 24 66 64  |44".  close $fd
13c0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
13d0: 20 20 43 4f 50 59 20 4f 52 20 49 47 4e 4f 52 45    COPY OR IGNORE
13e0: 20 74 31 20 46 52 4f 4d 20 27 64 61 74 61 36 2e   t1 FROM 'data6.
13f0: 74 78 74 27 20 55 53 49 4e 47 20 44 45 4c 49 4d  txt' USING DELIM
1400: 49 54 45 52 53 20 27 7c 27 3b 0a 20 20 20 20 53  ITERS '|';.    S
1410: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
1420: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 31 31 20 32 32  .  }.} {0 {11 22
1430: 20 33 33 20 32 32 20 33 33 20 31 31 7d 7d 0a 64   33 22 33 11}}.d
1440: 6f 5f 74 65 73 74 20 63 6f 70 79 2d 35 2e 34 20  o_test copy-5.4 
1450: 7b 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  {.  set fd [open
1460: 20 64 61 74 61 36 2e 74 78 74 20 77 5d 0a 20 20   data6.txt w].  
1470: 70 75 74 73 20 24 66 64 20 22 33 33 7c 32 32 7c  puts $fd "33|22|
1480: 34 34 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  44".  close $fd.
1490: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
14a0: 20 43 4f 50 59 20 4f 52 20 52 45 50 4c 41 43 45   COPY OR REPLACE
14b0: 20 74 31 20 46 52 4f 4d 20 27 64 61 74 61 36 2e   t1 FROM 'data6.
14c0: 74 78 74 27 20 55 53 49 4e 47 20 44 45 4c 49 4d  txt' USING DELIM
14d0: 49 54 45 52 53 20 27 7c 27 3b 0a 20 20 20 20 53  ITERS '|';.    S
14e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
14f0: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 32 32 20 33 33  .  }.} {0 {22 33
1500: 20 31 31 20 33 33 20 32 32 20 34 34 7d 7d 0a 0a   11 33 22 44}}..
1510: 64 6f 5f 74 65 73 74 20 63 6f 70 79 2d 35 2e 35  do_test copy-5.5
1520: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1530: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
1540: 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 6f  1;.    PRAGMA co
1550: 75 6e 74 5f 63 68 61 6e 67 65 73 3d 6f 6e 3b 0a  unt_changes=on;.
1560: 20 20 20 20 43 4f 50 59 20 74 31 20 46 52 4f 4d      COPY t1 FROM
1570: 20 27 64 61 74 61 35 2e 74 78 74 27 20 55 53 49   'data5.txt' USI
1580: 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20 27 7c  NG DELIMITERS '|
1590: 27 3b 0a 20 20 7d 0a 7d 20 7b 32 7d 0a 64 6f 5f  ';.  }.} {2}.do_
15a0: 74 65 73 74 20 63 6f 70 79 2d 35 2e 36 20 7b 0a  test copy-5.6 {.
15b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
15c0: 43 4f 50 59 20 4f 52 20 52 45 50 4c 41 43 45 20  COPY OR REPLACE 
15d0: 74 31 20 46 52 4f 4d 20 27 64 61 74 61 35 2e 74  t1 FROM 'data5.t
15e0: 78 74 27 20 55 53 49 4e 47 20 44 45 4c 49 4d 49  xt' USING DELIMI
15f0: 54 45 52 53 20 27 7c 27 3b 0a 20 20 7d 0a 7d 20  TERS '|';.  }.} 
1600: 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 63 6f 70 79  {2}.do_test copy
1610: 2d 35 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5.7 {.  execsql
1620: 20 7b 0a 20 20 20 20 43 4f 50 59 20 4f 52 20 49   {.    COPY OR I
1630: 47 4e 4f 52 45 20 74 31 20 46 52 4f 4d 20 27 64  GNORE t1 FROM 'd
1640: 61 74 61 35 2e 74 78 74 27 20 55 53 49 4e 47 20  ata5.txt' USING 
1650: 44 45 4c 49 4d 49 54 45 52 53 20 27 7c 27 3b 0a  DELIMITERS '|';.
1660: 20 20 7d 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65    }.} {0}..do_te
1670: 73 74 20 63 6f 70 79 2d 36 2e 31 20 7b 0a 20 20  st copy-6.1 {.  
1680: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
1690: 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67  AGMA count_chang
16a0: 65 73 3d 6f 66 66 3b 0a 20 20 20 20 43 52 45 41  es=off;.    CREA
16b0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 62 2c  TE TABLE t2(a,b,
16c0: 63 29 3b 0a 20 20 20 20 43 4f 50 59 20 74 32 20  c);.    COPY t2 
16d0: 46 52 4f 4d 20 27 64 61 74 61 58 2e 74 78 74 27  FROM 'dataX.txt'
16e0: 20 55 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52   USING DELIMITER
16f0: 53 20 27 7c 27 3b 0a 20 20 20 20 53 45 4c 45 43  S '|';.    SELEC
1700: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
1710: 0a 7d 20 7b 31 31 20 32 32 20 33 33 20 32 32 20  .} {11 22 33 22 
1720: 33 33 20 34 34 20 33 33 20 34 34 20 35 35 20 34  33 44 33 44 55 4
1730: 34 20 35 35 20 36 36 20 35 35 20 36 36 20 37 37  4 55 66 55 66 77
1740: 20 36 36 20 37 37 20 38 38 7d 0a 0a 69 6e 74 65   66 77 88}..inte
1750: 67 72 69 74 79 5f 63 68 65 63 6b 20 63 6f 70 79  grity_check copy
1760: 2d 37 2e 31 0a 0a 23 20 43 6c 65 61 6e 75 70 20  -7.1..# Cleanup 
1770: 0a 23 0a 23 66 69 6c 65 20 64 65 6c 65 74 65 20  .#.#file delete 
1780: 2d 66 6f 72 63 65 20 64 61 74 61 31 2e 74 78 74  -force data1.txt
1790: 20 64 61 74 61 32 2e 74 78 74 20 64 61 74 61 33   data2.txt data3
17a0: 2e 74 78 74 20 64 61 74 61 34 2e 74 78 74 20 64  .txt data4.txt d
17b0: 61 74 61 35 2e 74 78 74 20 5c 0a 20 20 20 20 20  ata5.txt \.     
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
17d0: 74 61 36 2e 74 78 74 20 64 61 74 61 58 2e 74 78  ta6.txt dataX.tx
17e0: 74 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     t..finish_test.