/ Hex Artifact Content
Login

Artifact b3b558639f7a103e095713ad0f57fec1fce1b7d60c8054df5789b98f7547a395:


0000: 23 20 32 30 31 37 20 44 65 63 65 6d 62 65 72 20  # 2017 December 
0010: 39 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  9.#.# 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 0a 0a 69 66 63 61 70 61 62  zipfile..ifcapab
01e0: 6c 65 20 21 76 74 61 62 20 7b 0a 20 20 66 69 6e  le !vtab {.  fin
01f0: 69 73 68 5f 74 65 73 74 3b 20 72 65 74 75 72 6e  ish_test; return
0200: 0a 7d 0a 69 66 20 7b 5b 63 61 74 63 68 20 7b 6c  .}.if {[catch {l
0210: 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e  oad_static_exten
0220: 73 69 6f 6e 20 64 62 20 7a 69 70 66 69 6c 65 7d  sion db zipfile}
0230: 20 65 72 72 6f 72 5d 7d 20 7b 0a 20 20 70 75 74   error]} {.  put
0240: 73 20 22 53 6b 69 70 70 69 6e 67 20 7a 69 70 66  s "Skipping zipf
0250: 69 6c 65 20 74 65 73 74 73 2c 20 68 69 74 20 6c  ile tests, hit l
0260: 6f 61 64 20 65 72 72 6f 72 3a 20 24 65 72 72 6f  oad error: $erro
0270: 72 22 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74  r".  finish_test
0280: 3b 20 72 65 74 75 72 6e 0a 7d 0a 69 66 20 7b 5b  ; return.}.if {[
0290: 63 61 74 63 68 20 7b 6c 6f 61 64 5f 73 74 61 74  catch {load_stat
02a0: 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 64 62 20  ic_extension db 
02b0: 66 69 6c 65 69 6f 7d 20 65 72 72 6f 72 5d 7d 20  fileio} error]} 
02c0: 7b 0a 20 20 70 75 74 73 20 22 53 6b 69 70 70 69  {.  puts "Skippi
02d0: 6e 67 20 7a 69 70 66 69 6c 65 20 74 65 73 74 73  ng zipfile tests
02e0: 2c 20 68 69 74 20 6c 6f 61 64 20 65 72 72 6f 72  , hit load error
02f0: 3a 20 24 65 72 72 6f 72 22 0a 20 20 66 69 6e 69  : $error".  fini
0300: 73 68 5f 74 65 73 74 3b 20 72 65 74 75 72 6e 0a  sh_test; return.
0310: 7d 0a 0a 70 72 6f 63 20 72 65 61 64 66 69 6c 65  }..proc readfile
0320: 20 7b 66 7d 20 7b 0a 20 20 73 65 74 20 66 64 20   {f} {.  set fd 
0330: 5b 6f 70 65 6e 20 24 66 5d 0a 20 20 66 63 6f 6e  [open $f].  fcon
0340: 66 69 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e  figure $fd -tran
0350: 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 2d  slation binary -
0360: 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 0a  encoding binary.
0370: 20 20 73 65 74 20 64 61 74 61 20 5b 72 65 61 64    set data [read
0380: 20 24 66 64 5d 0a 20 20 63 6c 6f 73 65 20 24 66   $fd].  close $f
0390: 64 0a 20 20 73 65 74 20 64 61 74 61 0a 7d 0a 0a  d.  set data.}..
03a0: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
03b0: 6e 20 3a 3a 55 4e 5a 49 50 0a 0a 69 66 20 7b 5b  n ::UNZIP..if {[
03c0: 63 61 74 63 68 20 7b 65 78 65 63 20 75 6e 7a 69  catch {exec unzi
03d0: 70 7d 20 6d 73 67 5d 3d 3d 30 20 26 26 20 5c 0a  p} msg]==0 && \.
03e0: 20 20 20 20 5b 72 65 67 65 78 70 20 2d 6c 69 6e      [regexp -lin
03f0: 65 20 7b 5e 55 6e 5a 69 70 20 5c 64 2b 5c 2e 5c  e {^UnZip \d+\.\
0400: 64 2b 20 2e 2a 3f 20 49 6e 66 6f 2d 5a 49 50 5c  d+ .*? Info-ZIP\
0410: 2e 7d 20 24 6d 73 67 5d 7d 20 7b 0a 20 20 73 65  .} $msg]} {.  se
0420: 74 20 3a 3a 55 4e 5a 49 50 20 75 6e 7a 69 70 0a  t ::UNZIP unzip.
0430: 20 20 70 72 6f 63 20 66 69 78 5f 73 74 61 74 5f    proc fix_stat_
0440: 6d 6f 64 65 20 7b 6e 61 6d 65 20 6d 6f 64 65 7d  mode {name mode}
0450: 20 7b 0a 20 20 20 20 69 66 20 7b 24 3a 3a 74 63   {.    if {$::tc
0460: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
0470: 6f 72 6d 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d  orm)=="windows"}
0480: 20 7b 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20   {.      #.     
0490: 20 23 20 4e 4f 54 45 3a 20 53 65 74 20 6f 72 20   # NOTE: Set or 
04a0: 75 6e 73 65 74 20 74 68 65 20 77 72 69 74 65 20  unset the write 
04b0: 62 69 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65  bits of the file
04c0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20 20   permissions.   
04d0: 20 20 20 23 20 20 20 20 20 20 20 62 61 73 65 64     #       based
04e0: 20 6f 6e 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c   on the read-onl
04f0: 79 20 61 74 74 72 69 62 75 74 65 20 62 65 63 61  y attribute beca
0500: 75 73 65 20 74 68 65 20 57 69 6e 33 32 0a 20 20  use the Win32.  
0510: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73      #       vers
0520: 69 6f 6e 20 6f 66 20 55 6e 5a 69 70 20 64 6f 65  ion of UnZip doe
0530: 73 20 74 68 69 73 2e 0a 20 20 20 20 20 20 23 0a  s this..      #.
0540: 20 20 20 20 20 20 73 65 74 20 77 72 69 74 65 62        set writeb
0550: 69 74 73 20 30 78 31 32 3b 20 23 20 30 6f 32 32  its 0x12; # 0o22
0560: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
0570: 74 20 24 6d 6f 64 65 0a 20 20 20 20 20 20 69 66  t $mode.      if
0580: 20 7b 5b 66 69 6c 65 20 61 74 74 72 69 62 75 74   {[file attribut
0590: 65 73 20 24 6e 61 6d 65 20 2d 72 65 61 64 6f 6e  es $name -readon
05a0: 6c 79 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  ly]} {.        s
05b0: 65 74 20 72 65 73 75 6c 74 20 5b 65 78 70 72 20  et result [expr 
05c0: 7b 24 72 65 73 75 6c 74 20 7c 20 24 77 72 69 74  {$result | $writ
05d0: 65 62 69 74 73 7d 5d 0a 20 20 20 20 20 20 7d 20  ebits}].      } 
05e0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
05f0: 65 74 20 72 65 73 75 6c 74 20 5b 65 78 70 72 20  et result [expr 
0600: 7b 24 72 65 73 75 6c 74 20 26 20 7e 24 77 72 69  {$result & ~$wri
0610: 74 65 62 69 74 73 7d 5d 0a 20 20 20 20 20 20 7d  tebits}].      }
0620: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
0630: 65 73 75 6c 74 0a 20 20 20 20 7d 20 65 6c 73 65  esult.    } else
0640: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
0650: 24 6d 6f 64 65 0a 20 20 20 20 7d 0a 20 20 7d 0a  $mode.    }.  }.
0660: 20 20 70 72 6f 63 20 64 6f 5f 75 6e 7a 69 70 20    proc do_unzip 
0670: 7b 66 69 6c 65 7d 20 7b 0a 20 20 20 20 66 6f 72  {file} {.    for
0680: 63 65 64 65 6c 65 74 65 20 74 65 73 74 5f 75 6e  cedelete test_un
0690: 7a 69 70 0a 20 20 20 20 66 69 6c 65 20 6d 6b 64  zip.    file mkd
06a0: 69 72 20 74 65 73 74 5f 75 6e 7a 69 70 0a 20 20  ir test_unzip.  
06b0: 20 20 65 78 65 63 20 24 3a 3a 55 4e 5a 49 50 20    exec $::UNZIP 
06c0: 2d 64 20 74 65 73 74 5f 75 6e 7a 69 70 20 24 66  -d test_unzip $f
06d0: 69 6c 65 0a 0a 20 20 20 20 64 62 20 66 75 6e 63  ile..    db func
06e0: 20 6d 6f 64 65 66 69 78 20 66 69 78 5f 73 74 61   modefix fix_sta
06f0: 74 5f 6d 6f 64 65 0a 0a 20 20 20 20 73 65 74 20  t_mode..    set 
0700: 72 65 73 20 5b 64 62 20 65 76 61 6c 20 7b 0a 20  res [db eval {. 
0710: 20 20 20 20 20 53 45 4c 45 43 54 20 72 65 70 6c       SELECT repl
0720: 61 63 65 28 6e 61 6d 65 2c 27 74 65 73 74 5f 75  ace(name,'test_u
0730: 6e 7a 69 70 2f 27 2c 27 27 29 2c 6d 6f 64 65 66  nzip/',''),modef
0740: 69 78 28 6e 61 6d 65 2c 6d 6f 64 65 29 2c 6d 74  ix(name,mode),mt
0750: 69 6d 65 2c 64 61 74 61 0a 20 20 20 20 20 20 46  ime,data.      F
0760: 52 4f 4d 20 66 73 64 69 72 28 27 74 65 73 74 5f  ROM fsdir('test_
0770: 75 6e 7a 69 70 27 29 20 0a 20 20 20 20 20 20 57  unzip') .      W
0780: 48 45 52 45 20 6e 61 6d 65 21 3d 27 74 65 73 74  HERE name!='test
0790: 5f 75 6e 7a 69 70 27 0a 20 20 20 20 20 20 4f 52  _unzip'.      OR
07a0: 44 45 52 20 42 59 20 6e 61 6d 65 0a 20 20 20 20  DER BY name.    
07b0: 7d 5d 0a 20 20 20 20 73 65 74 20 72 65 73 0a 20  }].    set res. 
07c0: 20 7d 0a 7d 0a 0a 0a 23 20 54 68 65 20 61 72 67   }.}...# The arg
07d0: 75 6d 65 6e 74 20 69 73 20 61 20 62 6c 6f 62 20  ument is a blob 
07e0: 28 6e 6f 74 20 61 20 68 65 78 20 73 74 72 69 6e  (not a hex strin
07f0: 67 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  g) containing a 
0800: 7a 69 70 20 61 72 63 68 69 76 65 2e 0a 23 20 54  zip archive..# T
0810: 68 69 73 20 70 72 6f 63 20 72 65 6d 6f 76 65 73  his proc removes
0820: 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 74 69   the extended ti
0830: 6d 65 73 74 61 6d 70 20 66 69 65 6c 64 73 20 66  mestamp fields f
0840: 72 6f 6d 20 74 68 65 20 61 72 63 68 69 76 65 0a  rom the archive.
0850: 23 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  # and returns th
0860: 65 20 72 65 73 75 6c 74 2e 0a 23 0a 70 72 6f 63  e result..#.proc
0870: 20 72 65 6d 6f 76 65 5f 74 69 6d 65 73 74 61 6d   remove_timestam
0880: 70 73 20 7b 62 6c 6f 62 7d 20 7b 0a 20 20 73 65  ps {blob} {.  se
0890: 74 20 68 65 78 20 5b 62 69 6e 61 72 79 20 65 6e  t hex [binary en
08a0: 63 6f 64 65 20 68 65 78 20 24 62 6c 6f 62 5d 0a  code hex $blob].
08b0: 20 20 73 65 74 20 68 65 78 20 5b 73 74 72 69 6e    set hex [strin
08c0: 67 20 6d 61 70 20 7b 35 35 35 34 30 35 30 30 20  g map {55540500 
08d0: 30 30 30 30 30 35 30 30 7d 20 24 68 65 78 5d 0a  00000500} $hex].
08e0: 20 20 62 69 6e 61 72 79 20 64 65 63 6f 64 65 20    binary decode 
08f0: 68 65 78 20 24 68 65 78 0a 7d 0a 0a 0a 23 20 41  hex $hex.}...# A
0900: 72 67 75 6d 65 6e 74 20 24 66 69 6c 65 20 69 73  rgument $file is
0910: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 7a   the name of a z
0920: 69 70 20 61 72 63 68 69 76 65 20 6f 6e 20 64 69  ip archive on di
0930: 73 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  sk. This functio
0940: 6e 0a 23 20 65 78 65 63 75 74 65 73 20 74 65 73  n.# executes tes
0950: 74 20 63 61 73 65 73 20 74 6f 20 63 68 65 63 6b  t cases to check
0960: 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
0970: 73 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  s of each of the
0980: 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 23 20 61 72   following .# ar
0990: 65 20 74 68 65 20 73 61 6d 65 3a 0a 23 0a 23 20  e the same:.#.# 
09a0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
09b0: 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 24 66   FROM zipfile($f
09c0: 69 6c 65 29 0a 23 20 20 20 20 20 20 20 20 20 53  ile).#         S
09d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 7a 69 70  ELECT * FROM zip
09e0: 66 69 6c 65 28 20 72 65 61 64 66 69 6c 65 28 24  file( readfile($
09f0: 66 69 6c 65 29 20 29 0a 23 20 20 20 20 20 20 20  file) ).#       
0a00: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0a10: 7a 69 70 66 69 6c 65 28 20 0a 23 20 20 20 20 20  zipfile( .#     
0a20: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 7a 69        (SELECT zi
0a30: 70 66 69 6c 65 28 6e 61 6d 65 2c 6d 6f 64 65 2c  pfile(name,mode,
0a40: 6d 74 69 6d 65 2c 64 61 74 61 2c 6d 65 74 68 6f  mtime,data,metho
0a50: 64 29 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28  d) FROM zipfile(
0a60: 24 66 69 6c 65 29 29 0a 23 20 20 20 20 20 20 20  $file)).#       
0a70: 20 20 29 0a 23 0a 70 72 6f 63 20 64 6f 5f 7a 69    ).#.proc do_zi
0a80: 70 66 69 6c 65 5f 62 6c 6f 62 5f 74 65 73 74 20  pfile_blob_test 
0a90: 7b 74 6e 20 66 69 6c 65 7d 20 7b 0a 0a 20 20 64  {tn file} {..  d
0aa0: 62 20 66 75 6e 63 20 72 20 72 65 61 64 66 69 6c  b func r readfil
0ab0: 65 0a 20 20 73 65 74 20 71 31 20 7b 53 45 4c 45  e.  set q1 {SELE
0ac0: 43 54 20 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69  CT name,mode,mti
0ad0: 6d 65 2c 6d 65 74 68 6f 64 2c 71 75 6f 74 65 28  me,method,quote(
0ae0: 64 61 74 61 29 20 46 52 4f 4d 20 7a 69 70 66 69  data) FROM zipfi
0af0: 6c 65 28 24 66 69 6c 65 29 7d 0a 20 20 73 65 74  le($file)}.  set
0b00: 20 71 32 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65   q2 {SELECT name
0b10: 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 6d 65 74 68  ,mode,mtime,meth
0b20: 6f 64 2c 71 75 6f 74 65 28 64 61 74 61 29 20 46  od,quote(data) F
0b30: 52 4f 4d 20 7a 69 70 66 69 6c 65 28 20 72 28 24  ROM zipfile( r($
0b40: 66 69 6c 65 29 20 29 7d 0a 20 20 73 65 74 20 71  file) )}.  set q
0b50: 33 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65 2c 6d  3 {SELECT name,m
0b60: 6f 64 65 2c 6d 74 69 6d 65 2c 6d 65 74 68 6f 64  ode,mtime,method
0b70: 2c 71 75 6f 74 65 28 64 61 74 61 29 20 46 52 4f  ,quote(data) FRO
0b80: 4d 20 7a 69 70 66 69 6c 65 28 0a 20 20 20 20 28  M zipfile(.    (
0b90: 20 53 45 4c 45 43 54 20 7a 69 70 66 69 6c 65 28   SELECT zipfile(
0ba0: 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c  name,mode,mtime,
0bb0: 64 61 74 61 2c 6d 65 74 68 6f 64 29 20 46 52 4f  data,method) FRO
0bc0: 4d 20 7a 69 70 66 69 6c 65 28 24 66 69 6c 65 29  M zipfile($file)
0bd0: 20 29 0a 20 20 29 7d 0a 0a 0a 20 20 73 65 74 20   ).  )}...  set 
0be0: 72 31 20 5b 64 62 20 65 76 61 6c 20 24 71 31 5d  r1 [db eval $q1]
0bf0: 0a 20 20 73 65 74 20 72 32 20 5b 64 62 20 65 76  .  set r2 [db ev
0c00: 61 6c 20 24 71 32 5d 0a 20 20 73 65 74 20 72 33  al $q2].  set r3
0c10: 20 5b 64 62 20 65 76 61 6c 20 24 71 33 5d 0a 20   [db eval $q3]. 
0c20: 20 23 70 75 74 73 20 24 72 31 0a 20 20 23 70 75   #puts $r1.  #pu
0c30: 74 73 20 24 72 32 0a 20 20 23 70 75 74 73 20 24  ts $r2.  #puts $
0c40: 72 33 0a 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c  r3..  uplevel [l
0c50: 69 73 74 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e  ist do_test $tn.
0c60: 31 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24  1 [list set {} $
0c70: 72 32 5d 20 24 72 31 5d 0a 20 20 75 70 6c 65 76  r2] $r1].  uplev
0c80: 65 6c 20 5b 6c 69 73 74 20 64 6f 5f 74 65 73 74  el [list do_test
0c90: 20 24 74 6e 2e 32 20 5b 6c 69 73 74 20 73 65 74   $tn.2 [list set
0ca0: 20 7b 7d 20 24 72 33 5d 20 24 72 31 5d 0a 7d 0a   {} $r3] $r1].}.
0cb0: 0a 23 20 41 72 67 75 6d 65 6e 74 20 24 66 69 6c  .# Argument $fil
0cc0: 65 20 69 73 20 61 20 7a 69 70 20 66 69 6c 65 20  e is a zip file 
0cd0: 6f 6e 20 64 69 73 6b 2e 20 54 68 69 73 20 63 6f  on disk. This co
0ce0: 6d 6d 61 6e 64 20 72 75 6e 73 20 74 65 73 74 73  mmand runs tests
0cf0: 20 74 6f 3a 0a 23 0a 23 20 20 20 31 2e 20 55 6e   to:.#.#   1. Un
0d00: 70 61 63 6b 20 74 68 65 20 61 72 63 68 69 76 65  pack the archive
0d10: 20 77 69 74 68 20 75 6e 69 78 20 63 6f 6d 6d 61   with unix comma
0d20: 6e 64 20 5b 75 6e 7a 69 70 5d 20 61 6e 64 20 63  nd [unzip] and c
0d30: 6f 6d 70 61 72 65 20 74 68 65 20 0a 23 20 20 20  ompare the .#   
0d40: 20 20 20 72 65 73 75 6c 74 73 20 74 6f 20 72 65     results to re
0d50: 61 64 69 6e 67 20 74 68 65 20 73 61 6d 65 20 61  ading the same a
0d60: 72 63 68 69 76 65 20 75 73 69 6e 67 20 74 68 65  rchive using the
0d70: 20 7a 69 70 66 69 6c 65 28 29 20 74 61 62 6c 65   zipfile() table
0d80: 0a 23 20 20 20 20 20 20 76 61 6c 75 65 64 20 66  .#      valued f
0d90: 75 6e 63 74 69 6f 6e 2e 0a 23 0a 23 20 20 20 32  unction..#.#   2
0da0: 2e 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 20  . Creates a new 
0db0: 61 72 63 68 69 76 65 20 77 69 74 68 20 74 68 65  archive with the
0dc0: 20 73 61 6d 65 20 63 6f 6e 74 65 6e 74 73 20 75   same contents u
0dd0: 73 69 6e 67 20 74 68 65 20 7a 69 70 66 69 6c 65  sing the zipfile
0de0: 28 29 0a 23 20 20 20 20 20 20 61 67 67 72 65 67  ().#      aggreg
0df0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  ate function as 
0e00: 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 20  follows:.#.#    
0e10: 20 20 53 45 4c 45 43 54 20 77 72 69 74 65 66 69    SELECT writefi
0e20: 6c 65 28 27 74 65 73 74 5f 75 6e 7a 69 70 2e 7a  le('test_unzip.z
0e30: 69 70 27 2c 0a 23 20 20 20 20 20 20 20 20 20 20  ip',.#          
0e40: 28 20 53 45 4c 45 43 54 20 7a 69 70 66 69 6c 65  ( SELECT zipfile
0e50: 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65  (name,mode,mtime
0e60: 2c 64 61 74 61 2c 6d 65 74 68 6f 64 29 20 46 52  ,data,method) FR
0e70: 4f 4d 20 7a 69 70 66 69 6c 65 28 24 66 69 6c 65  OM zipfile($file
0e80: 29 20 29 0a 23 20 20 20 20 20 20 29 3b 0a 23 0a  ) ).#      );.#.
0e90: 23 20 20 20 20 20 20 54 68 65 6e 20 74 65 73 74  #      Then test
0ea0: 73 20 74 68 61 74 20 75 6e 70 61 63 6b 69 6e 67  s that unpacking
0eb0: 20 74 68 65 20 6e 65 77 20 61 72 63 68 69 76 65   the new archive
0ec0: 20 75 73 69 6e 67 20 5b 75 6e 7a 69 70 5d 20 70   using [unzip] p
0ed0: 72 6f 64 75 63 65 73 0a 23 20 20 20 20 20 20 74  roduces.#      t
0ee0: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 73 20  he same results 
0ef0: 61 73 20 69 6e 20 28 31 29 2e 0a 23 0a 70 72 6f  as in (1)..#.pro
0f00: 63 20 64 6f 5f 75 6e 7a 69 70 5f 74 65 73 74 20  c do_unzip_test 
0f10: 7b 74 6e 20 66 69 6c 65 7d 20 7b 0a 20 20 64 62  {tn file} {.  db
0f20: 20 66 75 6e 63 20 73 73 73 20 73 74 72 69 70 5f   func sss strip_
0f30: 73 6c 61 73 68 0a 0a 20 20 64 62 20 65 76 61 6c  slash..  db eval
0f40: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 77 72   {.    SELECT wr
0f50: 69 74 65 66 69 6c 65 28 27 74 65 73 74 5f 75 6e  itefile('test_un
0f60: 7a 69 70 2e 7a 69 70 27 2c 0a 20 20 20 20 20 20  zip.zip',.      
0f70: 20 20 28 20 53 45 4c 45 43 54 20 7a 69 70 66 69    ( SELECT zipfi
0f80: 6c 65 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69  le(name,mode,mti
0f90: 6d 65 2c 64 61 74 61 2c 6d 65 74 68 6f 64 29 20  me,data,method) 
0fa0: 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 24 66 69  FROM zipfile($fi
0fb0: 6c 65 29 20 29 0a 20 20 20 20 29 3b 0a 20 20 7d  le) ).    );.  }
0fc0: 0a 0a 20 20 73 65 74 20 72 31 20 5b 64 62 20 65  ..  set r1 [db e
0fd0: 76 61 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45 43  val { .    SELEC
0fe0: 54 20 73 73 73 28 6e 61 6d 65 29 2c 6d 6f 64 65  T sss(name),mode
0ff0: 2c 6d 74 69 6d 65 2c 64 61 74 61 20 46 52 4f 4d  ,mtime,data FROM
1000: 20 7a 69 70 66 69 6c 65 28 24 66 69 6c 65 29 20   zipfile($file) 
1010: 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 0a 20 20  ORDER BY name.  
1020: 7d 5d 0a 20 20 73 65 74 20 72 32 20 5b 64 6f 5f  }].  set r2 [do_
1030: 75 6e 7a 69 70 20 24 66 69 6c 65 5d 0a 20 20 73  unzip $file].  s
1040: 65 74 20 72 33 20 5b 64 6f 5f 75 6e 7a 69 70 20  et r3 [do_unzip 
1050: 74 65 73 74 5f 75 6e 7a 69 70 2e 7a 69 70 5d 0a  test_unzip.zip].
1060: 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74  .  uplevel [list
1070: 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e 31 20 5b   do_test $tn.1 [
1080: 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72 32 5d  list set {} $r2]
1090: 20 24 72 31 5d 0a 20 20 75 70 6c 65 76 65 6c 20   $r1].  uplevel 
10a0: 5b 6c 69 73 74 20 64 6f 5f 74 65 73 74 20 24 74  [list do_test $t
10b0: 6e 2e 32 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d  n.2 [list set {}
10c0: 20 24 72 33 5d 20 24 72 31 5d 0a 7d 0a 70 72 6f   $r3] $r1].}.pro
10d0: 63 20 73 74 72 69 70 5f 73 6c 61 73 68 20 7b 69  c strip_slash {i
10e0: 6e 7d 20 7b 20 72 65 67 73 75 62 20 7b 2f 24 7d  n} { regsub {/$}
10f0: 20 24 69 6e 20 7b 7d 20 7d 0a 0a 70 72 6f 63 20   $in {} }..proc 
1100: 64 6f 5f 7a 69 70 5f 74 65 73 74 73 20 7b 74 6e  do_zip_tests {tn
1110: 20 66 69 6c 65 7d 20 7b 0a 20 20 75 70 6c 65 76   file} {.  uplev
1120: 65 6c 20 64 6f 5f 7a 69 70 66 69 6c 65 5f 62 6c  el do_zipfile_bl
1130: 6f 62 5f 74 65 73 74 20 24 74 6e 2e 31 20 24 66  ob_test $tn.1 $f
1140: 69 6c 65 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ile.  if {[info 
1150: 65 78 69 73 74 73 20 3a 3a 55 4e 5a 49 50 5d 7d  exists ::UNZIP]}
1160: 20 7b 0a 20 20 20 20 75 70 6c 65 76 65 6c 20 64   {.    uplevel d
1170: 6f 5f 75 6e 7a 69 70 5f 74 65 73 74 20 24 74 6e  o_unzip_test $tn
1180: 2e 32 20 24 66 69 6c 65 0a 20 20 7d 0a 7d 0a 0a  .2 $file.  }.}..
1190: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
11a0: 2e 7a 69 70 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  .zip.do_execsql_
11b0: 74 65 73 74 20 31 2e 30 20 7b 0a 20 20 43 52 45  test 1.0 {.  CRE
11c0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
11d0: 45 20 74 65 6d 70 2e 7a 7a 20 55 53 49 4e 47 20  E temp.zz USING 
11e0: 7a 69 70 66 69 6c 65 28 27 74 65 73 74 2e 7a 69  zipfile('test.zi
11f0: 70 27 29 3b 0a 20 20 50 52 41 47 4d 41 20 74 61  p');.  PRAGMA ta
1200: 62 6c 65 5f 69 6e 66 6f 28 7a 7a 29 3b 0a 7d 20  ble_info(zz);.} 
1210: 7b 0a 20 20 30 20 6e 61 6d 65 20 7b 7d 20 31 20  {.  0 name {} 1 
1220: 7b 7d 20 31 20 0a 20 20 31 20 6d 6f 64 65 20 7b  {} 1 .  1 mode {
1230: 7d 20 30 20 7b 7d 20 30 20 0a 20 20 32 20 6d 74  } 0 {} 0 .  2 mt
1240: 69 6d 65 20 7b 7d 20 30 20 7b 7d 20 30 20 0a 20  ime {} 0 {} 0 . 
1250: 20 33 20 73 7a 20 7b 7d 20 30 20 7b 7d 20 30 20   3 sz {} 0 {} 0 
1260: 0a 20 20 34 20 72 61 77 64 61 74 61 20 7b 7d 20  .  4 rawdata {} 
1270: 30 20 7b 7d 20 30 0a 20 20 35 20 64 61 74 61 20  0 {} 0.  5 data 
1280: 7b 7d 20 30 20 7b 7d 20 30 0a 20 20 36 20 6d 65  {} 0 {} 0.  6 me
1290: 74 68 6f 64 20 7b 7d 20 30 20 7b 7d 20 30 0a 7d  thod {} 0 {} 0.}
12a0: 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  ..do_catchsql_te
12b0: 73 74 20 31 2e 31 2e 30 2e 31 20 7b 0a 20 20 49  st 1.1.0.1 {.  I
12c0: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 28 6e 61  NSERT INTO zz(na
12d0: 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 2c  me, mode, mtime,
12e0: 20 73 7a 2c 20 72 61 77 64 61 74 61 2c 20 6d 65   sz, rawdata, me
12f0: 74 68 6f 64 29 20 0a 20 20 56 41 4c 55 45 53 28  thod) .  VALUES(
1300: 27 66 2e 74 78 74 27 2c 20 27 2d 72 77 2d 72 2d  'f.txt', '-rw-r-
1310: 2d 72 2d 2d 27 2c 20 31 30 30 30 30 30 30 30 30  -r--', 100000000
1320: 30 2c 20 35 2c 20 27 61 62 63 64 65 27 2c 20 30  0, 5, 'abcde', 0
1330: 29 3b 0a 7d 20 7b 31 20 7b 72 61 77 64 61 74 61  );.} {1 {rawdata
1340: 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 7d 7d 0a   must be NULL}}.
1350: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
1360: 20 31 2e 31 2e 30 2e 32 20 7b 0a 20 20 49 4e 53   1.1.0.2 {.  INS
1370: 45 52 54 20 49 4e 54 4f 20 7a 7a 28 6e 61 6d 65  ERT INTO zz(name
1380: 2c 20 6d 74 69 6d 65 2c 20 73 7a 2c 20 64 61 74  , mtime, sz, dat
1390: 61 2c 20 6d 65 74 68 6f 64 29 20 0a 20 20 56 41  a, method) .  VA
13a0: 4c 55 45 53 28 27 67 2e 74 78 74 27 2c 20 31 30  LUES('g.txt', 10
13b0: 30 30 30 30 30 30 30 32 2c 20 35 2c 20 27 31 32  00000002, 5, '12
13c0: 33 34 35 27 2c 20 30 29 3b 0a 7d 20 7b 31 20 7b  345', 0);.} {1 {
13d0: 73 7a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 7d  sz must be NULL}
13e0: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
13f0: 73 74 20 31 2e 31 2e 30 2e 33 20 7b 0a 20 20 49  st 1.1.0.3 {.  I
1400: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 28 6e 61  NSERT INTO zz(na
1410: 6d 65 2c 20 6d 74 69 6d 65 2c 20 72 61 77 64 61  me, mtime, rawda
1420: 74 61 2c 20 6d 65 74 68 6f 64 29 20 0a 20 20 56  ta, method) .  V
1430: 41 4c 55 45 53 28 27 67 2e 74 78 74 27 2c 20 31  ALUES('g.txt', 1
1440: 30 30 30 30 30 30 30 30 32 2c 20 27 31 32 33 34  000000002, '1234
1450: 35 27 2c 20 30 29 3b 0a 7d 20 7b 31 20 7b 72 61  5', 0);.} {1 {ra
1460: 77 64 61 74 61 20 6d 75 73 74 20 62 65 20 4e 55  wdata must be NU
1470: 4c 4c 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  LL}}.do_catchsql
1480: 5f 74 65 73 74 20 31 2e 31 2e 30 2e 34 20 7b 0a  _test 1.1.0.4 {.
1490: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
14a0: 28 6e 61 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74  (name, data, met
14b0: 68 6f 64 29 20 0a 20 20 56 41 4c 55 45 53 28 27  hod) .  VALUES('
14c0: 67 2e 74 78 74 27 2c 20 27 31 32 33 34 35 27 2c  g.txt', '12345',
14d0: 20 37 29 3b 0a 7d 20 7b 31 20 7b 75 6e 6b 6e 6f   7);.} {1 {unkno
14e0: 77 6e 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6d  wn compression m
14f0: 65 74 68 6f 64 3a 20 37 7d 7d 0a 0a 64 6f 5f 65  ethod: 7}}..do_e
1500: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 31 2e  xecsql_test 1.1.
1510: 31 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1 {.  INSERT INT
1520: 4f 20 7a 7a 28 6e 61 6d 65 2c 20 6d 6f 64 65 2c  O zz(name, mode,
1530: 20 6d 74 69 6d 65 2c 20 64 61 74 61 2c 20 6d 65   mtime, data, me
1540: 74 68 6f 64 29 20 0a 20 20 56 41 4c 55 45 53 28  thod) .  VALUES(
1550: 27 66 2e 74 78 74 27 2c 20 27 2d 72 77 2d 72 2d  'f.txt', '-rw-r-
1560: 2d 72 2d 2d 27 2c 20 31 30 30 30 30 30 30 30 30  -r--', 100000000
1570: 30 2c 20 27 61 62 63 64 65 27 2c 20 30 29 3b 0a  0, 'abcde', 0);.
1580: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1590: 74 20 31 2e 31 2e 32 20 7b 0a 20 20 49 4e 53 45  t 1.1.2 {.  INSE
15a0: 52 54 20 49 4e 54 4f 20 7a 7a 28 6e 61 6d 65 2c  RT INTO zz(name,
15b0: 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 2c 20 64 61   mode, mtime, da
15c0: 74 61 2c 20 6d 65 74 68 6f 64 29 20 0a 20 20 56  ta, method) .  V
15d0: 41 4c 55 45 53 28 27 67 2e 74 78 74 27 2c 20 4e  ALUES('g.txt', N
15e0: 55 4c 4c 2c 20 31 30 30 30 30 30 30 30 30 32 2c  ULL, 1000000002,
15f0: 20 27 31 32 33 34 35 27 2c 20 30 29 3b 0a 7d 0a   '12345', 0);.}.
1600: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1610: 20 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20   1.2 {.  SELECT 
1620: 6e 61 6d 65 2c 20 6d 74 69 6d 65 2c 20 64 61 74  name, mtime, dat
1630: 61 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 27  a FROM zipfile('
1640: 74 65 73 74 2e 7a 69 70 27 29 0a 7d 20 7b 0a 20  test.zip').} {. 
1650: 20 66 2e 74 78 74 20 31 30 30 30 30 30 30 30 30   f.txt 100000000
1660: 30 20 61 62 63 64 65 20 0a 20 20 67 2e 74 78 74  0 abcde .  g.txt
1670: 20 31 30 30 30 30 30 30 30 30 32 20 31 32 33 34   1000000002 1234
1680: 35 0a 7d 0a 64 6f 5f 7a 69 70 5f 74 65 73 74 73  5.}.do_zip_tests
1690: 20 31 2e 32 61 20 74 65 73 74 2e 7a 69 70 0a 0a   1.2a test.zip..
16a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
16b0: 31 2e 33 20 7b 0a 20 20 49 4e 53 45 52 54 20 49  1.3 {.  INSERT I
16c0: 4e 54 4f 20 7a 7a 28 6e 61 6d 65 2c 20 6d 6f 64  NTO zz(name, mod
16d0: 65 2c 20 6d 74 69 6d 65 2c 20 64 61 74 61 29 20  e, mtime, data) 
16e0: 56 41 4c 55 45 53 28 27 68 2e 74 78 74 27 2c 20  VALUES('h.txt', 
16f0: 0a 20 20 20 20 27 2d 72 77 2d 72 2d 2d 72 2d 2d  .    '-rw-r--r--
1700: 27 2c 20 31 30 30 30 30 30 30 30 30 34 2c 20 27  ', 1000000004, '
1710: 61 61 61 61 61 61 61 61 61 61 62 62 62 62 62 62  aaaaaaaaaabbbbbb
1720: 62 62 62 62 27 0a 20 20 29 3b 0a 7d 0a 64 6f 5f  bbbb'.  );.}.do_
1730: 7a 69 70 5f 74 65 73 74 73 20 31 2e 33 61 20 74  zip_tests 1.3a t
1740: 65 73 74 2e 7a 69 70 0a 0a 64 6f 5f 65 78 65 63  est.zip..do_exec
1750: 73 71 6c 5f 74 65 73 74 20 31 2e 34 20 7b 0a 20  sql_test 1.4 {. 
1760: 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 6d 74   SELECT name, mt
1770: 69 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74 68 6f  ime, data, metho
1780: 64 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 27  d FROM zipfile('
1790: 74 65 73 74 2e 7a 69 70 27 29 3b 0a 7d 20 7b 0a  test.zip');.} {.
17a0: 20 20 66 2e 74 78 74 20 31 30 30 30 30 30 30 30    f.txt 10000000
17b0: 30 30 20 61 62 63 64 65 20 30 0a 20 20 67 2e 74  00 abcde 0.  g.t
17c0: 78 74 20 31 30 30 30 30 30 30 30 30 32 20 31 32  xt 1000000002 12
17d0: 33 34 35 20 30 0a 20 20 68 2e 74 78 74 20 31 30  345 0.  h.txt 10
17e0: 30 30 30 30 30 30 30 34 20 61 61 61 61 61 61 61  00000004 aaaaaaa
17f0: 61 61 61 62 62 62 62 62 62 62 62 62 62 20 38 0a  aaabbbbbbbbbb 8.
1800: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 6a 73 6f  }..ifcapable jso
1810: 6e 31 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71  n1 {.  do_execsq
1820: 6c 5f 74 65 73 74 20 31 2e 34 2e 31 20 7b 0a 20  l_test 1.4.1 {. 
1830: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20     SELECT name, 
1840: 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 20 7a 69  json_extract( zi
1850: 70 66 69 6c 65 5f 63 64 73 28 7a 29 20 2c 20 27  pfile_cds(z) , '
1860: 24 2e 63 72 63 33 32 27 29 21 3d 30 0a 20 20 20  $.crc32')!=0.   
1870: 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 27 74   FROM zipfile('t
1880: 65 73 74 2e 7a 69 70 27 29 3b 0a 20 20 7d 20 7b  est.zip');.  } {
1890: 0a 20 20 20 20 66 2e 74 78 74 20 31 0a 20 20 20  .    f.txt 1.   
18a0: 20 67 2e 74 78 74 20 31 0a 20 20 20 20 68 2e 74   g.txt 1.    h.t
18b0: 78 74 20 31 0a 20 20 7d 0a 7d 0a 64 6f 5f 63 61  xt 1.  }.}.do_ca
18c0: 74 63 68 73 71 6c 5f 74 65 73 74 20 31 2e 34 2e  tchsql_test 1.4.
18d0: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 7a 69 70  2 {.  SELECT zip
18e0: 66 69 6c 65 5f 63 64 73 28 6d 6f 64 65 29 20 46  file_cds(mode) F
18f0: 52 4f 4d 20 7a 69 70 66 69 6c 65 28 27 74 65 73  ROM zipfile('tes
1900: 74 2e 7a 69 70 27 29 3b 0a 7d 20 7b 30 20 7b 7b  t.zip');.} {0 {{
1910: 7d 20 7b 7d 20 7b 7d 7d 7d 0a 0a 64 6f 5f 65 78  } {} {}}}..do_ex
1920: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 35 2e 31  ecsql_test 1.5.1
1930: 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20   {.  BEGIN;.    
1940: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 28 6e  INSERT INTO zz(n
1950: 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65  ame, mode, mtime
1960: 2c 20 64 61 74 61 2c 20 6d 65 74 68 6f 64 29 0a  , data, method).
1970: 20 20 20 20 56 41 4c 55 45 53 28 27 69 2e 74 78      VALUES('i.tx
1980: 74 27 2c 20 27 2d 72 77 2d 72 2d 2d 72 2d 2d 27  t', '-rw-r--r--'
1990: 2c 20 31 30 30 30 30 30 30 30 30 36 2c 20 27 7a  , 1000000006, 'z
19a0: 78 63 76 62 27 2c 20 30 29 3b 0a 20 20 20 20 53  xcvb', 0);.    S
19b0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
19c0: 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20  zz;.  COMMIT;.} 
19d0: 7b 66 2e 74 78 74 20 67 2e 74 78 74 20 68 2e 74  {f.txt g.txt h.t
19e0: 78 74 20 69 2e 74 78 74 7d 0a 64 6f 5f 65 78 65  xt i.txt}.do_exe
19f0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 35 2e 32 20  csql_test 1.5.2 
1a00: 7b 0a 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20  {.  SELECT name 
1a10: 46 52 4f 4d 20 7a 7a 3b 0a 7d 20 7b 66 2e 74 78  FROM zz;.} {f.tx
1a20: 74 20 67 2e 74 78 74 20 68 2e 74 78 74 20 69 2e  t g.txt h.txt i.
1a30: 74 78 74 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  txt}.do_execsql_
1a40: 74 65 73 74 20 31 2e 35 2e 33 20 7b 0a 20 20 53  test 1.5.3 {.  S
1a50: 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20  ELECT data FROM 
1a60: 7a 7a 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 69  zz WHERE name='i
1a70: 2e 74 78 74 27 3b 0a 7d 20 7b 7a 78 63 76 62 7d  .txt';.} {zxcvb}
1a80: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
1a90: 74 20 31 2e 36 2e 30 20 7b 0a 20 20 44 45 4c 45  t 1.6.0 {.  DELE
1aa0: 54 45 20 46 52 4f 4d 20 7a 7a 20 57 48 45 52 45  TE FROM zz WHERE
1ab0: 20 6e 61 6d 65 3d 27 67 2e 74 78 74 27 3b 0a 20   name='g.txt';. 
1ac0: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
1ad0: 4d 20 7a 7a 3b 0a 7d 20 7b 66 2e 74 78 74 20 68  M zz;.} {f.txt h
1ae0: 2e 74 78 74 20 69 2e 74 78 74 7d 0a 0a 64 6f 5f  .txt i.txt}..do_
1af0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 36  execsql_test 1.6
1b00: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 6e 61  .1 {.  SELECT na
1b10: 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 2c  me, mode, mtime,
1b20: 20 64 61 74 61 2c 20 6d 65 74 68 6f 64 20 46 52   data, method FR
1b30: 4f 4d 20 7a 69 70 66 69 6c 65 28 27 74 65 73 74  OM zipfile('test
1b40: 2e 7a 69 70 27 29 3b 0a 7d 20 7b 0a 20 20 66 2e  .zip');.} {.  f.
1b50: 74 78 74 20 33 33 31 38 38 20 31 30 30 30 30 30  txt 33188 100000
1b60: 30 30 30 30 20 61 62 63 64 65 20 30 0a 20 20 68  0000 abcde 0.  h
1b70: 2e 74 78 74 20 33 33 31 38 38 20 31 30 30 30 30  .txt 33188 10000
1b80: 30 30 30 30 34 20 61 61 61 61 61 61 61 61 61 61  00004 aaaaaaaaaa
1b90: 62 62 62 62 62 62 62 62 62 62 20 38 0a 20 20 69  bbbbbbbbbb 8.  i
1ba0: 2e 74 78 74 20 33 33 31 38 38 20 31 30 30 30 30  .txt 33188 10000
1bb0: 30 30 30 30 36 20 7a 78 63 76 62 20 30 0a 7d 0a  00006 zxcvb 0.}.
1bc0: 64 6f 5f 7a 69 70 5f 74 65 73 74 73 20 31 2e 36  do_zip_tests 1.6
1bd0: 2e 31 61 20 74 65 73 74 2e 7a 69 70 0a 0a 64 6f  .1a test.zip..do
1be0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
1bf0: 36 2e 32 20 7b 0a 20 20 55 50 44 41 54 45 20 7a  6.2 {.  UPDATE z
1c00: 7a 20 53 45 54 20 6d 74 69 6d 65 3d 34 20 57 48  z SET mtime=4 WH
1c10: 45 52 45 20 6e 61 6d 65 3d 27 69 2e 74 78 74 27  ERE name='i.txt'
1c20: 3b 0a 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c  ;.  SELECT name,
1c30: 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 2c 20 64 61   mode, mtime, da
1c40: 74 61 2c 20 6d 65 74 68 6f 64 20 46 52 4f 4d 20  ta, method FROM 
1c50: 7a 69 70 66 69 6c 65 28 27 74 65 73 74 2e 7a 69  zipfile('test.zi
1c60: 70 27 29 3b 0a 7d 20 7b 0a 20 20 66 2e 74 78 74  p');.} {.  f.txt
1c70: 20 33 33 31 38 38 20 31 30 30 30 30 30 30 30 30   33188 100000000
1c80: 30 20 61 62 63 64 65 20 30 0a 20 20 68 2e 74 78  0 abcde 0.  h.tx
1c90: 74 20 33 33 31 38 38 20 31 30 30 30 30 30 30 30  t 33188 10000000
1ca0: 30 34 20 61 61 61 61 61 61 61 61 61 61 62 62 62  04 aaaaaaaaaabbb
1cb0: 62 62 62 62 62 62 62 20 38 0a 20 20 69 2e 74 78  bbbbbbb 8.  i.tx
1cc0: 74 20 33 33 31 38 38 20 34 20 7a 78 63 76 62 20  t 33188 4 zxcvb 
1cd0: 30 0a 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f  0.}..if {$::tcl_
1ce0: 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
1cf0: 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 20 20  m)=="unix"} {.  
1d00: 73 65 74 20 6d 6f 64 65 73 20 2d 72 77 2d 72 2d  set modes -rw-r-
1d10: 2d 72 2d 78 0a 20 20 73 65 74 20 70 65 72 6d 73  -r-x.  set perms
1d20: 20 33 33 31 38 39 0a 7d 20 65 6c 73 65 20 7b 0a   33189.} else {.
1d30: 20 20 73 65 74 20 6d 6f 64 65 73 20 2d 72 77 2d    set modes -rw-
1d40: 72 2d 2d 72 2d 2d 3b 20 23 20 6e 6f 20 65 78 65  r--r--; # no exe
1d50: 63 75 74 65 20 62 69 74 73 20 6f 6e 20 57 69 6e  cute bits on Win
1d60: 33 32 0a 20 20 73 65 74 20 70 65 72 6d 73 20 33  32.  set perms 3
1d70: 33 31 38 38 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  3188.}..do_execs
1d80: 71 6c 5f 74 65 73 74 20 31 2e 36 2e 33 20 7b 0a  ql_test 1.6.3 {.
1d90: 20 20 55 50 44 41 54 45 20 7a 7a 20 53 45 54 20    UPDATE zz SET 
1da0: 6d 6f 64 65 3d 24 6d 6f 64 65 73 20 57 48 45 52  mode=$modes WHER
1db0: 45 20 6e 61 6d 65 3d 27 68 2e 74 78 74 27 3b 0a  E name='h.txt';.
1dc0: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 6d    SELECT name, m
1dd0: 6f 64 65 2c 20 6d 74 69 6d 65 2c 20 64 61 74 61  ode, mtime, data
1de0: 2c 20 6d 65 74 68 6f 64 20 46 52 4f 4d 20 7a 69  , method FROM zi
1df0: 70 66 69 6c 65 28 27 74 65 73 74 2e 7a 69 70 27  pfile('test.zip'
1e00: 29 3b 0a 7d 20 5b 73 74 72 69 6e 67 20 6d 61 70  );.} [string map
1e10: 20 5b 6c 69 73 74 20 25 70 65 72 6d 73 25 20 24   [list %perms% $
1e20: 70 65 72 6d 73 5d 20 7b 0a 20 20 66 2e 74 78 74  perms] {.  f.txt
1e30: 20 33 33 31 38 38 20 31 30 30 30 30 30 30 30 30   33188 100000000
1e40: 30 20 61 62 63 64 65 20 30 0a 20 20 68 2e 74 78  0 abcde 0.  h.tx
1e50: 74 20 25 70 65 72 6d 73 25 20 31 30 30 30 30 30  t %perms% 100000
1e60: 30 30 30 34 20 61 61 61 61 61 61 61 61 61 61 62  0004 aaaaaaaaaab
1e70: 62 62 62 62 62 62 62 62 62 20 38 0a 20 20 69 2e  bbbbbbbbb 8.  i.
1e80: 74 78 74 20 33 33 31 38 38 20 34 20 7a 78 63 76  txt 33188 4 zxcv
1e90: 62 20 30 0a 7d 5d 0a 64 6f 5f 7a 69 70 5f 74 65  b 0.}].do_zip_te
1ea0: 73 74 73 20 31 2e 36 2e 33 61 20 74 65 73 74 2e  sts 1.6.3a test.
1eb0: 7a 69 70 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  zip..do_execsql_
1ec0: 74 65 73 74 20 31 2e 36 2e 34 20 7b 0a 20 20 55  test 1.6.4 {.  U
1ed0: 50 44 41 54 45 20 7a 7a 20 53 45 54 20 6e 61 6d  PDATE zz SET nam
1ee0: 65 20 3d 20 27 62 6c 75 65 2e 74 78 74 27 20 57  e = 'blue.txt' W
1ef0: 48 45 52 45 20 6e 61 6d 65 3d 27 66 2e 74 78 74  HERE name='f.txt
1f00: 27 3b 0a 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  ';.  SELECT name
1f10: 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 2c 20 64  , mode, mtime, d
1f20: 61 74 61 2c 20 6d 65 74 68 6f 64 20 46 52 4f 4d  ata, method FROM
1f30: 20 7a 69 70 66 69 6c 65 28 27 74 65 73 74 2e 7a   zipfile('test.z
1f40: 69 70 27 29 3b 0a 7d 20 5b 73 74 72 69 6e 67 20  ip');.} [string 
1f50: 6d 61 70 20 5b 6c 69 73 74 20 25 70 65 72 6d 73  map [list %perms
1f60: 25 20 24 70 65 72 6d 73 5d 20 7b 0a 20 20 62 6c  % $perms] {.  bl
1f70: 75 65 2e 74 78 74 20 33 33 31 38 38 20 31 30 30  ue.txt 33188 100
1f80: 30 30 30 30 30 30 30 20 61 62 63 64 65 20 30 0a  0000000 abcde 0.
1f90: 20 20 68 2e 74 78 74 20 25 70 65 72 6d 73 25 20    h.txt %perms% 
1fa0: 31 30 30 30 30 30 30 30 30 34 20 61 61 61 61 61  1000000004 aaaaa
1fb0: 61 61 61 61 61 62 62 62 62 62 62 62 62 62 62 20  aaaaabbbbbbbbbb 
1fc0: 38 0a 20 20 69 2e 74 78 74 20 33 33 31 38 38 20  8.  i.txt 33188 
1fd0: 34 20 7a 78 63 76 62 20 30 0a 7d 5d 0a 64 6f 5f  4 zxcvb 0.}].do_
1fe0: 7a 69 70 5f 74 65 73 74 73 20 31 2e 36 2e 34 61  zip_tests 1.6.4a
1ff0: 20 74 65 73 74 2e 7a 69 70 0a 0a 64 6f 5f 65 78   test.zip..do_ex
2000: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 36 2e 35  ecsql_test 1.6.5
2010: 20 7b 0a 20 20 55 50 44 41 54 45 20 7a 7a 20 53   {.  UPDATE zz S
2020: 45 54 20 64 61 74 61 20 3d 20 27 65 64 63 62 61  ET data = 'edcba
2030: 27 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 62 6c  ' WHERE name='bl
2040: 75 65 2e 74 78 74 27 3b 0a 20 20 53 45 4c 45 43  ue.txt';.  SELEC
2050: 54 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74  T name, mode, mt
2060: 69 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74 68 6f  ime, data, metho
2070: 64 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 27  d FROM zipfile('
2080: 74 65 73 74 2e 7a 69 70 27 29 3b 0a 7d 20 5b 73  test.zip');.} [s
2090: 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
20a0: 25 70 65 72 6d 73 25 20 24 70 65 72 6d 73 5d 20  %perms% $perms] 
20b0: 7b 0a 20 20 62 6c 75 65 2e 74 78 74 20 33 33 31  {.  blue.txt 331
20c0: 38 38 20 31 30 30 30 30 30 30 30 30 30 20 65 64  88 1000000000 ed
20d0: 63 62 61 20 30 0a 20 20 68 2e 74 78 74 20 25 70  cba 0.  h.txt %p
20e0: 65 72 6d 73 25 20 31 30 30 30 30 30 30 30 30 34  erms% 1000000004
20f0: 20 61 61 61 61 61 61 61 61 61 61 62 62 62 62 62   aaaaaaaaaabbbbb
2100: 62 62 62 62 62 20 38 0a 20 20 69 2e 74 78 74 20  bbbbb 8.  i.txt 
2110: 33 33 31 38 38 20 34 20 7a 78 63 76 62 20 30 0a  33188 4 zxcvb 0.
2120: 7d 5d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }]..do_execsql_t
2130: 65 73 74 20 31 2e 36 2e 36 20 7b 0a 20 20 55 50  est 1.6.6 {.  UP
2140: 44 41 54 45 20 7a 7a 20 53 45 54 20 6d 6f 64 65  DATE zz SET mode
2150: 3d 4e 55 4c 4c 2c 20 64 61 74 61 20 3d 20 4e 55  =NULL, data = NU
2160: 4c 4c 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 62  LL WHERE name='b
2170: 6c 75 65 2e 74 78 74 27 3b 0a 20 20 53 45 4c 45  lue.txt';.  SELE
2180: 43 54 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d  CT name, mode, m
2190: 74 69 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74 68  time, data, meth
21a0: 6f 64 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28  od FROM zipfile(
21b0: 27 74 65 73 74 2e 7a 69 70 27 29 3b 0a 7d 20 5b  'test.zip');.} [
21c0: 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
21d0: 20 25 70 65 72 6d 73 25 20 24 70 65 72 6d 73 5d   %perms% $perms]
21e0: 20 7b 0a 20 20 62 6c 75 65 2e 74 78 74 2f 20 31   {.  blue.txt/ 1
21f0: 36 38 37 37 20 31 30 30 30 30 30 30 30 30 30 20  6877 1000000000 
2200: 7b 7d 20 30 0a 20 20 68 2e 74 78 74 20 25 70 65  {} 0.  h.txt %pe
2210: 72 6d 73 25 20 31 30 30 30 30 30 30 30 30 34 20  rms% 1000000004 
2220: 61 61 61 61 61 61 61 61 61 61 62 62 62 62 62 62  aaaaaaaaaabbbbbb
2230: 62 62 62 62 20 38 0a 20 20 69 2e 74 78 74 20 33  bbbb 8.  i.txt 3
2240: 33 31 38 38 20 34 20 7a 78 63 76 62 20 30 0a 7d  3188 4 zxcvb 0.}
2250: 5d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  ]..do_catchsql_t
2260: 65 73 74 20 31 2e 36 2e 37 20 7b 0a 20 20 55 50  est 1.6.7 {.  UP
2270: 44 41 54 45 20 7a 7a 20 53 45 54 20 64 61 74 61  DATE zz SET data
2280: 3d 4e 55 4c 4c 20 57 48 45 52 45 20 6e 61 6d 65  =NULL WHERE name
2290: 3d 27 69 2e 74 78 74 27 0a 7d 20 7b 31 20 7b 7a  ='i.txt'.} {1 {z
22a0: 69 70 66 69 6c 65 3a 20 6d 6f 64 65 20 64 6f 65  ipfile: mode doe
22b0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 64 61 74 61  s not match data
22c0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
22d0: 73 74 20 31 2e 36 2e 38 20 7b 0a 20 20 53 45 4c  st 1.6.8 {.  SEL
22e0: 45 43 54 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20  ECT name, mode, 
22f0: 6d 74 69 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74  mtime, data, met
2300: 68 6f 64 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65  hod FROM zipfile
2310: 28 27 74 65 73 74 2e 7a 69 70 27 29 3b 0a 7d 20  ('test.zip');.} 
2320: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
2330: 74 20 25 70 65 72 6d 73 25 20 24 70 65 72 6d 73  t %perms% $perms
2340: 5d 20 7b 0a 20 20 62 6c 75 65 2e 74 78 74 2f 20  ] {.  blue.txt/ 
2350: 31 36 38 37 37 20 31 30 30 30 30 30 30 30 30 30  16877 1000000000
2360: 20 7b 7d 20 30 0a 20 20 68 2e 74 78 74 20 25 70   {} 0.  h.txt %p
2370: 65 72 6d 73 25 20 31 30 30 30 30 30 30 30 30 34  erms% 1000000004
2380: 20 61 61 61 61 61 61 61 61 61 61 62 62 62 62 62   aaaaaaaaaabbbbb
2390: 62 62 62 62 62 20 38 0a 20 20 69 2e 74 78 74 20  bbbbb 8.  i.txt 
23a0: 33 33 31 38 38 20 34 20 7a 78 63 76 62 20 30 0a  33188 4 zxcvb 0.
23b0: 7d 5d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }]..do_execsql_t
23c0: 65 73 74 20 31 2e 36 2e 39 20 7b 0a 20 20 55 50  est 1.6.9 {.  UP
23d0: 44 41 54 45 20 7a 7a 20 53 45 54 20 64 61 74 61  DATE zz SET data
23e0: 20 3d 20 27 27 20 57 48 45 52 45 20 6e 61 6d 65   = '' WHERE name
23f0: 3d 27 69 2e 74 78 74 27 3b 0a 20 20 53 45 4c 45  ='i.txt';.  SELE
2400: 43 54 20 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69  CT name,mode,mti
2410: 6d 65 2c 64 61 74 61 2c 6d 65 74 68 6f 64 20 66  me,data,method f
2420: 72 6f 6d 20 7a 69 70 66 69 6c 65 28 27 74 65 73  rom zipfile('tes
2430: 74 2e 7a 69 70 27 29 3b 0a 7d 20 5b 73 74 72 69  t.zip');.} [stri
2440: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 25 70 65  ng map [list %pe
2450: 72 6d 73 25 20 24 70 65 72 6d 73 5d 20 7b 0a 20  rms% $perms] {. 
2460: 20 62 6c 75 65 2e 74 78 74 2f 20 31 36 38 37 37   blue.txt/ 16877
2470: 20 31 30 30 30 30 30 30 30 30 30 20 7b 7d 20 30   1000000000 {} 0
2480: 0a 20 20 68 2e 74 78 74 20 25 70 65 72 6d 73 25  .  h.txt %perms%
2490: 20 31 30 30 30 30 30 30 30 30 34 20 61 61 61 61   1000000004 aaaa
24a0: 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 62  aaaaaabbbbbbbbbb
24b0: 20 38 0a 20 20 69 2e 74 78 74 20 33 33 31 38 38   8.  i.txt 33188
24c0: 20 34 20 7b 7d 20 30 0a 7d 5d 0a 0a 64 6f 5f 65   4 {} 0.}]..do_e
24d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 36 2e  xecsql_test 1.6.
24e0: 31 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2e  10 {.  SELECT a.
24f0: 6e 61 6d 65 2c 20 61 2e 64 61 74 61 20 0a 20 20  name, a.data .  
2500: 46 52 4f 4d 20 7a 7a 20 41 53 20 61 2c 20 7a 7a  FROM zz AS a, zz
2510: 20 41 53 20 62 20 0a 20 20 57 48 45 52 45 20 61   AS b .  WHERE a
2520: 2e 6e 61 6d 65 3d 2b 62 2e 6e 61 6d 65 20 41 4e  .name=+b.name AN
2530: 44 20 2b 61 2e 6d 6f 64 65 3d 62 2e 6d 6f 64 65  D +a.mode=b.mode
2540: 0a 7d 20 7b 0a 20 20 62 6c 75 65 2e 74 78 74 2f  .} {.  blue.txt/
2550: 20 7b 7d 0a 20 20 68 2e 74 78 74 20 61 61 61 61   {}.  h.txt aaaa
2560: 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 62  aaaaaabbbbbbbbbb
2570: 0a 20 20 69 2e 74 78 74 20 7b 7d 0a 7d 0a 0a 64  .  i.txt {}.}..d
2580: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
2590: 2e 36 2e 31 31 20 7b 0a 20 20 53 45 4c 45 43 54  .6.11 {.  SELECT
25a0: 20 6e 61 6d 65 2c 20 64 61 74 61 20 46 52 4f 4d   name, data FROM
25b0: 20 7a 7a 20 57 48 45 52 45 20 6e 61 6d 65 20 4c   zz WHERE name L
25c0: 49 4b 45 20 27 25 74 78 74 27 0a 7d 20 7b 0a 20  IKE '%txt'.} {. 
25d0: 20 68 2e 74 78 74 20 61 61 61 61 61 61 61 61 61   h.txt aaaaaaaaa
25e0: 61 62 62 62 62 62 62 62 62 62 62 0a 20 20 69 2e  abbbbbbbbbb.  i.
25f0: 74 78 74 20 7b 7d 0a 7d 0a 0a 64 6f 5f 65 78 65  txt {}.}..do_exe
2600: 63 73 71 6c 5f 74 65 73 74 20 31 2e 37 20 7b 0a  csql_test 1.7 {.
2610: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 7a 7a    DELETE FROM zz
2620: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
2630: 4d 20 7a 7a 3b 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d  M zz;.} {}..#---
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 2d 2d 2d 2d 0a 64 62 20 63 6c 6f 73 65 0a  ------.db close.
2690: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
26a0: 2e 7a 69 70 0a 72 65 73 65 74 5f 64 62 0a 6c 6f  .zip.reset_db.lo
26b0: 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73  ad_static_extens
26c0: 69 6f 6e 20 64 62 20 66 69 6c 65 69 6f 0a 6c 6f  ion db fileio.lo
26d0: 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73  ad_static_extens
26e0: 69 6f 6e 20 64 62 20 7a 69 70 66 69 6c 65 0a 64  ion db zipfile.d
26f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
2700: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49  .1 {.  CREATE VI
2710: 52 54 55 41 4c 20 54 41 42 4c 45 20 7a 7a 7a 20  RTUAL TABLE zzz 
2720: 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 27 74  USING zipfile('t
2730: 65 73 74 2e 7a 69 70 27 29 3b 0a 20 20 49 4e 53  est.zip');.  INS
2740: 45 52 54 20 49 4e 54 4f 20 7a 7a 7a 28 6e 61 6d  ERT INTO zzz(nam
2750: 65 2c 20 6d 6f 64 65 29 20 56 41 4c 55 45 53 28  e, mode) VALUES(
2760: 27 64 69 72 6e 61 6d 65 27 2c 20 27 64 72 77 78  'dirname', 'drwx
2770: 72 2d 78 72 2d 78 27 29 3b 0a 20 20 53 45 4c 45  r-xr-x');.  SELE
2780: 43 54 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 64  CT name, mode, d
2790: 61 74 61 20 46 52 4f 4d 20 7a 7a 7a 3b 0a 7d 20  ata FROM zzz;.} 
27a0: 7b 64 69 72 6e 61 6d 65 2f 20 31 36 38 37 37 20  {dirname/ 16877 
27b0: 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}}.do_execsql_t
27c0: 65 73 74 20 32 2e 32 20 7b 0a 20 20 49 4e 53 45  est 2.2 {.  INSE
27d0: 52 54 20 49 4e 54 4f 20 7a 7a 7a 28 6e 61 6d 65  RT INTO zzz(name
27e0: 2c 20 64 61 74 61 29 20 56 41 4c 55 45 53 28 27  , data) VALUES('
27f0: 64 69 72 6e 61 6d 65 32 27 2c 20 4e 55 4c 4c 29  dirname2', NULL)
2800: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2810: 7a 7a 7a 28 6e 61 6d 65 2c 20 64 61 74 61 29 20  zzz(name, data) 
2820: 56 41 4c 55 45 53 28 27 64 69 72 6e 61 6d 65 32  VALUES('dirname2
2830: 2f 66 69 6c 65 31 2e 74 78 74 27 2c 20 27 61 62  /file1.txt', 'ab
2840: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 27 29  cdefghijklmnop')
2850: 3b 0a 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c  ;.  SELECT name,
2860: 20 6d 6f 64 65 2c 20 64 61 74 61 20 46 52 4f 4d   mode, data FROM
2870: 20 7a 7a 7a 3b 0a 7d 20 7b 0a 20 20 64 69 72 6e   zzz;.} {.  dirn
2880: 61 6d 65 2f 20 31 36 38 37 37 20 7b 7d 0a 20 20  ame/ 16877 {}.  
2890: 64 69 72 6e 61 6d 65 32 2f 20 31 36 38 37 37 20  dirname2/ 16877 
28a0: 7b 7d 0a 20 20 64 69 72 6e 61 6d 65 32 2f 66 69  {}.  dirname2/fi
28b0: 6c 65 31 2e 74 78 74 20 33 33 31 38 38 20 61 62  le1.txt 33188 ab
28c0: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 0a 7d  cdefghijklmnop.}
28d0: 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  ..do_catchsql_te
28e0: 73 74 20 32 2e 33 20 7b 0a 20 20 55 50 44 41 54  st 2.3 {.  UPDAT
28f0: 45 20 7a 7a 7a 20 53 45 54 20 6e 61 6d 65 20 3d  E zzz SET name =
2900: 20 27 64 69 72 6e 61 6d 65 33 27 20 57 48 45 52   'dirname3' WHER
2910: 45 20 6e 61 6d 65 20 3d 20 27 64 69 72 6e 61 6d  E name = 'dirnam
2920: 65 2f 27 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  e/';.} {0 {}}.do
2930: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e  _execsql_test 2.
2940: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 6e 61 6d  4 {.  SELECT nam
2950: 65 2c 20 6d 6f 64 65 2c 20 64 61 74 61 20 46 52  e, mode, data FR
2960: 4f 4d 20 7a 7a 7a 3b 0a 7d 20 7b 0a 20 20 64 69  OM zzz;.} {.  di
2970: 72 6e 61 6d 65 33 2f 20 31 36 38 37 37 20 7b 7d  rname3/ 16877 {}
2980: 0a 20 20 64 69 72 6e 61 6d 65 32 2f 20 31 36 38  .  dirname2/ 168
2990: 37 37 20 7b 7d 0a 20 20 64 69 72 6e 61 6d 65 32  77 {}.  dirname2
29a0: 2f 66 69 6c 65 31 2e 74 78 74 20 33 33 31 38 38  /file1.txt 33188
29b0: 20 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f   abcdefghijklmno
29c0: 70 0a 7d 0a 64 6f 5f 7a 69 70 5f 74 65 73 74 73  p.}.do_zip_tests
29d0: 20 32 2e 34 61 20 74 65 73 74 2e 7a 69 70 0a 0a   2.4a test.zip..
29e0: 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  # Check that the
29f0: 20 5b 75 6e 7a 69 70 5d 20 75 74 69 6c 69 74 79   [unzip] utility
2a00: 20 63 61 6e 20 75 6e 70 61 63 6b 20 6f 75 72 20   can unpack our 
2a10: 61 72 63 68 69 76 65 2e 0a 23 0a 69 66 20 7b 5b  archive..#.if {[
2a20: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 55 4e  info exists ::UN
2a30: 5a 49 50 5d 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  ZIP]} {.  do_tes
2a40: 74 20 32 2e 35 2e 31 20 7b 0a 20 20 20 20 66 6f  t 2.5.1 {.    fo
2a50: 72 63 65 64 65 6c 65 74 65 20 64 69 72 6e 61 6d  rcedelete dirnam
2a60: 65 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74  e.    forcedelet
2a70: 65 20 64 69 72 6e 61 6d 65 32 0a 20 20 20 20 69  e dirname2.    i
2a80: 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  f {$::tcl_platfo
2a90: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75  rm(platform)=="u
2aa0: 6e 69 78 22 7d 20 7b 0a 20 20 20 20 20 20 73 65  nix"} {.      se
2ab0: 74 20 6e 75 6c 6c 20 2f 64 65 76 2f 6e 75 6c 6c  t null /dev/null
2ac0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
2ad0: 20 20 20 20 73 65 74 20 6e 75 6c 6c 20 4e 55 4c      set null NUL
2ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 72  .    }.    set r
2af0: 63 20 5b 63 61 74 63 68 20 7b 20 65 78 65 63 20  c [catch { exec 
2b00: 24 3a 3a 55 4e 5a 49 50 20 74 65 73 74 2e 7a 69  $::UNZIP test.zi
2b10: 70 20 3e 20 24 6e 75 6c 6c 20 7d 20 6d 73 67 5d  p > $null } msg]
2b20: 0a 20 20 20 20 6c 69 73 74 20 24 72 63 20 24 6d  .    list $rc $m
2b30: 73 67 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20  sg.  } {0 {}}.  
2b40: 64 6f 5f 74 65 73 74 20 32 2e 35 2e 32 20 7b 20  do_test 2.5.2 { 
2b50: 66 69 6c 65 20 69 73 64 69 72 20 64 69 72 6e 61  file isdir dirna
2b60: 6d 65 33 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  me3 } 1.  do_tes
2b70: 74 20 32 2e 35 2e 33 20 7b 20 66 69 6c 65 20 69  t 2.5.3 { file i
2b80: 73 64 69 72 20 64 69 72 6e 61 6d 65 32 20 7d 20  sdir dirname2 } 
2b90: 31 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 35 2e  1.  do_test 2.5.
2ba0: 34 20 7b 20 66 69 6c 65 20 69 73 64 69 72 20 64  4 { file isdir d
2bb0: 69 72 6e 61 6d 65 32 2f 66 69 6c 65 31 2e 74 78  irname2/file1.tx
2bc0: 74 20 7d 20 30 0a 20 20 64 6f 5f 74 65 73 74 20  t } 0.  do_test 
2bd0: 32 2e 35 2e 35 20 7b 20 0a 20 20 20 20 73 65 74  2.5.5 { .    set
2be0: 20 66 64 20 5b 6f 70 65 6e 20 64 69 72 6e 61 6d   fd [open dirnam
2bf0: 65 32 2f 66 69 6c 65 31 2e 74 78 74 5d 0a 20 20  e2/file1.txt].  
2c00: 20 20 73 65 74 20 64 61 74 61 20 5b 72 65 61 64    set data [read
2c10: 20 24 66 64 5d 0a 20 20 20 20 63 6c 6f 73 65 20   $fd].    close 
2c20: 24 66 64 0a 20 20 20 20 73 65 74 20 64 61 74 61  $fd.    set data
2c30: 0a 20 20 7d 20 7b 61 62 63 64 65 66 67 68 69 6a  .  } {abcdefghij
2c40: 6b 6c 6d 6e 6f 70 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  klmnop}.}..#----
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 2d 0a 72 65 73 65 74 5f 64 62 0a 66  -----.reset_db.f
2ca0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
2cb0: 7a 69 70 0a 6c 6f 61 64 5f 73 74 61 74 69 63 5f  zip.load_static_
2cc0: 65 78 74 65 6e 73 69 6f 6e 20 64 62 20 7a 69 70  extension db zip
2cd0: 66 69 6c 65 0a 6c 6f 61 64 5f 73 74 61 74 69 63  file.load_static
2ce0: 5f 65 78 74 65 6e 73 69 6f 6e 20 64 62 20 66 69  _extension db fi
2cf0: 6c 65 69 6f 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  leio..do_execsql
2d00: 5f 74 65 73 74 20 33 2e 30 20 7b 0a 20 20 43 52  _test 3.0 {.  CR
2d10: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
2d20: 4c 45 20 74 65 6d 70 2e 78 31 20 55 53 49 4e 47  LE temp.x1 USING
2d30: 20 7a 69 70 66 69 6c 65 28 27 74 65 73 74 2e 7a   zipfile('test.z
2d40: 69 70 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ip');.  INSERT I
2d50: 4e 54 4f 20 78 31 28 6e 61 6d 65 2c 20 64 61 74  NTO x1(name, dat
2d60: 61 29 20 56 41 4c 55 45 53 28 27 64 69 72 31 2f  a) VALUES('dir1/
2d70: 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45  ', NULL);.  INSE
2d80: 52 54 20 49 4e 54 4f 20 78 31 28 6e 61 6d 65 2c  RT INTO x1(name,
2d90: 20 64 61 74 61 29 20 56 41 4c 55 45 53 28 27 66   data) VALUES('f
2da0: 69 6c 65 31 27 2c 20 27 31 32 33 34 27 29 3b 0a  ile1', '1234');.
2db0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
2dc0: 28 6e 61 6d 65 2c 20 64 61 74 61 29 20 56 41 4c  (name, data) VAL
2dd0: 55 45 53 28 27 64 69 72 31 2f 66 69 6c 65 32 27  UES('dir1/file2'
2de0: 2c 20 27 35 36 37 38 27 29 3b 0a 7d 0a 66 6f 72  , '5678');.}.for
2df0: 65 61 63 68 20 7b 74 6e 20 66 6e 61 6d 65 7d 20  each {tn fname} 
2e00: 7b 0a 20 20 31 20 64 69 72 31 0a 20 20 32 20 66  {.  1 dir1.  2 f
2e10: 69 6c 65 31 0a 20 20 33 20 64 69 72 31 2f 66 69  ile1.  3 dir1/fi
2e20: 6c 65 32 0a 7d 20 7b 0a 20 20 64 6f 5f 63 61 74  le2.} {.  do_cat
2e30: 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 31 2e 24  chsql_test 3.1.$
2e40: 74 6e 2e 30 20 7b 0a 20 20 20 20 49 4e 53 45 52  tn.0 {.    INSER
2e50: 54 20 49 4e 54 4f 20 78 31 28 6e 61 6d 65 2c 20  T INTO x1(name, 
2e60: 64 61 74 61 29 20 56 41 4c 55 45 53 28 24 66 6e  data) VALUES($fn
2e70: 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d 20  ame, NULL);.  } 
2e80: 5b 6c 69 73 74 20 31 20 22 64 75 70 6c 69 63 61  [list 1 "duplica
2e90: 74 65 20 6e 61 6d 65 3a 20 5c 22 24 66 6e 61 6d  te name: \"$fnam
2ea0: 65 2f 5c 22 22 5d 0a 20 20 64 6f 5f 63 61 74 63  e/\""].  do_catc
2eb0: 68 73 71 6c 5f 74 65 73 74 20 33 2e 31 2e 24 74  hsql_test 3.1.$t
2ec0: 6e 2e 31 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  n.1 {.    INSERT
2ed0: 20 49 4e 54 4f 20 78 31 28 6e 61 6d 65 2c 20 64   INTO x1(name, d
2ee0: 61 74 61 29 20 56 41 4c 55 45 53 28 24 66 6e 61  ata) VALUES($fna
2ef0: 6d 65 20 7c 7c 20 27 2f 27 2c 20 4e 55 4c 4c 29  me || '/', NULL)
2f00: 3b 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 22 64  ;.  } [list 1 "d
2f10: 75 70 6c 69 63 61 74 65 20 6e 61 6d 65 3a 20 5c  uplicate name: \
2f20: 22 24 66 6e 61 6d 65 2f 5c 22 22 5d 0a 20 20 64  "$fname/\""].  d
2f30: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
2f40: 33 2e 31 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  3.1.$tn.2 {.    
2f50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 28 6e  INSERT INTO x1(n
2f60: 61 6d 65 2c 20 64 61 74 61 29 20 56 41 4c 55 45  ame, data) VALUE
2f70: 53 28 24 66 6e 61 6d 65 2c 20 27 61 62 63 64 27  S($fname, 'abcd'
2f80: 29 3b 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 22  );.  } [list 1 "
2f90: 64 75 70 6c 69 63 61 74 65 20 6e 61 6d 65 3a 20  duplicate name: 
2fa0: 5c 22 24 66 6e 61 6d 65 5c 22 22 5d 0a 7d 0a 0a  \"$fname\""].}..
2fb0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
2fc0: 20 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20   3.2 {.  SELECT 
2fd0: 72 6f 77 69 64 20 46 52 4f 4d 20 78 31 0a 7d 20  rowid FROM x1.} 
2fe0: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 63 6f 6c 75  {1 {no such colu
2ff0: 6d 6e 3a 20 72 6f 77 69 64 7d 7d 0a 0a 23 2d 2d  mn: rowid}}..#--
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73  -------.# Test s
3050: 6f 6d 65 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ome error condit
3060: 69 6f 6e 73 2e 0a 23 0a 64 6f 5f 63 61 74 63 68  ions..#.do_catch
3070: 73 71 6c 5f 74 65 73 74 20 34 2e 31 20 7b 0a 20  sql_test 4.1 {. 
3080: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
3090: 54 41 42 4c 45 20 79 79 79 20 55 53 49 4e 47 20  TABLE yyy USING 
30a0: 7a 69 70 66 69 6c 65 28 29 3b 0a 7d 20 7b 31 20  zipfile();.} {1 
30b0: 7b 7a 69 70 66 69 6c 65 20 63 6f 6e 73 74 72 75  {zipfile constru
30c0: 63 74 6f 72 20 72 65 71 75 69 72 65 73 20 6f 6e  ctor requires on
30d0: 65 20 61 72 67 75 6d 65 6e 74 7d 7d 0a 64 6f 5f  e argument}}.do_
30e0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 34 2e  catchsql_test 4.
30f0: 32 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52  2 {.  CREATE VIR
3100: 54 55 41 4c 20 54 41 42 4c 45 20 79 79 79 20 55  TUAL TABLE yyy U
3110: 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 27 74 65  SING zipfile('te
3120: 73 74 2e 7a 69 70 27 2c 20 27 74 65 73 74 2e 7a  st.zip', 'test.z
3130: 69 70 27 29 3b 0a 7d 20 7b 31 20 7b 7a 69 70 66  ip');.} {1 {zipf
3140: 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20  ile constructor 
3150: 72 65 71 75 69 72 65 73 20 6f 6e 65 20 61 72 67  requires one arg
3160: 75 6d 65 6e 74 7d 7d 0a 0a 64 6f 5f 63 61 74 63  ument}}..do_catc
3170: 68 73 71 6c 5f 74 65 73 74 20 34 2e 33 20 7b 0a  hsql_test 4.3 {.
3180: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3190: 7a 69 70 66 69 6c 65 28 29 0a 7d 20 7b 31 20 7b  zipfile().} {1 {
31a0: 7a 69 70 66 69 6c 65 28 29 20 66 75 6e 63 74 69  zipfile() functi
31b0: 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
31c0: 72 67 75 6d 65 6e 74 7d 7d 0a 0a 64 6f 5f 63 61  rgument}}..do_ca
31d0: 74 63 68 73 71 6c 5f 74 65 73 74 20 34 2e 34 20  tchsql_test 4.4 
31e0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
31f0: 4d 20 7a 69 70 66 69 6c 65 28 27 2f 70 61 74 68  M zipfile('/path
3200: 2f 74 68 61 74 2f 64 6f 65 73 2f 6e 6f 74 2f 65  /that/does/not/e
3210: 78 69 73 74 27 29 0a 7d 20 7b 31 20 7b 63 61 6e  xist').} {1 {can
3220: 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 2f  not open file: /
3230: 70 61 74 68 2f 74 68 61 74 2f 64 6f 65 73 2f 6e  path/that/does/n
3240: 6f 74 2f 65 78 69 73 74 7d 7d 0a 0a 66 6f 72 65  ot/exist}}..fore
3250: 61 63 68 20 7b 74 6e 20 6d 6f 64 65 7d 20 7b 0a  ach {tn mode} {.
3260: 20 20 31 20 61 62 63 64 0a 20 20 32 20 62 72 77    1 abcd.  2 brw
3270: 78 72 77 78 72 77 78 0a 20 20 33 20 6c 72 77 78  xrwxrwx.  3 lrwx
3280: 72 72 78 72 77 78 0a 7d 20 7b 0a 20 20 64 6f 5f  rrxrwx.} {.  do_
3290: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 34 2e  catchsql_test 4.
32a0: 35 2e 24 74 6e 20 7b 0a 20 20 20 20 57 49 54 48  5.$tn {.    WITH
32b0: 20 6d 28 6d 29 20 41 53 20 28 20 53 45 4c 45 43   m(m) AS ( SELEC
32c0: 54 20 24 6d 6f 64 65 29 0a 20 20 20 20 53 45 4c  T $mode).    SEL
32d0: 45 43 54 20 7a 69 70 66 69 6c 65 28 27 61 2e 74  ECT zipfile('a.t
32e0: 78 74 27 2c 20 6d 2c 20 31 30 30 30 2c 20 27 78  xt', m, 1000, 'x
32f0: 79 7a 27 29 20 46 52 4f 4d 20 6d 0a 20 20 7d 20  yz') FROM m.  } 
3300: 5b 6c 69 73 74 20 31 20 22 7a 69 70 66 69 6c 65  [list 1 "zipfile
3310: 3a 20 70 61 72 73 65 20 65 72 72 6f 72 20 69 6e  : parse error in
3320: 20 6d 6f 64 65 3a 20 24 6d 6f 64 65 22 5d 0a 7d   mode: $mode"].}
3330: 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  ..do_catchsql_te
3340: 73 74 20 34 2e 36 20 7b 0a 20 20 57 49 54 48 20  st 4.6 {.  WITH 
3350: 63 28 6e 61 6d 65 2c 64 61 74 61 29 20 41 53 20  c(name,data) AS 
3360: 28 20 53 45 4c 45 43 54 20 27 61 2e 74 78 74 27  ( SELECT 'a.txt'
3370: 2c 20 27 61 62 63 27 29 0a 20 20 53 45 4c 45 43  , 'abc').  SELEC
3380: 54 20 7a 69 70 66 69 6c 65 28 6e 61 6d 65 29 20  T zipfile(name) 
3390: 46 52 4f 4d 20 63 0a 7d 20 7b 31 20 7b 77 72 6f  FROM c.} {1 {wro
33a0: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
33b0: 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
33c0: 6f 6e 20 7a 69 70 66 69 6c 65 28 29 7d 7d 0a 0a  on zipfile()}}..
33d0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
33e0: 20 34 2e 37 20 7b 0a 20 20 57 49 54 48 20 63 28   4.7 {.  WITH c(
33f0: 6e 61 6d 65 2c 64 61 74 61 29 20 41 53 20 28 20  name,data) AS ( 
3400: 0a 20 20 20 20 53 45 4c 45 43 54 20 27 61 2e 74  .    SELECT 'a.t
3410: 78 74 27 2c 20 27 61 62 63 27 20 55 4e 49 4f 4e  xt', 'abc' UNION
3420: 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20   ALL.    SELECT 
3430: 4e 55 4c 4c 2c 20 27 64 65 66 27 0a 20 20 29 0a  NULL, 'def'.  ).
3440: 20 20 53 45 4c 45 43 54 20 7a 69 70 66 69 6c 65    SELECT zipfile
3450: 28 6e 61 6d 65 2c 64 61 74 61 29 20 46 52 4f 4d  (name,data) FROM
3460: 20 63 0a 7d 20 7b 31 20 7b 66 69 72 73 74 20 61   c.} {1 {first a
3470: 72 67 75 6d 65 6e 74 20 74 6f 20 7a 69 70 66 69  rgument to zipfi
3480: 6c 65 28 29 20 6d 75 73 74 20 62 65 20 6e 6f 6e  le() must be non
3490: 2d 4e 55 4c 4c 7d 7d 0a 0a 64 6f 5f 63 61 74 63  -NULL}}..do_catc
34a0: 68 73 71 6c 5f 74 65 73 74 20 34 2e 38 20 7b 0a  hsql_test 4.8 {.
34b0: 20 20 57 49 54 48 20 63 28 6e 61 6d 65 2c 64 61    WITH c(name,da
34c0: 74 61 2c 6d 65 74 68 6f 64 29 20 41 53 20 28 20  ta,method) AS ( 
34d0: 0a 20 20 20 20 53 45 4c 45 43 54 20 27 61 2e 74  .    SELECT 'a.t
34e0: 78 74 27 2c 20 27 61 62 63 27 2c 20 30 0a 20 20  xt', 'abc', 0.  
34f0: 20 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 27    UNION SELECT '
3500: 62 2e 74 78 74 27 2c 20 27 64 65 66 27 2c 20 38  b.txt', 'def', 8
3510: 0a 20 20 20 20 55 4e 49 4f 4e 20 53 45 4c 45 43  .    UNION SELEC
3520: 54 20 27 63 2e 74 78 74 27 2c 20 27 67 68 69 27  T 'c.txt', 'ghi'
3530: 2c 20 31 36 0a 20 20 29 0a 20 20 53 45 4c 45 43  , 16.  ).  SELEC
3540: 54 20 7a 69 70 66 69 6c 65 28 6e 61 6d 65 2c 4e  T zipfile(name,N
3550: 55 4c 4c 2c 4e 55 4c 4c 2c 64 61 74 61 2c 6d 65  ULL,NULL,data,me
3560: 74 68 6f 64 29 20 46 52 4f 4d 20 63 0a 7d 20 7b  thod) FROM c.} {
3570: 31 20 7b 69 6c 6c 65 67 61 6c 20 6d 65 74 68 6f  1 {illegal metho
3580: 64 20 76 61 6c 75 65 3a 20 31 36 7d 7d 0a 0a 64  d value: 16}}..d
3590: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
35a0: 34 2e 39 20 7b 0a 20 20 57 49 54 48 20 63 28 6e  4.9 {.  WITH c(n
35b0: 61 6d 65 2c 64 61 74 61 29 20 41 53 20 28 20 0a  ame,data) AS ( .
35c0: 20 20 20 20 53 45 4c 45 43 54 20 27 61 2e 74 78      SELECT 'a.tx
35d0: 74 27 2c 20 27 61 62 63 27 0a 20 20 20 20 55 4e  t', 'abc'.    UN
35e0: 49 4f 4e 20 53 45 4c 45 43 54 20 27 62 2e 74 78  ION SELECT 'b.tx
35f0: 74 27 2c 20 27 64 65 66 27 0a 20 20 20 20 55 4e  t', 'def'.    UN
3600: 49 4f 4e 20 53 45 4c 45 43 54 20 27 63 2e 74 78  ION SELECT 'c.tx
3610: 74 2f 27 2c 20 27 67 68 69 27 0a 20 20 29 0a 20  t/', 'ghi'.  ). 
3620: 20 53 45 4c 45 43 54 20 7a 69 70 66 69 6c 65 28   SELECT zipfile(
3630: 6e 61 6d 65 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 64  name,NULL,NULL,d
3640: 61 74 61 29 20 46 52 4f 4d 20 63 0a 7d 20 7b 31  ata) FROM c.} {1
3650: 20 7b 6e 6f 6e 2d 64 69 72 65 63 74 6f 72 79 20   {non-directory 
3660: 6e 61 6d 65 20 6d 75 73 74 20 6e 6f 74 20 65 6e  name must not en
3670: 64 20 77 69 74 68 20 2f 7d 7d 0a 0a 23 2d 2d 2d  d with /}}..#---
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 0a 0a 64 62 20 66 75 6e 63  -------..db func
36d0: 20 72 74 20 72 65 6d 6f 76 65 5f 74 69 6d 65 73   rt remove_times
36e0: 74 61 6d 70 73 0a 64 6f 5f 65 78 65 63 73 71 6c  tamps.do_execsql
36f0: 5f 74 65 73 74 20 35 2e 30 20 7b 0a 20 20 57 49  _test 5.0 {.  WI
3700: 54 48 20 63 28 6e 61 6d 65 2c 6d 74 69 6d 65 2c  TH c(name,mtime,
3710: 64 61 74 61 29 20 41 53 20 28 0a 20 20 20 20 53  data) AS (.    S
3720: 45 4c 45 43 54 20 27 61 2e 74 78 74 27 2c 20 39  ELECT 'a.txt', 9
3730: 34 36 36 38 34 38 30 30 2c 20 27 61 62 63 27 0a  46684800, 'abc'.
3740: 20 20 29 0a 20 20 53 45 4c 45 43 54 20 6e 61 6d    ).  SELECT nam
3750: 65 2c 6d 74 69 6d 65 2c 64 61 74 61 20 46 52 4f  e,mtime,data FRO
3760: 4d 20 7a 69 70 66 69 6c 65 28 0a 20 20 20 20 28  M zipfile(.    (
3770: 20 53 45 4c 45 43 54 20 72 74 28 20 7a 69 70 66   SELECT rt( zipf
3780: 69 6c 65 28 6e 61 6d 65 2c 4e 55 4c 4c 2c 6d 74  ile(name,NULL,mt
3790: 69 6d 65 2c 64 61 74 61 2c 4e 55 4c 4c 29 20 29  ime,data,NULL) )
37a0: 20 46 52 4f 4d 20 63 20 29 0a 20 20 29 0a 7d 20   FROM c ).  ).} 
37b0: 7b 0a 20 20 61 2e 74 78 74 20 39 34 36 36 38 34  {.  a.txt 946684
37c0: 38 30 30 20 61 62 63 0a 7d 0a 0a 69 66 20 7b 5b  800 abc.}..if {[
37d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 55 4e  info exists ::UN
37e0: 5a 49 50 5d 7d 20 7b 0a 69 66 63 61 70 61 62 6c  ZIP]} {.ifcapabl
37f0: 65 20 64 61 74 65 74 69 6d 65 20 7b 0a 20 20 66  e datetime {.  f
3800: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 31  orcedelete test1
3810: 2e 7a 69 70 20 74 65 73 74 32 2e 7a 69 70 0a 20  .zip test2.zip. 
3820: 20 64 6f 5f 74 65 73 74 20 36 2e 30 20 7b 0a 20   do_test 6.0 {. 
3830: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
3840: 20 20 20 57 49 54 48 20 63 28 6e 61 6d 65 2c 6d     WITH c(name,m
3850: 74 69 6d 65 2c 64 61 74 61 29 20 41 53 20 28 0a  time,data) AS (.
3860: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 27          SELECT '
3870: 61 2e 74 78 74 27 2c 20 39 34 36 36 38 34 38 30  a.txt', 94668480
3880: 30 2c 20 27 61 62 63 27 20 55 4e 49 4f 4e 20 41  0, 'abc' UNION A
3890: 4c 4c 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  LL.        SELEC
38a0: 54 20 27 62 2e 74 78 74 27 2c 20 31 30 30 30 30  T 'b.txt', 10000
38b0: 30 30 30 30 30 2c 20 27 61 62 63 27 20 55 4e 49  00000, 'abc' UNI
38c0: 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 20 20 53  ON ALL.        S
38d0: 45 4c 45 43 54 20 27 63 2e 74 78 74 27 2c 20 31  ELECT 'c.txt', 1
38e0: 31 31 31 31 31 31 30 30 30 2c 20 27 61 62 63 27  111111000, 'abc'
38f0: 0a 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 53  .      ).      S
3900: 45 4c 45 43 54 20 77 72 69 74 65 66 69 6c 65 28  ELECT writefile(
3910: 27 74 65 73 74 31 2e 7a 69 70 27 2c 20 72 74 28  'test1.zip', rt(
3920: 20 7a 69 70 66 69 6c 65 28 6e 61 6d 65 2c 20 4e   zipfile(name, N
3930: 55 4c 4c 2c 20 6d 74 69 6d 65 2c 20 64 61 74 61  ULL, mtime, data
3940: 29 20 29 20 29 2c 0a 20 20 20 20 20 20 20 20 20  ) ) ),.         
3950: 20 20 20 20 77 72 69 74 65 66 69 6c 65 28 27 74      writefile('t
3960: 65 73 74 32 2e 7a 69 70 27 2c 20 20 20 28 20 7a  est2.zip',   ( z
3970: 69 70 66 69 6c 65 28 6e 61 6d 65 2c 20 4e 55 4c  ipfile(name, NUL
3980: 4c 2c 20 6d 74 69 6d 65 2c 20 64 61 74 61 29 20  L, mtime, data) 
3990: 29 20 29 20 0a 20 20 20 20 20 20 46 52 4f 4d 20  ) ) .      FROM 
39a0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  c;.    }.    for
39b0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 5f 75 6e  cedelete test_un
39c0: 7a 69 70 0a 20 20 20 20 66 69 6c 65 20 6d 6b 64  zip.    file mkd
39d0: 69 72 20 74 65 73 74 5f 75 6e 7a 69 70 0a 20 20  ir test_unzip.  
39e0: 20 20 65 78 65 63 20 24 3a 3a 55 4e 5a 49 50 20    exec $::UNZIP 
39f0: 2d 64 20 74 65 73 74 5f 75 6e 7a 69 70 20 74 65  -d test_unzip te
3a00: 73 74 31 2e 7a 69 70 0a 0a 20 20 20 20 64 62 20  st1.zip..    db 
3a10: 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  eval {.      SEL
3a20: 45 43 54 20 6e 61 6d 65 2c 20 73 74 72 66 74 69  ECT name, strfti
3a30: 6d 65 28 27 25 73 27 2c 20 6d 74 69 6d 65 2c 20  me('%s', mtime, 
3a40: 27 75 6e 69 78 65 70 6f 63 68 27 2c 20 27 6c 6f  'unixepoch', 'lo
3a50: 63 61 6c 74 69 6d 65 27 29 20 0a 20 20 20 20 20  caltime') .     
3a60: 20 46 52 4f 4d 20 66 73 64 69 72 28 27 74 65 73   FROM fsdir('tes
3a70: 74 5f 75 6e 7a 69 70 27 29 20 57 48 45 52 45 20  t_unzip') WHERE 
3a80: 6e 61 6d 65 21 3d 27 74 65 73 74 5f 75 6e 7a 69  name!='test_unzi
3a90: 70 27 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42  p'.      ORDER B
3aa0: 59 20 6e 61 6d 65 0a 20 20 20 20 7d 0a 20 20 7d  Y name.    }.  }
3ab0: 20 5b 6c 69 73 74 20 7b 2a 7d 7b 0a 20 20 20 20   [list {*}{.    
3ac0: 74 65 73 74 5f 75 6e 7a 69 70 2f 61 2e 74 78 74  test_unzip/a.txt
3ad0: 20 39 34 36 36 38 34 38 30 30 0a 20 20 20 20 74   946684800.    t
3ae0: 65 73 74 5f 75 6e 7a 69 70 2f 62 2e 74 78 74 20  est_unzip/b.txt 
3af0: 31 30 30 30 30 30 30 30 30 30 20 0a 20 20 20 20  1000000000 .    
3b00: 74 65 73 74 5f 75 6e 7a 69 70 2f 63 2e 74 78 74  test_unzip/c.txt
3b10: 20 31 31 31 31 31 31 31 30 30 30 20 0a 20 20 7d   1111111000 .  }
3b20: 5d 0a 0a 20 20 23 20 66 73 64 69 72 28 29 20 69  ]..  # fsdir() i
3b30: 73 73 75 65 20 72 65 70 6f 72 74 65 64 20 6f 6e  ssue reported on
3b40: 20 74 68 65 20 6d 61 69 6c 69 6e 67 20 6c 69 73   the mailing lis
3b50: 74 20 6f 6e 20 32 30 31 38 2d 30 33 2d 31 34 20  t on 2018-03-14 
3b60: 62 79 20 4a 61 63 6b 20 54 68 61 77 2e 0a 20 20  by Jack Thaw..  
3b70: 64 6f 5f 74 65 73 74 20 36 2e 30 62 20 7b 0a 20  do_test 6.0b {. 
3b80: 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20     db eval {.   
3b90: 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 6e 61     SELECT sum(na
3ba0: 6d 65 20 4c 49 4b 45 20 27 25 2f 61 2e 74 78 74  me LIKE '%/a.txt
3bb0: 27 29 0a 20 20 20 20 20 20 46 52 4f 4d 20 28 56  ').      FROM (V
3bc0: 41 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33 29  ALUES(1),(2),(3)
3bd0: 29 20 43 52 4f 53 53 20 4a 4f 49 4e 20 66 73 64  ) CROSS JOIN fsd
3be0: 69 72 28 27 74 65 73 74 5f 75 6e 7a 69 70 27 29  ir('test_unzip')
3bf0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 33 7d 0a 0a  .    }.  } {3}..
3c00: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
3c10: 74 20 36 2e 31 20 7b 0a 20 20 20 20 53 45 4c 45  t 6.1 {.    SELE
3c20: 43 54 20 6e 61 6d 65 2c 20 6d 74 69 6d 65 2c 20  CT name, mtime, 
3c30: 64 61 74 61 20 46 52 4f 4d 20 7a 69 70 66 69 6c  data FROM zipfil
3c40: 65 28 27 74 65 73 74 31 2e 7a 69 70 27 29 0a 20  e('test1.zip'). 
3c50: 20 7d 20 7b 0a 20 20 20 20 61 2e 74 78 74 20 39   } {.    a.txt 9
3c60: 34 36 36 38 34 38 30 30 20 20 20 61 62 63 0a 20  46684800   abc. 
3c70: 20 20 20 62 2e 74 78 74 20 31 30 30 30 30 30 30     b.txt 1000000
3c80: 30 30 30 20 20 61 62 63 0a 20 20 20 20 63 2e 74  000  abc.    c.t
3c90: 78 74 20 31 31 31 31 31 31 31 30 30 30 20 20 61  xt 1111111000  a
3ca0: 62 63 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73  bc.  }..  do_tes
3cb0: 74 20 36 2e 32 20 7b 0a 20 20 20 20 66 6f 72 63  t 6.2 {.    forc
3cc0: 65 64 65 6c 65 74 65 20 74 65 73 74 5f 75 6e 7a  edelete test_unz
3cd0: 69 70 0a 20 20 20 20 66 69 6c 65 20 6d 6b 64 69  ip.    file mkdi
3ce0: 72 20 74 65 73 74 5f 75 6e 7a 69 70 0a 20 20 20  r test_unzip.   
3cf0: 20 65 78 65 63 20 24 3a 3a 55 4e 5a 49 50 20 2d   exec $::UNZIP -
3d00: 64 20 74 65 73 74 5f 75 6e 7a 69 70 20 74 65 73  d test_unzip tes
3d10: 74 32 2e 7a 69 70 0a 0a 20 20 20 20 64 62 20 65  t2.zip..    db e
3d20: 76 61 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  val {.      SELE
3d30: 43 54 20 6e 61 6d 65 2c 20 6d 74 69 6d 65 20 0a  CT name, mtime .
3d40: 20 20 20 20 20 20 46 52 4f 4d 20 66 73 64 69 72        FROM fsdir
3d50: 28 27 74 65 73 74 5f 75 6e 7a 69 70 27 29 20 57  ('test_unzip') W
3d60: 48 45 52 45 20 6e 61 6d 65 21 3d 27 74 65 73 74  HERE name!='test
3d70: 5f 75 6e 7a 69 70 27 0a 20 20 20 20 20 20 4f 52  _unzip'.      OR
3d80: 44 45 52 20 42 59 20 6e 61 6d 65 0a 20 20 20 20  DER BY name.    
3d90: 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 7b 2a 7d 7b  }.  } [list {*}{
3da0: 0a 20 20 20 20 74 65 73 74 5f 75 6e 7a 69 70 2f  .    test_unzip/
3db0: 61 2e 74 78 74 20 39 34 36 36 38 34 38 30 30 0a  a.txt 946684800.
3dc0: 20 20 20 20 74 65 73 74 5f 75 6e 7a 69 70 2f 62      test_unzip/b
3dd0: 2e 74 78 74 20 31 30 30 30 30 30 30 30 30 30 20  .txt 1000000000 
3de0: 0a 20 20 20 20 74 65 73 74 5f 75 6e 7a 69 70 2f  .    test_unzip/
3df0: 63 2e 74 78 74 20 31 31 31 31 31 31 31 30 30 30  c.txt 1111111000
3e00: 20 0a 20 20 7d 5d 0a 0a 20 20 64 6f 5f 65 78 65   .  }]..  do_exe
3e10: 63 73 71 6c 5f 74 65 73 74 20 36 2e 33 20 7b 0a  csql_test 6.3 {.
3e20: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c      SELECT name,
3e30: 20 6d 74 69 6d 65 2c 20 73 7a 2c 20 72 61 77 64   mtime, sz, rawd
3e40: 61 74 61 2c 20 64 61 74 61 20 46 52 4f 4d 20 7a  ata, data FROM z
3e50: 69 70 66 69 6c 65 28 27 74 65 73 74 32 2e 7a 69  ipfile('test2.zi
3e60: 70 27 29 0a 20 20 7d 20 7b 0a 20 20 20 20 61 2e  p').  } {.    a.
3e70: 74 78 74 20 39 34 36 36 38 34 38 30 30 20 20 20  txt 946684800   
3e80: 33 20 61 62 63 20 61 62 63 0a 20 20 20 20 62 2e  3 abc abc.    b.
3e90: 74 78 74 20 31 30 30 30 30 30 30 30 30 30 20 20  txt 1000000000  
3ea0: 33 20 61 62 63 20 61 62 63 0a 20 20 20 20 63 2e  3 abc abc.    c.
3eb0: 74 78 74 20 31 31 31 31 31 31 31 30 30 30 20 20  txt 1111111000  
3ec0: 33 20 61 62 63 20 61 62 63 0a 20 20 7d 0a 7d 0a  3 abc abc.  }.}.
3ed0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
3f20: 46 6f 72 63 65 20 61 6e 20 49 4f 20 65 72 72 6f  Force an IO erro
3f30: 72 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20  r by truncating 
3f40: 74 68 65 20 7a 69 70 20 61 72 63 68 69 76 65 20  the zip archive 
3f50: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
3f60: 20 73 69 7a 65 0a 23 20 77 68 69 6c 65 20 69 74   size.# while it
3f70: 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a   is being read..
3f80: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
3f90: 2e 7a 69 70 0a 64 6f 5f 74 65 73 74 20 37 2e 30  .zip.do_test 7.0
3fa0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3fb0: 20 20 20 57 49 54 48 20 63 28 6e 61 6d 65 2c 64     WITH c(name,d
3fc0: 61 74 61 29 20 41 53 20 28 0a 20 20 20 20 20 20  ata) AS (.      
3fd0: 20 20 53 45 4c 45 43 54 20 27 31 27 2c 20 72 61    SELECT '1', ra
3fe0: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 30 30  ndomblob(1000000
3ff0: 29 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20  ) UNION ALL.    
4000: 20 20 20 20 53 45 4c 45 43 54 20 27 32 27 2c 20      SELECT '2', 
4010: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30  randomblob(10000
4020: 30 30 29 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20  00) UNION ALL.  
4030: 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 33 27        SELECT '3'
4040: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
4050: 30 30 30 30 29 20 0a 20 20 20 20 29 0a 20 20 20  0000) .    ).   
4060: 20 53 45 4c 45 43 54 20 77 72 69 74 65 66 69 6c   SELECT writefil
4070: 65 28 27 74 65 73 74 2e 7a 69 70 27 2c 20 7a 69  e('test.zip', zi
4080: 70 66 69 6c 65 28 6e 61 6d 65 2c 20 64 61 74 61  pfile(name, data
4090: 29 20 29 20 46 52 4f 4d 20 63 3b 0a 20 20 7d 0a  ) ) FROM c;.  }.
40a0: 0a 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b  .  list [catch {
40b0: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 53  .    db eval { S
40c0: 45 4c 45 43 54 20 6e 61 6d 65 2c 20 64 61 74 61  ELECT name, data
40d0: 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 27 74   FROM zipfile('t
40e0: 65 73 74 2e 7a 69 70 27 29 20 7d 20 7b 0a 20 20  est.zip') } {.  
40f0: 20 20 20 20 69 66 20 7b 24 6e 61 6d 65 3d 3d 32      if {$name==2
4100: 7d 20 7b 20 63 6c 6f 73 65 20 5b 6f 70 65 6e 20  } { close [open 
4110: 74 65 73 74 2e 7a 69 70 20 77 2b 5d 20 7d 0a 20  test.zip w+] }. 
4120: 20 20 20 7d 0a 20 20 7d 20 6d 73 67 5d 20 24 6d     }.  } msg] $m
4130: 73 67 0a 7d 20 7b 31 20 7b 65 72 72 6f 72 20 69  sg.} {1 {error i
4140: 6e 20 66 72 65 61 64 28 29 7d 7d 0a 0a 66 6f 72  n fread()}}..for
4150: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 7a 69  cedelete test.zi
4160: 70 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  p.do_execsql_tes
4170: 74 20 38 2e 30 2e 31 20 7b 0a 20 20 43 52 45 41  t 8.0.1 {.  CREA
4180: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
4190: 20 7a 7a 20 55 53 49 4e 47 20 7a 69 70 66 69 6c   zz USING zipfil
41a0: 65 28 27 74 65 73 74 2e 7a 69 70 27 29 3b 0a 20  e('test.zip');. 
41b0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
41c0: 52 54 20 49 4e 54 4f 20 7a 7a 28 6e 61 6d 65 2c  RT INTO zz(name,
41d0: 20 64 61 74 61 29 20 56 41 4c 55 45 53 28 27 61   data) VALUES('a
41e0: 2e 74 78 74 27 2c 20 27 31 27 29 3b 0a 20 20 20  .txt', '1');.   
41f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 28   INSERT INTO zz(
4200: 6e 61 6d 65 2c 20 64 61 74 61 29 20 56 41 4c 55  name, data) VALU
4210: 45 53 28 27 62 2e 74 78 74 27 2c 20 27 32 27 29  ES('b.txt', '2')
4220: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4230: 4f 20 7a 7a 28 6e 61 6d 65 2c 20 64 61 74 61 29  O zz(name, data)
4240: 20 56 41 4c 55 45 53 28 27 63 2e 74 78 74 27 2c   VALUES('c.txt',
4250: 20 27 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   '1');.    INSER
4260: 54 20 49 4e 54 4f 20 7a 7a 28 6e 61 6d 65 2c 20  T INTO zz(name, 
4270: 64 61 74 61 29 20 56 41 4c 55 45 53 28 27 64 2e  data) VALUES('d.
4280: 74 78 74 27 2c 20 27 32 27 29 3b 0a 20 20 20 20  txt', '2');.    
4290: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 64 61 74  SELECT name, dat
42a0: 61 20 46 52 4f 4d 20 7a 7a 3b 0a 7d 20 7b 0a 20  a FROM zz;.} {. 
42b0: 20 61 2e 74 78 74 20 31 20 62 2e 74 78 74 20 32   a.txt 1 b.txt 2
42c0: 20 63 2e 74 78 74 20 31 20 64 2e 74 78 74 20 32   c.txt 1 d.txt 2
42d0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 38 2e 30 2e 32  .}.do_test 8.0.2
42e0: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53   {.  db eval { S
42f0: 45 4c 45 43 54 20 6e 61 6d 65 2c 20 64 61 74 61  ELECT name, data
4300: 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b 0a 20 20 20   FROM zz } {.   
4310: 20 69 66 20 7b 20 24 64 61 74 61 3d 3d 22 32 22   if { $data=="2"
4320: 20 7d 20 7b 20 64 62 20 65 76 61 6c 20 7b 20 44   } { db eval { D
4330: 45 4c 45 54 45 20 46 52 4f 4d 20 7a 7a 20 57 48  ELETE FROM zz WH
4340: 45 52 45 20 6e 61 6d 65 3d 24 6e 61 6d 65 20 7d  ERE name=$name }
4350: 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c   }.  }.  execsql
4360: 20 7b 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20   { SELECT name, 
4370: 64 61 74 61 20 46 52 4f 4d 20 7a 7a 20 7d 20 0a  data FROM zz } .
4380: 7d 20 7b 61 2e 74 78 74 20 31 20 63 2e 74 78 74  } {a.txt 1 c.txt
4390: 20 31 7d 0a 64 6f 5f 74 65 73 74 20 38 2e 30 2e   1}.do_test 8.0.
43a0: 33 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 20  3 {.  db eval { 
43b0: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 64 61 74  SELECT name, dat
43c0: 61 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b 0a 20 20  a FROM zz } {.  
43d0: 20 20 64 62 20 65 76 61 6c 20 7b 20 44 45 4c 45    db eval { DELE
43e0: 54 45 20 46 52 4f 4d 20 7a 7a 20 57 48 45 52 45  TE FROM zz WHERE
43f0: 20 6e 61 6d 65 3d 24 6e 61 6d 65 20 7d 0a 20 20   name=$name }.  
4400: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
4410: 4c 45 43 54 20 6e 61 6d 65 2c 20 64 61 74 61 20  LECT name, data 
4420: 46 52 4f 4d 20 7a 7a 20 7d 20 0a 7d 20 7b 7d 0a  FROM zz } .} {}.
4430: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 0a  execsql COMMIT..
4440: 63 61 74 63 68 20 7b 20 66 6f 72 63 65 64 65 6c  catch { forcedel
4450: 65 74 65 20 74 65 73 74 5f 75 6e 7a 69 70 20 7d  ete test_unzip }
4460: 0a 63 61 74 63 68 20 7b 20 66 69 6c 65 20 6d 6b  .catch { file mk
4470: 64 69 72 20 74 65 73 74 5f 75 6e 7a 69 70 20 7d  dir test_unzip }
4480: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
4490: 20 38 2e 31 2e 31 20 7b 0a 20 20 43 52 45 41 54   8.1.1 {.  CREAT
44a0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
44b0: 6e 6f 67 6f 6f 64 20 55 53 49 4e 47 20 7a 69 70  nogood USING zip
44c0: 66 69 6c 65 28 27 74 65 73 74 5f 75 6e 7a 69 70  file('test_unzip
44d0: 27 29 3b 0a 7d 0a 64 6f 5f 63 61 74 63 68 73 71  ');.}.do_catchsq
44e0: 6c 5f 74 65 73 74 20 38 2e 31 2e 32 20 7b 0a 20  l_test 8.1.2 {. 
44f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 67   INSERT INTO nog
4500: 6f 6f 64 28 6e 61 6d 65 2c 20 64 61 74 61 29 20  ood(name, data) 
4510: 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20 27 64  VALUES('abc', 'd
4520: 65 66 27 29 3b 0a 7d 20 7b 31 20 7b 7a 69 70 66  ef');.} {1 {zipf
4530: 69 6c 65 3a 20 66 61 69 6c 65 64 20 74 6f 20 6f  ile: failed to o
4540: 70 65 6e 20 66 69 6c 65 20 74 65 73 74 5f 75 6e  pen file test_un
4550: 7a 69 70 20 66 6f 72 20 77 72 69 74 69 6e 67 7d  zip for writing}
4560: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
4570: 73 74 20 38 2e 32 2e 31 20 7b 0a 20 20 44 52 4f  st 8.2.1 {.  DRO
4580: 50 20 54 41 42 4c 45 20 6e 6f 67 6f 6f 64 3b 0a  P TABLE nogood;.
4590: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
45a0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
45b0: 45 20 6e 6f 67 6f 6f 64 20 55 53 49 4e 47 20 7a  E nogood USING z
45c0: 69 70 66 69 6c 65 28 27 74 65 73 74 5f 75 6e 7a  ipfile('test_unz
45d0: 69 70 27 29 3b 0a 7d 0a 64 6f 5f 63 61 74 63 68  ip');.}.do_catch
45e0: 73 71 6c 5f 74 65 73 74 20 38 2e 32 2e 32 20 7b  sql_test 8.2.2 {
45f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4600: 20 6e 6f 67 6f 6f 64 28 6e 61 6d 65 2c 20 64 61   nogood(name, da
4610: 74 61 29 20 56 41 4c 55 45 53 28 27 61 62 63 27  ta) VALUES('abc'
4620: 2c 20 27 64 65 66 27 29 3b 0a 7d 20 7b 31 20 7b  , 'def');.} {1 {
4630: 7a 69 70 66 69 6c 65 3a 20 66 61 69 6c 65 64 20  zipfile: failed 
4640: 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 74 65 73  to open file tes
4650: 74 5f 75 6e 7a 69 70 20 66 6f 72 20 77 72 69 74  t_unzip for writ
4660: 69 6e 67 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  ing}}.do_execsql
4670: 5f 74 65 73 74 20 38 2e 32 2e 33 20 7b 0a 20 20  _test 8.2.3 {.  
4680: 43 4f 4d 4d 49 54 3b 0a 7d 0a 0a 66 6f 72 63 65  COMMIT;.}..force
4690: 64 65 6c 65 74 65 20 74 65 73 74 2e 7a 69 70 0a  delete test.zip.
46a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
46b0: 38 2e 33 2e 31 20 7b 0a 20 20 42 45 47 49 4e 3b  8.3.1 {.  BEGIN;
46c0: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
46d0: 55 41 4c 20 54 41 42 4c 45 20 6f 6b 20 55 53 49  UAL TABLE ok USI
46e0: 4e 47 20 7a 69 70 66 69 6c 65 28 27 74 65 73 74  NG zipfile('test
46f0: 2e 7a 69 70 27 29 3b 0a 20 20 20 20 49 4e 53 45  .zip');.    INSE
4700: 52 54 20 49 4e 54 4f 20 6f 6b 28 6e 61 6d 65 2c  RT INTO ok(name,
4710: 20 64 61 74 61 29 20 56 41 4c 55 45 53 20 28 27   data) VALUES ('
4720: 73 71 6c 69 74 65 33 27 2c 20 27 65 6c 66 27 29  sqlite3', 'elf')
4730: 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 0a 0a 23  ;.  COMMIT;.}..#
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
4790: 20 74 68 61 74 20 74 68 65 20 7a 69 70 66 69 6c   that the zipfil
47a0: 65 20 61 67 67 72 65 67 61 74 65 20 63 6f 72 72  e aggregate corr
47b0: 65 63 74 6c 79 20 61 64 64 73 20 61 6e 64 20 72  ectly adds and r
47c0: 65 6d 6f 76 65 73 20 22 2f 22 20 66 72 6f 6d 0a  emoves "/" from.
47d0: 23 20 74 68 65 20 65 6e 64 73 20 6f 66 20 64 69  # the ends of di
47e0: 72 65 63 74 6f 72 79 20 66 69 6c 65 20 6e 61 6d  rectory file nam
47f0: 65 73 2e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  es..do_execsql_t
4800: 65 73 74 20 39 2e 30 20 7b 0a 20 20 57 49 54 48  est 9.0 {.  WITH
4810: 20 73 72 63 28 6e 6d 29 20 41 53 20 28 0a 20 20   src(nm) AS (.  
4820: 20 20 56 41 4c 55 45 53 28 27 64 69 72 31 27 29    VALUES('dir1')
4830: 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 56   UNION ALL.    V
4840: 41 4c 55 45 53 28 27 64 69 72 32 2f 27 29 20 55  ALUES('dir2/') U
4850: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 56 41 4c  NION ALL.    VAL
4860: 55 45 53 28 27 64 69 72 33 2f 2f 27 29 20 55 4e  UES('dir3//') UN
4870: 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 56 41 4c 55  ION ALL.    VALU
4880: 45 53 28 27 64 69 72 34 2f 2f 2f 27 29 20 55 4e  ES('dir4///') UN
4890: 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 56 41 4c 55  ION ALL.    VALU
48a0: 45 53 28 27 2f 27 29 20 0a 20 20 29 0a 20 20 53  ES('/') .  ).  S
48b0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
48c0: 7a 69 70 66 69 6c 65 28 28 53 45 4c 45 43 54 20  zipfile((SELECT 
48d0: 7a 69 70 66 69 6c 65 28 6e 6d 2c 20 4e 55 4c 4c  zipfile(nm, NULL
48e0: 29 20 46 52 4f 4d 20 73 72 63 29 29 0a 7d 20 7b  ) FROM src)).} {
48f0: 64 69 72 31 2f 20 64 69 72 32 2f 20 64 69 72 33  dir1/ dir2/ dir3
4900: 2f 20 64 69 72 34 2f 20 2f 7d 0a 0a 23 2d 2d 2d  / dir4/ /}..#---
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 0a 23 20 49 4e 53 45 52 54 20  ------.# INSERT 
4960: 4f 52 20 52 45 50 4c 41 43 45 20 61 6e 64 20 49  OR REPLACE and I
4970: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 0a  NSERT OR IGNORE.
4980: 23 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73  #.catch {db clos
4990: 65 7d 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  e}.forcedelete t
49a0: 65 73 74 2e 7a 69 70 20 74 65 73 74 2e 64 62 0a  est.zip test.db.
49b0: 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f  sqlite3 db :memo
49c0: 72 79 3a 0a 6c 6f 61 64 5f 73 74 61 74 69 63 5f  ry:.load_static_
49d0: 65 78 74 65 6e 73 69 6f 6e 20 64 62 20 7a 69 70  extension db zip
49e0: 66 69 6c 65 0a 6c 6f 61 64 5f 73 74 61 74 69 63  file.load_static
49f0: 5f 65 78 74 65 6e 73 69 6f 6e 20 64 62 20 66 69  _extension db fi
4a00: 6c 65 69 6f 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  leio..do_execsql
4a10: 5f 74 65 73 74 20 31 30 2e 30 20 7b 0a 20 20 43  _test 10.0 {.  C
4a20: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
4a30: 42 4c 45 20 7a 20 55 53 49 4e 47 20 7a 69 70 66  BLE z USING zipf
4a40: 69 6c 65 28 27 74 65 73 74 2e 7a 69 70 27 29 3b  ile('test.zip');
4a50: 0a 7d 20 7b 7d 0a 64 6f 5f 63 61 74 63 68 73 71  .} {}.do_catchsq
4a60: 6c 5f 74 65 73 74 20 31 30 2e 31 20 7b 0a 20 20  l_test 10.1 {.  
4a70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 28 6e 61  INSERT INTO z(na
4a80: 6d 65 2c 64 61 74 61 29 20 56 41 4c 55 45 53 28  me,data) VALUES(
4a90: 27 61 30 27 2c 27 6f 6e 65 27 29 2c 28 27 61 30  'a0','one'),('a0
4aa0: 27 2c 27 74 77 6f 27 29 3b 0a 7d 20 7b 31 20 7b  ','two');.} {1 {
4ab0: 64 75 70 6c 69 63 61 74 65 20 6e 61 6d 65 3a 20  duplicate name: 
4ac0: 22 61 30 22 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  "a0"}}.do_execsq
4ad0: 6c 5f 74 65 73 74 20 31 30 2e 32 20 7b 0a 20 20  l_test 10.2 {.  
4ae0: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 64 61 74  SELECT name, dat
4af0: 61 20 46 52 4f 4d 20 7a 3b 0a 7d 20 7b 61 30 20  a FROM z;.} {a0 
4b00: 6f 6e 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  one}.do_execsql_
4b10: 74 65 73 74 20 31 30 2e 33 20 7b 0a 20 20 52 45  test 10.3 {.  RE
4b20: 50 4c 41 43 45 20 49 4e 54 4f 20 7a 28 6e 61 6d  PLACE INTO z(nam
4b30: 65 2c 64 61 74 61 29 20 56 41 4c 55 45 53 28 27  e,data) VALUES('
4b40: 61 30 27 2c 27 74 68 72 65 65 27 29 2c 28 27 61  a0','three'),('a
4b50: 30 27 2c 27 66 6f 75 72 27 29 3b 0a 7d 20 7b 7d  0','four');.} {}
4b60: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
4b70: 20 31 30 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54   10.4 {.  SELECT
4b80: 20 6e 61 6d 65 2c 20 64 61 74 61 20 46 52 4f 4d   name, data FROM
4b90: 20 7a 3b 0a 7d 20 7b 61 30 20 66 6f 75 72 7d 0a   z;.} {a0 four}.
4ba0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4bb0: 31 30 2e 35 20 7b 0a 20 20 49 4e 53 45 52 54 20  10.5 {.  INSERT 
4bc0: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 7a  OR IGNORE INTO z
4bd0: 28 6e 61 6d 65 2c 64 61 74 61 29 20 56 41 4c 55  (name,data) VALU
4be0: 45 53 28 27 61 30 27 2c 27 66 69 76 65 27 29 2c  ES('a0','five'),
4bf0: 28 27 61 30 27 2c 27 73 69 78 27 29 3b 0a 7d 20  ('a0','six');.} 
4c00: 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
4c10: 73 74 20 31 30 2e 36 20 7b 0a 20 20 53 45 4c 45  st 10.6 {.  SELE
4c20: 43 54 20 6e 61 6d 65 2c 20 64 61 74 61 20 46 52  CT name, data FR
4c30: 4f 4d 20 7a 3b 0a 7d 20 7b 61 30 20 66 6f 75 72  OM z;.} {a0 four
4c40: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
4c50: 73 74 20 31 31 2e 31 20 7b 0a 20 20 44 45 4c 45  st 11.1 {.  DELE
4c60: 54 45 20 46 52 4f 4d 20 7a 3b 0a 7d 20 7b 7d 0a  TE FROM z;.} {}.
4c70: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4c80: 31 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  11.2 {.  SELECT 
4c90: 6e 61 6d 65 2c 20 64 61 74 61 20 46 52 4f 4d 20  name, data FROM 
4ca0: 7a 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73  z;.} {}.do_execs
4cb0: 71 6c 5f 74 65 73 74 20 31 31 2e 33 20 7b 0a 20  ql_test 11.3 {. 
4cc0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 28   INSERT INTO z (
4cd0: 6e 61 6d 65 2c 64 61 74 61 29 20 56 41 4c 55 45  name,data) VALUE
4ce0: 53 20 28 27 62 30 27 2c 27 6f 6e 65 27 29 3b 0a  S ('b0','one');.
4cf0: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 64    SELECT name, d
4d00: 61 74 61 20 46 52 4f 4d 20 7a 3b 0a 7d 20 7b 62  ata FROM z;.} {b
4d10: 30 20 6f 6e 65 7d 0a 64 6f 5f 65 78 65 63 73 71  0 one}.do_execsq
4d20: 6c 5f 74 65 73 74 20 31 31 2e 34 20 7b 0a 20 20  l_test 11.4 {.  
4d30: 55 50 44 41 54 45 20 7a 20 53 45 54 20 6e 61 6d  UPDATE z SET nam
4d40: 65 20 3d 20 27 62 31 27 20 57 48 45 52 45 20 6e  e = 'b1' WHERE n
4d50: 61 6d 65 20 3d 20 27 62 30 27 3b 0a 20 20 53 45  ame = 'b0';.  SE
4d60: 4c 45 43 54 20 6e 61 6d 65 2c 20 64 61 74 61 20  LECT name, data 
4d70: 46 52 4f 4d 20 7a 3b 0a 7d 20 7b 62 31 20 6f 6e  FROM z;.} {b1 on
4d80: 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
4d90: 73 74 20 31 31 2e 35 20 7b 0a 20 20 49 4e 53 45  st 11.5 {.  INSE
4da0: 52 54 20 49 4e 54 4f 20 7a 20 28 6e 61 6d 65 2c  RT INTO z (name,
4db0: 64 61 74 61 29 20 56 41 4c 55 45 53 20 28 27 62  data) VALUES ('b
4dc0: 30 27 2c 27 6f 6e 65 27 29 3b 0a 20 20 53 45 4c  0','one');.  SEL
4dd0: 45 43 54 20 6e 61 6d 65 2c 20 64 61 74 61 20 46  ECT name, data F
4de0: 52 4f 4d 20 7a 20 4f 52 44 45 52 20 42 59 20 6e  ROM z ORDER BY n
4df0: 61 6d 65 3b 0a 7d 20 7b 62 30 20 6f 6e 65 20 62  ame;.} {b0 one b
4e00: 31 20 6f 6e 65 7d 0a 64 6f 5f 63 61 74 63 68 73  1 one}.do_catchs
4e10: 71 6c 5f 74 65 73 74 20 31 31 2e 36 20 7b 0a 20  ql_test 11.6 {. 
4e20: 20 55 50 44 41 54 45 20 7a 20 53 45 54 20 6e 61   UPDATE z SET na
4e30: 6d 65 20 3d 20 27 62 31 27 20 57 48 45 52 45 20  me = 'b1' WHERE 
4e40: 6e 61 6d 65 20 3d 20 27 62 30 27 3b 0a 7d 20 7b  name = 'b0';.} {
4e50: 31 20 7b 64 75 70 6c 69 63 61 74 65 20 6e 61 6d  1 {duplicate nam
4e60: 65 3a 20 22 62 31 22 7d 7d 0a 64 6f 5f 65 78 65  e: "b1"}}.do_exe
4e70: 63 73 71 6c 5f 74 65 73 74 20 31 31 2e 37 20 7b  csql_test 11.7 {
4e80: 0a 20 20 55 50 44 41 54 45 20 7a 20 53 45 54 20  .  UPDATE z SET 
4e90: 64 61 74 61 20 3d 20 27 74 77 6f 27 20 57 48 45  data = 'two' WHE
4ea0: 52 45 20 6e 61 6d 65 20 3d 20 27 62 30 27 3b 0a  RE name = 'b0';.
4eb0: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 64    SELECT name, d
4ec0: 61 74 61 20 46 52 4f 4d 20 7a 20 4f 52 44 45 52  ata FROM z ORDER
4ed0: 20 42 59 20 6e 61 6d 65 3b 0a 7d 20 7b 62 30 20   BY name;.} {b0 
4ee0: 74 77 6f 20 62 31 20 6f 6e 65 7d 0a 64 6f 5f 63  two b1 one}.do_c
4ef0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 31 2e  atchsql_test 11.
4f00: 38 20 7b 0a 20 20 55 50 44 41 54 45 20 7a 20 53  8 {.  UPDATE z S
4f10: 45 54 20 6e 61 6d 65 20 3d 20 27 62 31 27 3b 0a  ET name = 'b1';.
4f20: 7d 20 7b 31 20 7b 64 75 70 6c 69 63 61 74 65 20  } {1 {duplicate 
4f30: 6e 61 6d 65 3a 20 22 62 31 22 7d 7d 0a 64 6f 5f  name: "b1"}}.do_
4f40: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 31  catchsql_test 11
4f50: 2e 39 20 7b 0a 20 20 55 50 44 41 54 45 20 7a 20  .9 {.  UPDATE z 
4f60: 53 45 54 20 6e 61 6d 65 20 3d 20 27 62 32 27 3b  SET name = 'b2';
4f70: 0a 7d 20 7b 31 20 7b 64 75 70 6c 69 63 61 74 65  .} {1 {duplicate
4f80: 20 6e 61 6d 65 3a 20 22 62 32 22 7d 7d 0a 64 6f   name: "b2"}}.do
4f90: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 31  _execsql_test 11
4fa0: 2e 31 30 20 7b 0a 20 20 55 50 44 41 54 45 20 7a  .10 {.  UPDATE z
4fb0: 20 53 45 54 20 6e 61 6d 65 20 3d 20 6e 61 6d 65   SET name = name
4fc0: 3b 0a 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c  ;.  SELECT name,
4fd0: 20 64 61 74 61 20 46 52 4f 4d 20 7a 20 4f 52 44   data FROM z ORD
4fe0: 45 52 20 42 59 20 6e 61 6d 65 3b 0a 7d 20 7b 62  ER BY name;.} {b
4ff0: 30 20 74 77 6f 20 62 32 20 6f 6e 65 7d 0a 64 6f  0 two b2 one}.do
5000: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 31  _execsql_test 11
5010: 2e 31 31 20 7b 0a 20 20 55 50 44 41 54 45 20 7a  .11 {.  UPDATE z
5020: 20 53 45 54 20 6e 61 6d 65 20 3d 20 6e 61 6d 65   SET name = name
5030: 20 7c 7c 20 27 73 75 66 66 69 78 27 3b 0a 20 20   || 'suffix';.  
5040: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 64 61 74  SELECT name, dat
5050: 61 20 46 52 4f 4d 20 7a 20 4f 52 44 45 52 20 42  a FROM z ORDER B
5060: 59 20 6e 61 6d 65 3b 0a 7d 20 7b 62 30 73 75 66  Y name;.} {b0suf
5070: 66 69 78 20 74 77 6f 20 62 32 73 75 66 66 69 78  fix two b2suffix
5080: 20 6f 6e 65 7d 0a 0a 0a 69 66 20 7b 24 74 63 6c   one}...if {$tcl
5090: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
50a0: 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d 20  rm)!="windows"} 
50b0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 31 32 2e 30  {.  do_test 12.0
50c0: 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 20 66   {.    catch { f
50d0: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
50e0: 65 20 73 75 62 64 69 72 20 7d 0a 20 20 20 20 66  e subdir }.    f
50f0: 6f 72 65 61 63 68 20 7b 70 61 74 68 20 73 7a 7d  oreach {path sz}
5100: 20 7b 0a 20 20 20 20 20 20 73 75 62 64 69 72 2f   {.      subdir/
5110: 78 31 2e 74 78 74 20 20 20 20 20 31 34 33 0a 20  x1.txt     143. 
5120: 20 20 20 20 20 73 75 62 64 69 72 2f 78 32 2e 74       subdir/x2.t
5130: 78 74 20 20 20 20 20 31 35 33 0a 20 20 20 20 7d  xt     153.    }
5140: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 64 69 72   {.      set dir
5150: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
5160: 70 61 74 68 5d 0a 20 20 20 20 20 20 63 61 74 63  path].      catc
5170: 68 20 7b 20 66 69 6c 65 20 6d 6b 64 69 72 20 24  h { file mkdir $
5180: 64 69 72 20 7d 0a 20 20 20 20 20 20 73 65 74 20  dir }.      set 
5190: 66 64 20 5b 6f 70 65 6e 20 24 70 61 74 68 20 77  fd [open $path w
51a0: 5d 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f  ].      puts -no
51b0: 6e 65 77 6c 69 6e 65 20 24 66 64 20 5b 73 74 72  newline $fd [str
51c0: 69 6e 67 20 72 65 70 65 61 74 20 31 20 24 73 7a  ing repeat 1 $sz
51d0: 5d 0a 20 20 20 20 20 20 63 6c 6f 73 65 20 24 66  ].      close $f
51e0: 64 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  d.    }.  } {}. 
51f0: 20 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74   .  do_execsql_t
5200: 65 73 74 20 31 32 2e 31 20 7b 0a 20 20 20 20 53  est 12.1 {.    S
5210: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
5220: 66 73 64 69 72 28 27 73 75 62 64 69 72 27 29 20  fsdir('subdir') 
5230: 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 20  ORDER BY 1;.  } 
5240: 7b 73 75 62 64 69 72 20 73 75 62 64 69 72 2f 78  {subdir subdir/x
5250: 31 2e 74 78 74 20 73 75 62 64 69 72 2f 78 32 2e  1.txt subdir/x2.
5260: 74 78 74 7d 0a 20 20 0a 20 20 64 6f 5f 65 78 65  txt}.  .  do_exe
5270: 63 73 71 6c 5f 74 65 73 74 20 31 32 2e 32 20 7b  csql_test 12.2 {
5280: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5290: 45 20 64 20 41 53 20 53 45 4c 45 43 54 20 27 73  E d AS SELECT 's
52a0: 75 62 64 69 72 27 20 64 3b 0a 20 20 20 20 43 52  ubdir' d;.    CR
52b0: 45 41 54 45 20 54 41 42 4c 45 20 78 20 41 53 20  EATE TABLE x AS 
52c0: 53 45 4c 45 43 54 20 31 20 78 3b 0a 20 20 7d 0a  SELECT 1 x;.  }.
52d0: 20 20 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f    .  do_execsql_
52e0: 74 65 73 74 20 31 32 2e 34 20 7b 0a 20 20 20 20  test 12.4 {.    
52f0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
5300: 20 64 20 4a 4f 49 4e 20 78 20 4a 4f 49 4e 20 66   d JOIN x JOIN f
5310: 73 64 69 72 28 64 29 20 4f 52 44 45 52 20 42 59  sdir(d) ORDER BY
5320: 20 31 3b 0a 20 20 7d 20 7b 73 75 62 64 69 72 20   1;.  } {subdir 
5330: 73 75 62 64 69 72 2f 78 31 2e 74 78 74 20 73 75  subdir/x1.txt su
5340: 62 64 69 72 2f 78 32 2e 74 78 74 7d 0a 0a 20 20  bdir/x2.txt}..  
5350: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5360: 31 32 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45 43  12.5 {.    SELEC
5370: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 64 20 4a 4f  T name FROM d JO
5380: 49 4e 20 78 20 4a 4f 49 4e 20 66 73 64 69 72 28  IN x JOIN fsdir(
5390: 27 2e 27 2c 20 64 29 20 4f 52 44 45 52 20 42 59  '.', d) ORDER BY
53a0: 20 31 3b 0a 20 20 7d 20 7b 2e 20 2e 2f 78 31 2e   1;.  } {. ./x1.
53b0: 74 78 74 20 2e 2f 78 32 2e 74 78 74 7d 0a 7d 0a  txt ./x2.txt}.}.
53c0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.