/ Hex Artifact Content
Login

Artifact 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d:


0000: 23 20 32 30 31 38 20 4a 61 6e 75 61 72 79 20 33  # 2018 January 3
0010: 30 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  0.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an 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 2a 2a 0a 23 0a 0a 70 61 63 6b 61  *******.#..packa
0170: 67 65 20 72 65 71 75 69 72 65 20 54 63 6c 20 38  ge require Tcl 8
0180: 2e 36 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20  .6..set testdir 
0190: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61  [file dirname $a
01a0: 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65  rgv0].source $te
01b0: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
01c0: 0a 73 65 74 20 74 65 73 74 70 72 65 66 69 78 20  .set testprefix 
01d0: 7a 69 70 66 69 6c 65 32 0a 0a 69 66 63 61 70 61  zipfile2..ifcapa
01e0: 62 6c 65 20 21 76 74 61 62 20 7b 0a 20 20 66 69  ble !vtab {.  fi
01f0: 6e 69 73 68 5f 74 65 73 74 3b 20 72 65 74 75 72  nish_test; retur
0200: 6e 0a 7d 0a 69 66 20 7b 5b 63 61 74 63 68 20 7b  n.}.if {[catch {
0210: 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65  load_static_exte
0220: 6e 73 69 6f 6e 20 64 62 20 7a 69 70 66 69 6c 65  nsion db zipfile
0230: 7d 20 65 72 72 6f 72 5d 7d 20 7b 0a 20 20 70 75  } error]} {.  pu
0240: 74 73 20 22 53 6b 69 70 70 69 6e 67 20 7a 69 70  ts "Skipping zip
0250: 66 69 6c 65 32 20 74 65 73 74 73 2c 20 68 69 74  file2 tests, hit
0260: 20 6c 6f 61 64 20 65 72 72 6f 72 3a 20 24 65 72   load error: $er
0270: 72 6f 72 22 0a 20 20 66 69 6e 69 73 68 5f 74 65  ror".  finish_te
0280: 73 74 3b 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72  st; return.}..pr
0290: 6f 63 20 62 6c 6f 62 6c 69 74 65 72 61 6c 20 7b  oc blobliteral {
02a0: 73 74 72 7d 20 7b 0a 20 20 73 65 74 20 63 6f 6e  str} {.  set con
02b0: 63 61 74 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  cat [string map 
02c0: 7b 22 20 22 20 22 22 20 22 5c 6e 22 20 22 22 7d  {" " "" "\n" ""}
02d0: 20 24 73 74 72 5d 0a 20 20 72 65 74 75 72 6e 20   $str].  return 
02e0: 22 58 27 24 63 6f 6e 63 61 74 27 22 0a 7d 0a 0a  "X'$concat'".}..
02f0: 70 72 6f 63 20 62 6c 6f 62 20 7b 73 74 72 7d 20  proc blob {str} 
0300: 7b 0a 20 20 62 69 6e 61 72 79 20 64 65 63 6f 64  {.  binary decod
0310: 65 20 68 65 78 20 24 73 74 72 0a 7d 0a 0a 70 72  e hex $str.}..pr
0320: 6f 63 20 66 69 6e 64 61 6c 6c 20 7b 6e 65 65 64  oc findall {need
0330: 6c 65 20 68 61 79 73 74 61 63 6b 7d 20 7b 0a 20  le haystack} {. 
0340: 20 73 65 74 20 4c 20 5b 6c 69 73 74 5d 0a 20 20   set L [list].  
0350: 73 65 74 20 73 74 61 72 74 20 30 0a 20 20 77 68  set start 0.  wh
0360: 69 6c 65 20 7b 20 5b 73 65 74 20 69 64 78 20 5b  ile { [set idx [
0370: 73 74 72 69 6e 67 20 66 69 72 73 74 20 24 6e 65  string first $ne
0380: 65 64 6c 65 20 24 68 61 79 73 74 61 63 6b 20 24  edle $haystack $
0390: 73 74 61 72 74 5d 5d 3e 3d 30 20 7d 20 7b 0a 20  start]]>=0 } {. 
03a0: 20 20 20 6c 61 70 70 65 6e 64 20 4c 20 24 69 64     lappend L $id
03b0: 78 0a 20 20 20 20 73 65 74 20 73 74 61 72 74 20  x.    set start 
03c0: 5b 65 78 70 72 20 24 69 64 78 2b 31 5d 0a 20 20  [expr $idx+1].  
03d0: 7d 0a 20 20 73 65 74 20 4c 0a 7d 0a 0a 64 6f 5f  }.  set L.}..do_
03e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 30  execsql_test 1.0
03f0: 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54   {.  CREATE VIRT
0400: 55 41 4c 20 54 41 42 4c 45 20 61 61 61 20 55 53  UAL TABLE aaa US
0410: 49 4e 47 20 7a 69 70 66 69 6c 65 28 27 74 65 73  ING zipfile('tes
0420: 74 7a 69 70 27 29 3b 0a 20 20 43 52 45 41 54 45  tzip');.  CREATE
0430: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 62   VIRTUAL TABLE b
0440: 62 62 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65  bb USING zipfile
0450: 28 22 74 65 73 74 7a 69 70 22 29 3b 0a 20 20 43  ("testzip");.  C
0460: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
0470: 42 4c 45 20 63 63 63 20 55 53 49 4e 47 20 7a 69  BLE ccc USING zi
0480: 70 66 69 6c 65 28 60 74 65 73 74 7a 69 70 60 29  pfile(`testzip`)
0490: 3b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  ;.  CREATE VIRTU
04a0: 41 4c 20 54 41 42 4c 45 20 64 64 64 20 55 53 49  AL TABLE ddd USI
04b0: 4e 47 20 7a 69 70 66 69 6c 65 28 5b 74 65 73 74  NG zipfile([test
04c0: 7a 69 70 5d 29 3b 0a 20 20 43 52 45 41 54 45 20  zip]);.  CREATE 
04d0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 65  VIRTUAL TABLE ee
04e0: 65 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28  e USING zipfile(
04f0: 74 65 73 74 7a 69 70 29 3b 0a 20 20 43 52 45 41  testzip);.  CREA
0500: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0510: 20 66 66 66 20 55 53 49 4e 47 20 7a 69 70 66 69   fff USING zipfi
0520: 6c 65 28 27 74 65 73 74 27 27 7a 69 70 27 29 3b  le('test''zip');
0530: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 30 20  .}..do_test 2.0 
0540: 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  {.  forcedelete 
0550: 74 65 73 74 64 69 72 0a 20 20 66 69 6c 65 20 6d  testdir.  file m
0560: 6b 64 69 72 20 74 65 73 74 64 69 72 0a 20 20 65  kdir testdir.  e
0570: 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
0580: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 68 68  VIRTUAL TABLE hh
0590: 68 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28  h USING zipfile(
05a0: 27 74 65 73 74 64 69 72 27 29 20 7d 0a 20 20 6c  'testdir') }.  l
05b0: 69 6e 64 65 78 20 5b 63 61 74 63 68 73 71 6c 20  index [catchsql 
05c0: 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  { .    SELECT * 
05d0: 46 52 4f 4d 20 68 68 68 3b 0a 20 20 20 20 49 4e  FROM hhh;.    IN
05e0: 53 45 52 54 20 49 4e 54 4f 20 68 68 68 28 6e 61  SERT INTO hhh(na
05f0: 6d 65 2c 20 64 61 74 61 29 20 56 41 4c 55 45 53  me, data) VALUES
0600: 28 27 31 2e 74 78 74 27 2c 20 27 66 69 6c 65 20  ('1.txt', 'file 
0610: 64 61 74 61 27 29 3b 0a 20 20 7d 5d 20 30 20 0a  data');.  }] 0 .
0620: 7d 20 31 0a 0a 0a 73 65 74 20 61 72 63 68 69 76  } 1...set archiv
0630: 65 20 7b 0a 20 20 35 30 34 42 30 33 30 34 31 34  e {.  504B030414
0640: 30 30 30 30 30 38 30 30 30 30 44 34 41 35 32 42  0000080000D4A52B
0650: 45 43 30 39 46 33 42 36 45 30 31 31 30 30 30 30  EC09F3B6E0110000
0660: 30 30 31 31 30 30 30 30 30 30 30 35 30 30 30 39  0011000000050009
0670: 30 30 36 31 32 45 0a 20 20 37 34 37 38 37 34 35  00612E.  7478745
0680: 35 35 34 30 35 30 30 30 31 34 30 34 32 30 46 30  55405000140420F0
0690: 30 36 33 36 46 36 45 37 34 36 35 36 45 37 34 37  0636F6E74656E747
06a0: 33 32 30 36 46 36 36 32 30 36 31 32 45 37 34 37  3206F6620612E747
06b0: 38 37 34 35 30 34 42 30 33 0a 20 20 30 34 31 34  874504B03.  0414
06c0: 30 30 30 30 30 38 30 30 30 30 44 34 41 35 32 42  0000080000D4A52B
06d0: 45 43 44 39 38 39 31 36 41 37 31 31 30 30 30 30  ECD98916A7110000
06e0: 30 30 31 31 30 30 30 30 30 30 30 35 30 30 30 39  0011000000050009
06f0: 30 30 36 32 32 45 37 34 37 38 37 34 0a 20 20 35  00622E747874.  5
0700: 35 35 34 30 35 30 30 30 31 34 30 34 32 30 46 30  55405000140420F0
0710: 30 36 33 36 46 36 45 37 34 36 35 36 45 37 34 37  0636F6E74656E747
0720: 33 32 30 36 46 36 36 32 30 36 32 32 45 37 34 37  3206F6620622E747
0730: 38 37 34 35 30 34 42 30 31 30 32 31 45 30 33 0a  874504B01021E03.
0740: 20 20 31 34 30 30 30 30 30 38 30 30 30 30 44 34    140000080000D4
0750: 41 35 32 42 45 43 30 39 46 33 42 36 45 30 31 31  A52BEC09F3B6E011
0760: 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 35  0000001100000005
0770: 30 30 30 39 30 30 30 30 30 30 30 30 30 30 30 30  0009000000000000
0780: 30 30 0a 20 20 30 30 30 30 41 34 38 31 30 30 30  00.  0000A481000
0790: 30 30 30 30 30 36 31 32 45 37 34 37 38 37 34 35  00000612E7478745
07a0: 35 35 34 30 35 30 30 30 31 34 30 34 32 30 46 30  55405000140420F0
07b0: 30 35 30 34 42 30 31 30 32 31 45 30 33 31 34 30  0504B01021E03140
07c0: 30 30 30 30 38 0a 20 20 30 30 30 30 44 34 41 35  00008.  0000D4A5
07d0: 32 42 45 43 44 39 38 39 31 36 41 37 31 31 30 30  2BECD98916A71100
07e0: 30 30 30 30 31 31 30 30 30 30 30 30 30 35 30 30  0000110000000500
07f0: 30 39 30 30 30 30 30 30 30 30 30 30 30 30 30 30  0900000000000000
0800: 30 30 30 30 41 34 38 31 0a 20 20 33 44 30 30 30  0000A481.  3D000
0810: 30 30 30 36 32 32 45 37 34 37 38 37 34 35 35 35  000622E747874555
0820: 34 30 35 30 30 30 31 34 30 34 32 30 46 30 30 35  405000140420F005
0830: 30 34 42 30 35 30 36 30 30 30 30 30 30 30 30 30  04B0506000000000
0840: 32 30 30 30 32 30 30 37 38 30 30 0a 20 20 30 30  20002007800.  00
0850: 30 30 37 41 30 30 30 30 30 30 30 30 30 30 0a 7d  007A0000000000.}
0860: 0a 0a 69 66 20 30 20 7b 0a 20 20 23 20 54 68 69  ..if 0 {.  # Thi
0870: 73 20 74 65 73 74 20 69 73 20 62 72 6f 6b 65 6e  s test is broken
0880: 20 2d 20 74 68 65 20 61 72 63 68 69 76 65 20 67   - the archive g
0890: 65 6e 65 72 61 74 65 64 20 69 73 20 73 6c 69 67  enerated is slig
08a0: 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 0a 20  htly different. 
08b0: 20 23 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   # depending on 
08c0: 74 68 65 20 7a 6c 69 62 20 76 65 72 73 69 6f 6e  the zlib version
08d0: 20 75 73 65 64 2e 0a 20 20 64 6f 5f 65 78 65 63   used..  do_exec
08e0: 73 71 6c 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20  sql_test 3.1 {. 
08f0: 20 20 20 57 49 54 48 20 63 6f 6e 74 65 6e 74 73     WITH contents
0900: 28 6e 61 6d 65 2c 6d 74 69 6d 65 2c 64 61 74 61  (name,mtime,data
0910: 29 20 41 53 20 28 0a 20 20 20 20 20 20 20 20 56  ) AS (.        V
0920: 41 4c 55 45 53 28 27 61 2e 74 78 74 27 2c 20 31  ALUES('a.txt', 1
0930: 30 30 30 30 30 30 2c 20 27 63 6f 6e 74 65 6e 74  000000, 'content
0940: 73 20 6f 66 20 61 2e 74 78 74 27 29 20 55 4e 49  s of a.txt') UNI
0950: 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 20 20 56  ON ALL.        V
0960: 41 4c 55 45 53 28 27 62 2e 74 78 74 27 2c 20 31  ALUES('b.txt', 1
0970: 30 30 30 30 30 30 2c 20 27 63 6f 6e 74 65 6e 74  000000, 'content
0980: 73 20 6f 66 20 62 2e 74 78 74 27 29 0a 20 20 20  s of b.txt').   
0990: 20 29 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28   ) SELECT quote(
09a0: 20 7a 69 70 66 69 6c 65 28 6e 61 6d 65 2c 4e 55   zipfile(name,NU
09b0: 4c 4c 2c 6d 74 69 6d 65 2c 64 61 74 61 29 20 29  LL,mtime,data) )
09c0: 20 46 52 4f 4d 20 63 6f 6e 74 65 6e 74 73 3b 0a   FROM contents;.
09d0: 20 20 7d 20 5b 62 6c 6f 62 6c 69 74 65 72 61 6c    } [blobliteral
09e0: 20 24 61 72 63 68 69 76 65 5d 0a 7d 0a 0a 0a 73   $archive].}...s
09f0: 65 74 20 62 6c 6f 62 20 5b 62 6c 6f 62 20 24 61  et blob [blob $a
0a00: 72 63 68 69 76 65 5d 0a 64 6f 5f 65 78 65 63 73  rchive].do_execs
0a10: 71 6c 5f 74 65 73 74 20 33 2e 32 20 7b 0a 20 20  ql_test 3.2 {.  
0a20: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 6d 74 69 6d  SELECT name,mtim
0a30: 65 2c 64 61 74 61 20 46 52 4f 4d 20 7a 69 70 66  e,data FROM zipf
0a40: 69 6c 65 28 24 62 6c 6f 62 29 0a 7d 20 7b 0a 20  ile($blob).} {. 
0a50: 20 61 2e 74 78 74 20 31 30 30 30 30 30 30 20 7b   a.txt 1000000 {
0a60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 2e 74 78  contents of a.tx
0a70: 74 7d 20 0a 20 20 62 2e 74 78 74 20 31 30 30 30  t} .  b.txt 1000
0a80: 30 30 30 20 7b 63 6f 6e 74 65 6e 74 73 20 6f 66  000 {contents of
0a90: 20 62 2e 74 78 74 7d 0a 7d 0a 0a 23 20 43 6f 72   b.txt}.}..# Cor
0aa0: 72 75 70 74 20 65 61 63 68 20 6f 66 20 74 68 65  rupt each of the
0ab0: 20 30 78 35 30 20 30 78 34 42 20 28 61 73 63 69   0x50 0x4B (asci
0ac0: 69 20 22 50 4b 22 29 20 68 65 61 64 65 72 73 20  i "PK") headers 
0ad0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 23 20 54 65  in the file.# Te
0ae0: 73 74 20 74 68 61 74 20 69 6e 20 65 61 63 68 20  st that in each 
0af0: 63 61 73 65 20 74 68 69 73 20 63 61 75 73 65 73  case this causes
0b00: 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 73 65 74   an error..#.set
0b10: 20 4c 20 5b 66 69 6e 64 61 6c 6c 20 35 30 34 42   L [findall 504B
0b20: 20 24 61 72 63 68 69 76 65 5d 0a 66 6f 72 20 7b   $archive].for {
0b30: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 5b  set i 0} {$i < [
0b40: 6c 6c 65 6e 67 74 68 20 24 4c 5d 7d 20 7b 69 6e  llength $L]} {in
0b50: 63 72 20 69 7d 20 7b 0a 20 20 73 65 74 20 69 64  cr i} {.  set id
0b60: 78 20 5b 6c 69 6e 64 65 78 20 24 4c 20 24 69 5d  x [lindex $L $i]
0b70: 0a 20 20 73 65 74 20 61 20 5b 73 74 72 69 6e 67  .  set a [string
0b80: 20 72 65 70 6c 61 63 65 20 24 61 72 63 68 69 76   replace $archiv
0b90: 65 20 24 69 64 78 20 5b 65 78 70 72 20 24 69 64  e $idx [expr $id
0ba0: 78 2b 33 5d 20 30 30 30 30 5d 0a 20 20 73 65 74  x+3] 0000].  set
0bb0: 20 62 6c 6f 62 20 5b 62 6c 6f 62 20 24 61 5d 0a   blob [blob $a].
0bc0: 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65    do_catchsql_te
0bd0: 73 74 20 33 2e 33 2e 24 69 20 7b 0a 20 20 20 20  st 3.3.$i {.    
0be0: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 6d 74 69 6d  SELECT name,mtim
0bf0: 65 2c 64 61 74 61 20 46 52 4f 4d 20 7a 69 70 66  e,data FROM zipf
0c00: 69 6c 65 28 24 62 6c 6f 62 29 0a 20 20 7d 20 7b  ile($blob).  } {
0c10: 2f 31 20 2e 2a 2f 7d 0a 7d 0a 0a 23 20 43 68 61  /1 .*/}.}..# Cha
0c20: 6e 67 65 20 74 68 65 20 22 65 78 74 72 61 20 69  nge the "extra i
0c30: 6e 66 6f 20 69 64 22 20 66 6f 72 20 61 6c 6c 20  nfo id" for all 
0c40: 65 78 74 65 6e 64 65 64 2d 74 69 6d 65 73 74 61  extended-timesta
0c50: 6d 70 20 66 69 65 6c 64 73 2e 0a 73 65 74 20 4c  mp fields..set L
0c60: 20 5b 66 69 6e 64 61 6c 6c 20 35 35 35 34 20 24   [findall 5554 $
0c70: 61 72 63 68 69 76 65 5d 0a 66 6f 72 20 7b 73 65  archive].for {se
0c80: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 5b 6c 6c  t i 0} {$i < [ll
0c90: 65 6e 67 74 68 20 24 4c 5d 7d 20 7b 69 6e 63 72  ength $L]} {incr
0ca0: 20 69 7d 20 7b 0a 20 20 73 65 74 20 69 64 78 20   i} {.  set idx 
0cb0: 5b 6c 69 6e 64 65 78 20 24 4c 20 24 69 5d 0a 20  [lindex $L $i]. 
0cc0: 20 73 65 74 20 61 20 5b 73 74 72 69 6e 67 20 72   set a [string r
0cd0: 65 70 6c 61 63 65 20 24 61 72 63 68 69 76 65 20  eplace $archive 
0ce0: 24 69 64 78 20 5b 65 78 70 72 20 24 69 64 78 2b  $idx [expr $idx+
0cf0: 33 5d 20 31 32 33 34 5d 0a 20 20 73 65 74 20 62  3] 1234].  set b
0d00: 6c 6f 62 20 5b 62 6c 6f 62 20 24 61 5d 0a 20 20  lob [blob $a].  
0d10: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0d20: 33 2e 34 2e 24 69 20 7b 0a 20 20 20 20 53 45 4c  3.4.$i {.    SEL
0d30: 45 43 54 20 6e 61 6d 65 2c 64 61 74 61 20 46 52  ECT name,data FR
0d40: 4f 4d 20 7a 69 70 66 69 6c 65 28 24 62 6c 6f 62  OM zipfile($blob
0d50: 29 0a 20 20 7d 20 7b 0a 20 20 20 20 61 2e 74 78  ).  } {.    a.tx
0d60: 74 20 7b 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  t {contents of a
0d70: 2e 74 78 74 7d 20 0a 20 20 20 20 62 2e 74 78 74  .txt} .    b.txt
0d80: 20 7b 63 6f 6e 74 65 6e 74 73 20 6f 66 20 62 2e   {contents of b.
0d90: 74 78 74 7d 0a 20 20 7d 0a 7d 0a 0a 66 6f 72 20  txt}.  }.}..for 
0da0: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
0db0: 5b 6c 6c 65 6e 67 74 68 20 24 4c 5d 7d 20 7b 69  [llength $L]} {i
0dc0: 6e 63 72 20 69 7d 20 7b 0a 20 20 73 65 74 20 69  ncr i} {.  set i
0dd0: 64 78 20 5b 6c 69 6e 64 65 78 20 24 4c 20 24 69  dx [lindex $L $i
0de0: 5d 0a 20 20 73 65 74 20 61 20 5b 73 74 72 69 6e  ].  set a [strin
0df0: 67 20 72 65 70 6c 61 63 65 20 24 61 72 63 68 69  g replace $archi
0e00: 76 65 20 5b 65 78 70 72 20 24 69 64 78 2b 38 5d  ve [expr $idx+8]
0e10: 20 5b 65 78 70 72 20 24 69 64 78 2b 39 5d 20 30   [expr $idx+9] 0
0e20: 30 5d 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b 62  0].  set blob [b
0e30: 6c 6f 62 20 24 61 5d 0a 20 20 64 6f 5f 65 78 65  lob $a].  do_exe
0e40: 63 73 71 6c 5f 74 65 73 74 20 33 2e 35 2e 24 69  csql_test 3.5.$i
0e50: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61   {.    SELECT na
0e60: 6d 65 2c 64 61 74 61 20 46 52 4f 4d 20 7a 69 70  me,data FROM zip
0e70: 66 69 6c 65 28 24 62 6c 6f 62 29 0a 20 20 7d 20  file($blob).  } 
0e80: 7b 0a 20 20 20 20 61 2e 74 78 74 20 7b 63 6f 6e  {.    a.txt {con
0e90: 74 65 6e 74 73 20 6f 66 20 61 2e 74 78 74 7d 20  tents of a.txt} 
0ea0: 0a 20 20 20 20 62 2e 74 78 74 20 7b 63 6f 6e 74  .    b.txt {cont
0eb0: 65 6e 74 73 20 6f 66 20 62 2e 74 78 74 7d 0a 20  ents of b.txt}. 
0ec0: 20 7d 0a 7d 0a 0a 23 20 73 65 74 20 62 6c 6f 62   }.}..# set blob
0ed0: 20 5b 64 62 20 6f 6e 65 20 7b 0a 23 20 20 20 57   [db one {.#   W
0ee0: 49 54 48 20 63 6f 6e 74 65 6e 74 73 28 6e 61 6d  ITH contents(nam
0ef0: 65 2c 6d 74 69 6d 65 2c 64 61 74 61 29 20 41 53  e,mtime,data) AS
0f00: 20 28 0a 23 20 20 20 20 20 56 41 4c 55 45 53 28   (.#     VALUES(
0f10: 27 61 2e 74 78 74 27 2c 20 31 30 30 30 30 30 30  'a.txt', 1000000
0f20: 2c 20 27 61 61 61 61 61 61 61 61 61 61 61 61 61  , 'aaaaaaaaaaaaa
0f30: 61 61 61 61 61 61 61 61 61 61 27 29 0a 23 20 20  aaaaaaaaaa').#  
0f40: 20 29 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28   ) SELECT quote(
0f50: 20 7a 69 70 66 69 6c 65 28 6e 61 6d 65 2c 4e 55   zipfile(name,NU
0f60: 4c 4c 2c 6d 74 69 6d 65 2c 64 61 74 61 29 20 29  LL,mtime,data) )
0f70: 20 46 52 4f 4d 20 63 6f 6e 74 65 6e 74 73 3b 0a   FROM contents;.
0f80: 23 20 7d 5d 0a 23 20 73 65 74 20 62 6c 6f 62 20  # }].# set blob 
0f90: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 62  [string range $b
0fa0: 6c 6f 62 20 32 20 65 6e 64 5d 0a 23 20 73 65 74  lob 2 end].# set
0fb0: 20 62 6c 6f 62 20 5b 73 74 72 69 6e 67 20 72 61   blob [string ra
0fc0: 6e 67 65 20 24 62 6c 6f 62 20 30 20 65 6e 64 2d  nge $blob 0 end-
0fd0: 31 5d 0a 23 20 77 68 69 6c 65 20 7b 5b 73 74 72  1].# while {[str
0fe0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 62 6c 6f 62  ing length $blob
0ff0: 5d 3e 30 7d 20 7b 0a 23 20 20 20 70 75 74 73 20  ]>0} {.#   puts 
1000: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 62  [string range $b
1010: 6c 6f 62 20 30 20 36 33 5d 0a 23 20 20 20 73 65  lob 0 63].#   se
1020: 74 20 62 6c 6f 62 20 5b 73 74 72 69 6e 67 20 72  t blob [string r
1030: 61 6e 67 65 20 24 62 6c 6f 62 20 36 34 20 65 6e  ange $blob 64 en
1040: 64 5d 0a 23 20 7d 0a 23 20 65 78 69 74 0a 0a 73  d].# }.# exit..s
1050: 65 74 20 61 72 63 68 69 76 65 32 20 7b 0a 20 20  et archive2 {.  
1060: 35 30 34 42 30 33 30 34 31 34 30 30 30 30 30 38  504B030414000008
1070: 30 38 30 30 44 34 41 35 32 42 45 43 30 38 46 35  0800D4A52BEC08F5
1080: 34 43 36 45 30 35 30 30 30 30 30 30 31 37 30 30  4C6E050000001700
1090: 30 30 30 30 30 35 30 30 30 39 30 30 36 31 32 45  000005000900612E
10a0: 0a 20 20 37 34 37 38 37 34 35 35 35 34 30 35 30  .  7478745554050
10b0: 30 30 31 34 30 34 32 30 46 30 30 34 42 34 43 43  00140420F004B4CC
10c0: 34 30 41 30 30 35 30 34 42 30 31 30 32 31 45 30  40A00504B01021E0
10d0: 33 31 34 30 30 30 30 30 38 30 38 30 30 44 34 41  3140000080800D4A
10e0: 35 32 42 0a 20 20 45 43 30 38 46 35 34 43 36 45  52B.  EC08F54C6E
10f0: 30 35 30 30 30 30 30 30 31 37 30 30 30 30 30 30  0500000017000000
1100: 30 35 30 30 30 39 30 30 30 30 30 30 30 30 30 30  0500090000000000
1110: 30 30 30 30 30 30 30 30 41 34 38 31 30 30 30 30  00000000A4810000
1120: 30 30 30 30 36 31 0a 20 20 32 45 37 34 37 38 37  000061.  2E74787
1130: 34 35 35 35 34 30 35 30 30 30 31 34 30 34 32 30  4555405000140420
1140: 46 30 30 35 30 34 42 30 35 30 36 30 30 30 30 30  F00504B050600000
1150: 30 30 30 30 31 30 30 30 31 30 30 33 43 30 30 30  000010001003C000
1160: 30 30 30 33 31 30 30 30 30 0a 20 20 30 30 30 30  000310000.  0000
1170: 30 30 0a 7d 0a 73 65 74 20 62 6c 6f 62 20 5b 62  00.}.set blob [b
1180: 6c 6f 62 20 24 61 72 63 68 69 76 65 32 5d 0a 64  lob $archive2].d
1190: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
11a0: 2e 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 6e 61  .0 {.  SELECT na
11b0: 6d 65 2c 6d 74 69 6d 65 2c 64 61 74 61 2c 6d 65  me,mtime,data,me
11c0: 74 68 6f 64 20 46 52 4f 4d 20 7a 69 70 66 69 6c  thod FROM zipfil
11d0: 65 28 24 62 6c 6f 62 29 0a 7d 20 7b 0a 20 20 61  e($blob).} {.  a
11e0: 2e 74 78 74 20 31 30 30 30 30 30 30 20 61 61 61  .txt 1000000 aaa
11f0: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61  aaaaaaaaaaaaaaaa
1200: 61 61 61 61 20 38 0a 7d 0a 0a 73 65 74 20 4c 20  aaaa 8.}..set L 
1210: 5b 66 69 6e 64 61 6c 6c 20 31 37 30 30 30 30 30  [findall 1700000
1220: 30 20 24 61 72 63 68 69 76 65 32 5d 0a 73 65 74  0 $archive2].set
1230: 20 61 20 24 61 72 63 68 69 76 65 32 0a 66 6f 72   a $archive2.for
1240: 65 61 63 68 20 69 20 24 4c 20 7b 20 73 65 74 20  each i $L { set 
1250: 61 20 5b 73 74 72 69 6e 67 20 72 65 70 6c 61 63  a [string replac
1260: 65 20 24 61 20 24 69 20 5b 65 78 70 72 20 24 69  e $a $i [expr $i
1270: 2b 37 5d 20 31 36 30 30 30 30 30 30 5d 20 7d 0a  +7] 16000000] }.
1280: 73 65 74 20 62 6c 6f 62 20 5b 62 6c 6f 62 20 24  set blob [blob $
1290: 61 5d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  a].do_catchsql_t
12a0: 65 73 74 20 34 2e 31 20 7b 0a 20 20 53 45 4c 45  est 4.1 {.  SELE
12b0: 43 54 20 6e 61 6d 65 2c 6d 74 69 6d 65 2c 64 61  CT name,mtime,da
12c0: 74 61 2c 6d 65 74 68 6f 64 20 46 52 4f 4d 20 7a  ta,method FROM z
12d0: 69 70 66 69 6c 65 28 24 62 6c 6f 62 29 0a 7d 20  ipfile($blob).} 
12e0: 7b 31 20 7b 69 6e 66 6c 61 74 65 28 29 20 66 61  {1 {inflate() fa
12f0: 69 6c 65 64 20 28 30 29 7d 7d 0a 0a 23 20 43 68  iled (0)}}..# Ch
1300: 65 63 6b 20 74 68 65 20 72 65 73 70 6f 6e 73 65  eck the response
1310: 20 74 6f 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63   to an unknown c
1320: 6f 6d 70 72 65 73 73 69 6f 6e 20 6d 65 74 68 6f  ompression metho
1330: 64 20 28 73 65 74 20 64 61 74 61 20 74 6f 20 4e  d (set data to N
1340: 55 4c 4c 29 2e 0a 73 65 74 20 62 6c 6f 62 20 5b  ULL)..set blob [
1350: 62 6c 6f 62 20 5b 73 74 72 69 6e 67 20 6d 61 70  blob [string map
1360: 20 7b 30 38 30 30 20 30 39 30 30 7d 20 24 61 72   {0800 0900} $ar
1370: 63 68 69 76 65 32 5d 5d 0a 64 6f 5f 65 78 65 63  chive2]].do_exec
1380: 73 71 6c 5f 74 65 73 74 20 34 2e 32 20 7b 0a 20  sql_test 4.2 {. 
1390: 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 6d 74 69   SELECT name,mti
13a0: 6d 65 2c 64 61 74 61 20 49 53 20 4e 55 4c 4c 2c  me,data IS NULL,
13b0: 6d 65 74 68 6f 64 20 46 52 4f 4d 20 7a 69 70 66  method FROM zipf
13c0: 69 6c 65 28 24 62 6c 6f 62 29 0a 7d 20 7b 61 2e  ile($blob).} {a.
13d0: 74 78 74 20 31 30 30 30 30 30 30 20 31 20 39 7d  txt 1000000 1 9}
13e0: 0a 0a 23 20 43 6f 72 72 75 70 74 20 74 68 65 20  ..# Corrupt the 
13f0: 45 4f 43 44 53 20 73 69 67 6e 61 74 75 72 65 20  EOCDS signature 
1400: 62 79 74 65 73 20 69 6e 20 76 61 72 69 6f 75 73  bytes in various
1410: 20 77 61 79 73 2e 0a 66 6f 72 65 61 63 68 20 7b   ways..foreach {
1420: 74 6e 20 73 75 62 7d 20 7b 0a 20 20 31 20 7b 35  tn sub} {.  1 {5
1430: 30 34 42 30 35 30 30 7d 0a 20 20 32 20 7b 35 30  04B0500}.  2 {50
1440: 34 42 30 30 30 36 7d 0a 20 20 33 20 7b 35 30 30  4B0006}.  3 {500
1450: 30 30 35 30 36 7d 0a 20 20 34 20 7b 30 30 34 42  00506}.  4 {004B
1460: 30 35 30 36 7d 0a 7d 20 7b 0a 20 20 73 65 74 20  0506}.} {.  set 
1470: 62 6c 6f 62 20 5b 62 6c 6f 62 20 5b 73 74 72 69  blob [blob [stri
1480: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 35 30 34  ng map [list 504
1490: 42 30 35 30 36 20 24 73 75 62 5d 20 24 61 72 63  B0506 $sub] $arc
14a0: 68 69 76 65 32 5d 5d 0a 20 20 64 6f 5f 63 61 74  hive2]].  do_cat
14b0: 63 68 73 71 6c 5f 74 65 73 74 20 34 2e 33 2e 24  chsql_test 4.3.$
14c0: 74 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  tn {.    SELECT 
14d0: 2a 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 24  * FROM zipfile($
14e0: 62 6c 6f 62 29 0a 20 20 7d 20 7b 31 20 7b 63 61  blob).  } {1 {ca
14f0: 6e 6e 6f 74 20 66 69 6e 64 20 65 6e 64 20 6f 66  nnot find end of
1500: 20 63 65 6e 74 72 61 6c 20 64 69 72 65 63 74 6f   central directo
1510: 72 79 20 72 65 63 6f 72 64 7d 7d 0a 7d 0a 0a 23  ry record}}.}..#
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
1570: 20 74 68 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e   that a zero-len
1580: 67 74 68 20 66 69 6c 65 20 77 69 74 68 20 61 20  gth file with a 
1590: 27 2f 27 20 61 74 20 74 68 65 20 65 6e 64 20 69  '/' at the end i
15a0: 73 20 74 72 65 61 74 65 64 20 61 73 0a 23 20 61  s treated as.# a
15b0: 20 64 69 72 65 63 74 6f 72 79 20 28 64 61 74 61   directory (data
15c0: 20 49 53 20 4e 55 4c 4c 29 2e 20 45 76 65 6e 20   IS NULL). Even 
15d0: 69 66 20 74 68 65 20 6d 6f 64 65 20 64 6f 65 73  if the mode does
15e0: 6e 27 74 20 69 6e 64 69 63 61 74 65 0a 23 20 74  n't indicate.# t
15f0: 68 61 74 20 69 74 20 69 73 20 61 20 64 69 72 65  hat it is a dire
1600: 63 74 6f 72 79 2e 0a 0a 64 6f 5f 74 65 73 74 20  ctory...do_test 
1610: 35 2e 30 20 7b 0a 20 20 73 65 74 20 62 6c 6f 62  5.0 {.  set blob
1620: 20 5b 64 62 20 6f 6e 65 20 7b 0a 20 20 20 20 57   [db one {.    W
1630: 49 54 48 20 63 28 6e 2c 20 64 29 20 41 53 20 28  ITH c(n, d) AS (
1640: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 6e  .      SELECT 'n
1650: 6f 74 61 64 69 72 27 2c 20 27 27 0a 20 20 20 20  otadir', ''.    
1660: 29 0a 20 20 20 20 53 45 4c 45 43 54 20 7a 69 70  ).    SELECT zip
1670: 66 69 6c 65 28 6e 2c 20 64 29 20 46 52 4f 4d 20  file(n, d) FROM 
1680: 63 0a 20 7d 5d 0a 0a 20 20 73 65 74 20 68 65 78  c. }]..  set hex
1690: 20 5b 62 69 6e 61 72 79 20 65 6e 63 6f 64 65 20   [binary encode 
16a0: 68 65 78 20 24 62 6c 6f 62 5d 0a 20 20 73 65 74  hex $blob].  set
16b0: 20 68 65 78 20 5b 73 74 72 69 6e 67 20 6d 61 70   hex [string map
16c0: 20 7b 36 65 36 66 37 34 36 31 36 34 36 39 37 32   {6e6f7461646972
16d0: 20 36 65 36 66 37 34 36 31 36 34 36 39 32 66 7d   6e6f746164692f}
16e0: 20 24 68 65 78 5d 20 0a 20 20 73 65 74 20 62 6c   $hex] .  set bl
16f0: 6f 62 32 20 5b 62 69 6e 61 72 79 20 64 65 63 6f  ob2 [binary deco
1700: 64 65 20 68 65 78 20 24 68 65 78 5d 0a 0a 20 20  de hex $hex]..  
1710: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
1720: 20 6e 61 6d 65 2c 20 64 61 74 61 20 49 53 20 4e   name, data IS N
1730: 55 4c 4c 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65  ULL FROM zipfile
1740: 28 24 62 6c 6f 62 32 29 20 7d 0a 7d 20 7b 6e 6f  ($blob2) }.} {no
1750: 74 61 64 69 2f 20 31 7d 0a 0a 23 2d 2d 2d 2d 2d  tadi/ 1}..#-----
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17a0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
17b0: 20 64 75 70 6c 69 63 61 74 65 20 65 6e 74 72 69   duplicate entri
17c0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 72  es may not be cr
17d0: 65 61 74 65 64 20 75 73 69 6e 67 20 55 50 44 41  eated using UPDA
17e0: 54 45 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 2e  TE.# statements.
17f0: 0a 23 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .#.forcedelete t
1800: 65 73 74 2e 7a 69 70 0a 64 6f 5f 65 78 65 63 73  est.zip.do_execs
1810: 71 6c 5f 74 65 73 74 20 36 2e 30 20 7b 0a 20 20  ql_test 6.0 {.  
1820: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1830: 41 42 4c 45 20 74 65 6d 70 2e 7a 69 70 20 55 53  ABLE temp.zip US
1840: 49 4e 47 20 7a 69 70 66 69 6c 65 28 27 74 65 73  ING zipfile('tes
1850: 74 2e 7a 69 70 27 29 3b 20 0a 20 20 49 4e 53 45  t.zip'); .  INSE
1860: 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e 7a 69 70  RT INTO temp.zip
1870: 20 28 6e 61 6d 65 2c 64 61 74 61 29 20 56 41 4c   (name,data) VAL
1880: 55 45 53 20 28 27 74 65 73 74 31 27 2c 27 74 65  UES ('test1','te
1890: 73 74 27 29 3b 20 0a 20 20 49 4e 53 45 52 54 20  st'); .  INSERT 
18a0: 49 4e 54 4f 20 74 65 6d 70 2e 7a 69 70 20 28 6e  INTO temp.zip (n
18b0: 61 6d 65 2c 64 61 74 61 29 20 56 41 4c 55 45 53  ame,data) VALUES
18c0: 20 28 27 74 65 73 74 32 27 2c 27 74 65 73 74 27   ('test2','test'
18d0: 29 3b 20 0a 7d 0a 64 6f 5f 63 61 74 63 68 73 71  ); .}.do_catchsq
18e0: 6c 5f 74 65 73 74 20 36 2e 31 20 7b 0a 20 20 55  l_test 6.1 {.  U
18f0: 50 44 41 54 45 20 74 65 6d 70 2e 7a 69 70 20 53  PDATE temp.zip S
1900: 45 54 20 6e 61 6d 65 3d 27 74 65 73 74 31 27 20  ET name='test1' 
1910: 57 48 45 52 45 20 6e 61 6d 65 3d 27 74 65 73 74  WHERE name='test
1920: 32 27 0a 7d 20 7b 31 20 7b 64 75 70 6c 69 63 61  2'.} {1 {duplica
1930: 74 65 20 6e 61 6d 65 3a 20 22 74 65 73 74 31 22  te name: "test1"
1940: 7d 7d 0a 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  }}..forcedelete 
1950: 74 65 73 74 2e 7a 69 70 0a 64 6f 5f 63 61 74 63  test.zip.do_catc
1960: 68 73 71 6c 5f 74 65 73 74 20 36 2e 32 20 7b 0a  hsql_test 6.2 {.
1970: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 7a 69 70    DROP TABLE zip
1980: 3b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  ;.  CREATE VIRTU
1990: 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e 7a 69  AL TABLE temp.zi
19a0: 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28  p USING zipfile(
19b0: 27 74 65 73 74 2e 7a 69 70 27 29 3b 20 0a 20 20  'test.zip'); .  
19c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 6d 70  INSERT INTO temp
19d0: 2e 7a 69 70 20 28 6e 61 6d 65 2c 64 61 74 61 29  .zip (name,data)
19e0: 20 56 41 4c 55 45 53 20 28 27 74 65 73 74 27 2c   VALUES ('test',
19f0: 27 74 65 73 74 27 29 3b 20 0a 20 20 55 50 44 41  'test'); .  UPDA
1a00: 54 45 20 20 74 65 6d 70 2e 7a 69 70 20 73 65 74  TE  temp.zip set
1a10: 20 6e 61 6d 65 3d 6e 61 6d 65 7c 7c 27 6e 65 77   name=name||'new
1a20: 27 20 77 68 65 72 65 20 6e 61 6d 65 3d 27 74 65  ' where name='te
1a30: 73 74 27 3b 20 0a 20 20 49 4e 53 45 52 54 20 49  st'; .  INSERT I
1a40: 4e 54 4f 20 74 65 6d 70 2e 7a 69 70 20 28 6e 61  NTO temp.zip (na
1a50: 6d 65 2c 64 61 74 61 29 20 56 41 4c 55 45 53 20  me,data) VALUES 
1a60: 28 27 74 65 73 74 27 2c 27 74 65 73 74 27 29 3b  ('test','test');
1a70: 20 0a 20 20 55 50 44 41 54 45 20 20 74 65 6d 70   .  UPDATE  temp
1a80: 2e 7a 69 70 20 73 65 74 20 6e 61 6d 65 3d 6e 61  .zip set name=na
1a90: 6d 65 7c 7c 27 6e 65 77 27 20 77 68 65 72 65 20  me||'new' where 
1aa0: 6e 61 6d 65 3d 27 74 65 73 74 27 3b 20 0a 7d 20  name='test'; .} 
1ab0: 7b 31 20 7b 64 75 70 6c 69 63 61 74 65 20 6e 61  {1 {duplicate na
1ac0: 6d 65 3a 20 22 74 65 73 74 6e 65 77 22 7d 7d 0a  me: "testnew"}}.
1ad0: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
1ae0: 74 2e 7a 69 70 0a 64 6f 5f 65 78 65 63 73 71 6c  t.zip.do_execsql
1af0: 5f 74 65 73 74 20 36 2e 33 20 7b 0a 20 20 49 4e  _test 6.3 {.  IN
1b00: 53 45 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e 7a  SERT INTO temp.z
1b10: 69 70 20 28 6e 61 6d 65 2c 64 61 74 61 29 20 56  ip (name,data) V
1b20: 41 4c 55 45 53 20 28 27 74 65 73 74 31 27 2c 27  ALUES ('test1','
1b30: 74 65 73 74 27 29 3b 20 0a 20 20 49 4e 53 45 52  test'); .  INSER
1b40: 54 20 49 4e 54 4f 20 74 65 6d 70 2e 7a 69 70 20  T INTO temp.zip 
1b50: 28 6e 61 6d 65 2c 64 61 74 61 29 20 56 41 4c 55  (name,data) VALU
1b60: 45 53 20 28 27 74 65 73 74 32 27 2c 27 74 65 73  ES ('test2','tes
1b70: 74 27 29 3b 20 0a 20 20 55 50 44 41 54 45 20 4f  t'); .  UPDATE O
1b80: 52 20 52 45 50 4c 41 43 45 20 7a 69 70 20 53 45  R REPLACE zip SE
1b90: 54 20 6e 61 6d 65 3d 27 74 65 73 74 32 27 20 57  T name='test2' W
1ba0: 48 45 52 45 20 6e 61 6d 65 3d 27 74 65 73 74 31  HERE name='test1
1bb0: 27 3b 0a 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  ';.  SELECT name
1bc0: 20 46 52 4f 4d 20 7a 69 70 3b 0a 7d 20 7b 74 65   FROM zip;.} {te
1bd0: 73 74 32 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73  st2}..finish_tes
1be0: 74 0a                                            t.