/ Hex Artifact Content
Login

Artifact 61c6daf74f71f6d0c4d925cd7e23eb9ffe642491f8927b26aebba476d3244e50:


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 73 65 74 20 74  *******.#..set t
0170: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0180: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0190: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
01a0: 74 65 72 2e 74 63 6c 0a 73 65 74 20 74 65 73 74  ter.tcl.set test
01b0: 70 72 65 66 69 78 20 7a 69 70 66 69 6c 65 0a 0a  prefix zipfile..
01c0: 69 66 63 61 70 61 62 6c 65 20 21 76 74 61 62 20  ifcapable !vtab 
01d0: 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 3b  {.  finish_test;
01e0: 20 72 65 74 75 72 6e 0a 7d 0a 69 66 20 7b 5b 63   return.}.if {[c
01f0: 61 74 63 68 20 7b 6c 6f 61 64 5f 73 74 61 74 69  atch {load_stati
0200: 63 5f 65 78 74 65 6e 73 69 6f 6e 20 64 62 20 7a  c_extension db z
0210: 69 70 66 69 6c 65 7d 20 65 72 72 6f 72 5d 7d 20  ipfile} error]} 
0220: 7b 0a 20 20 70 75 74 73 20 22 53 6b 69 70 70 69  {.  puts "Skippi
0230: 6e 67 20 7a 69 70 66 69 6c 65 20 74 65 73 74 73  ng zipfile tests
0240: 2c 20 68 69 74 20 6c 6f 61 64 20 65 72 72 6f 72  , hit load error
0250: 3a 20 24 65 72 72 6f 72 22 0a 20 20 66 69 6e 69  : $error".  fini
0260: 73 68 5f 74 65 73 74 3b 20 72 65 74 75 72 6e 0a  sh_test; return.
0270: 7d 0a 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  }..forcedelete t
0280: 65 73 74 2e 7a 69 70 0a 64 6f 5f 65 78 65 63 73  est.zip.do_execs
0290: 71 6c 5f 74 65 73 74 20 31 2e 30 20 7b 0a 20 20  ql_test 1.0 {.  
02a0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
02b0: 41 42 4c 45 20 74 65 6d 70 2e 7a 7a 20 55 53 49  ABLE temp.zz USI
02c0: 4e 47 20 7a 69 70 66 69 6c 65 28 27 74 65 73 74  NG zipfile('test
02d0: 2e 7a 69 70 27 29 3b 0a 20 20 50 52 41 47 4d 41  .zip');.  PRAGMA
02e0: 20 74 61 62 6c 65 5f 69 6e 66 6f 28 7a 7a 29 3b   table_info(zz);
02f0: 0a 7d 20 7b 0a 20 20 30 20 6e 61 6d 65 20 7b 7d  .} {.  0 name {}
0300: 20 31 20 7b 7d 20 31 20 0a 20 20 31 20 6d 6f 64   1 {} 1 .  1 mod
0310: 65 20 7b 7d 20 30 20 7b 7d 20 30 20 0a 20 20 32  e {} 0 {} 0 .  2
0320: 20 6d 74 69 6d 65 20 7b 7d 20 30 20 7b 7d 20 30   mtime {} 0 {} 0
0330: 20 0a 20 20 33 20 73 7a 20 7b 7d 20 30 20 7b 7d   .  3 sz {} 0 {}
0340: 20 30 20 0a 20 20 34 20 72 61 77 64 61 74 61 20   0 .  4 rawdata 
0350: 7b 7d 20 30 20 7b 7d 20 30 0a 20 20 35 20 64 61  {} 0 {} 0.  5 da
0360: 74 61 20 7b 7d 20 30 20 7b 7d 20 30 0a 20 20 36  ta {} 0 {} 0.  6
0370: 20 6d 65 74 68 6f 64 20 7b 7d 20 30 20 7b 7d 20   method {} 0 {} 
0380: 30 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  0.}..do_execsql_
0390: 74 65 73 74 20 31 2e 31 2e 31 20 7b 0a 20 20 49  test 1.1.1 {.  I
03a0: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 28 6e 61  NSERT INTO zz(na
03b0: 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 2c  me, mode, mtime,
03c0: 20 73 7a 2c 20 72 61 77 64 61 74 61 2c 20 6d 65   sz, rawdata, me
03d0: 74 68 6f 64 29 20 0a 20 20 56 41 4c 55 45 53 28  thod) .  VALUES(
03e0: 27 66 2e 74 78 74 27 2c 20 27 2d 72 77 2d 72 2d  'f.txt', '-rw-r-
03f0: 2d 72 2d 2d 27 2c 20 31 30 30 30 30 30 30 30 30  -r--', 100000000
0400: 30 2c 20 35 2c 20 27 61 62 63 64 65 27 2c 20 30  0, 5, 'abcde', 0
0410: 29 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  );.}.do_execsql_
0420: 74 65 73 74 20 31 2e 31 2e 32 20 7b 0a 20 20 49  test 1.1.2 {.  I
0430: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 28 6e 61  NSERT INTO zz(na
0440: 6d 65 2c 20 6d 74 69 6d 65 2c 20 73 7a 2c 20 72  me, mtime, sz, r
0450: 61 77 64 61 74 61 2c 20 6d 65 74 68 6f 64 29 20  awdata, method) 
0460: 0a 20 20 56 41 4c 55 45 53 28 27 67 2e 74 78 74  .  VALUES('g.txt
0470: 27 2c 20 31 30 30 30 30 30 30 30 30 32 2c 20 35  ', 1000000002, 5
0480: 2c 20 27 31 32 33 34 35 27 2c 20 30 29 3b 0a 7d  , '12345', 0);.}
0490: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
04a0: 74 20 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  t 1.2 {.  SELECT
04b0: 20 6e 61 6d 65 2c 20 6d 74 69 6d 65 2c 20 64 61   name, mtime, da
04c0: 74 61 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28  ta FROM zipfile(
04d0: 27 74 65 73 74 2e 7a 69 70 27 29 0a 7d 20 7b 0a  'test.zip').} {.
04e0: 20 20 66 2e 74 78 74 20 31 30 30 30 30 30 30 30    f.txt 10000000
04f0: 30 30 20 61 62 63 64 65 20 0a 20 20 67 2e 74 78  00 abcde .  g.tx
0500: 74 20 31 30 30 30 30 30 30 30 30 32 20 31 32 33  t 1000000002 123
0510: 34 35 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  45.}..do_execsql
0520: 5f 74 65 73 74 20 31 2e 33 20 7b 0a 20 20 49 4e  _test 1.3 {.  IN
0530: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 28 6e 61 6d  SERT INTO zz(nam
0540: 65 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 2c 20  e, mode, mtime, 
0550: 64 61 74 61 29 20 56 41 4c 55 45 53 28 27 68 2e  data) VALUES('h.
0560: 74 78 74 27 2c 20 0a 20 20 20 20 27 2d 72 77 2d  txt', .    '-rw-
0570: 72 2d 2d 72 2d 2d 27 2c 20 31 30 30 30 30 30 30  r--r--', 1000000
0580: 30 30 34 2c 20 27 61 61 61 61 61 61 61 61 61 61  004, 'aaaaaaaaaa
0590: 62 62 62 62 62 62 62 62 62 62 27 0a 20 20 29 3b  bbbbbbbbbb'.  );
05a0: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
05b0: 65 73 74 20 31 2e 34 20 7b 0a 20 20 53 45 4c 45  est 1.4 {.  SELE
05c0: 43 54 20 6e 61 6d 65 2c 20 6d 74 69 6d 65 2c 20  CT name, mtime, 
05d0: 64 61 74 61 2c 20 6d 65 74 68 6f 64 20 46 52 4f  data, method FRO
05e0: 4d 20 7a 69 70 66 69 6c 65 28 27 74 65 73 74 2e  M zipfile('test.
05f0: 7a 69 70 27 29 3b 0a 7d 20 7b 0a 20 20 66 2e 74  zip');.} {.  f.t
0600: 78 74 20 31 30 30 30 30 30 30 30 30 30 20 61 62  xt 1000000000 ab
0610: 63 64 65 20 30 0a 20 20 67 2e 74 78 74 20 31 30  cde 0.  g.txt 10
0620: 30 30 30 30 30 30 30 32 20 31 32 33 34 35 20 30  00000002 12345 0
0630: 0a 20 20 68 2e 74 78 74 20 31 30 30 30 30 30 30  .  h.txt 1000000
0640: 30 30 34 20 61 61 61 61 61 61 61 61 61 61 62 62  004 aaaaaaaaaabb
0650: 62 62 62 62 62 62 62 62 20 38 0a 7d 0a 0a 64 6f  bbbbbbbb 8.}..do
0660: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0670: 35 2e 31 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20  5.1 {.  BEGIN;. 
0680: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
0690: 7a 28 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74  z(name, mode, mt
06a0: 69 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74 68 6f  ime, data, metho
06b0: 64 29 0a 20 20 20 20 56 41 4c 55 45 53 28 27 69  d).    VALUES('i
06c0: 2e 74 78 74 27 2c 20 27 2d 72 77 2d 72 2d 2d 72  .txt', '-rw-r--r
06d0: 2d 2d 27 2c 20 31 30 30 30 30 30 30 30 30 36 2c  --', 1000000006,
06e0: 20 27 7a 78 63 76 62 27 2c 20 30 29 3b 0a 20 20   'zxcvb', 0);.  
06f0: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
0700: 4f 4d 20 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54 3b  OM zz;.  COMMIT;
0710: 0a 7d 20 7b 66 2e 74 78 74 20 67 2e 74 78 74 20  .} {f.txt g.txt 
0720: 68 2e 74 78 74 20 69 2e 74 78 74 7d 0a 64 6f 5f  h.txt i.txt}.do_
0730: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 35  execsql_test 1.5
0740: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6e 61  .2 {.  SELECT na
0750: 6d 65 20 46 52 4f 4d 20 7a 7a 3b 0a 7d 20 7b 66  me FROM zz;.} {f
0760: 2e 74 78 74 20 67 2e 74 78 74 20 68 2e 74 78 74  .txt g.txt h.txt
0770: 20 69 2e 74 78 74 7d 0a 64 6f 5f 65 78 65 63 73   i.txt}.do_execs
0780: 71 6c 5f 74 65 73 74 20 31 2e 35 2e 33 20 7b 0a  ql_test 1.5.3 {.
0790: 20 20 53 45 4c 45 43 54 20 64 61 74 61 20 46 52    SELECT data FR
07a0: 4f 4d 20 7a 7a 20 57 48 45 52 45 20 6e 61 6d 65  OM zz WHERE name
07b0: 3d 27 69 2e 74 78 74 27 3b 0a 7d 20 7b 7a 78 63  ='i.txt';.} {zxc
07c0: 76 62 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  vb}..do_execsql_
07d0: 74 65 73 74 20 31 2e 36 2e 30 20 7b 0a 20 20 44  test 1.6.0 {.  D
07e0: 45 4c 45 54 45 20 46 52 4f 4d 20 7a 7a 20 57 48  ELETE FROM zz WH
07f0: 45 52 45 20 6e 61 6d 65 3d 27 67 2e 74 78 74 27  ERE name='g.txt'
0800: 3b 0a 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20  ;.  SELECT name 
0810: 46 52 4f 4d 20 7a 7a 3b 0a 7d 20 7b 66 2e 74 78  FROM zz;.} {f.tx
0820: 74 20 68 2e 74 78 74 20 69 2e 74 78 74 7d 0a 0a  t h.txt i.txt}..
0830: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0840: 31 2e 36 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  1.6.1 {.  SELECT
0850: 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74 69   name, mode, mti
0860: 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74 68 6f 64  me, data, method
0870: 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 27 74   FROM zipfile('t
0880: 65 73 74 2e 7a 69 70 27 29 3b 0a 7d 20 7b 0a 20  est.zip');.} {. 
0890: 20 66 2e 74 78 74 20 33 33 31 38 38 20 31 30 30   f.txt 33188 100
08a0: 30 30 30 30 30 30 30 20 61 62 63 64 65 20 30 0a  0000000 abcde 0.
08b0: 20 20 68 2e 74 78 74 20 33 33 31 38 38 20 31 30    h.txt 33188 10
08c0: 30 30 30 30 30 30 30 34 20 61 61 61 61 61 61 61  00000004 aaaaaaa
08d0: 61 61 61 62 62 62 62 62 62 62 62 62 62 20 38 0a  aaabbbbbbbbbb 8.
08e0: 20 20 69 2e 74 78 74 20 33 33 31 38 38 20 31 30    i.txt 33188 10
08f0: 30 30 30 30 30 30 30 36 20 7a 78 63 76 62 20 30  00000006 zxcvb 0
0900: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
0910: 65 73 74 20 31 2e 36 2e 32 20 7b 0a 20 20 55 50  est 1.6.2 {.  UP
0920: 44 41 54 45 20 7a 7a 20 53 45 54 20 6d 74 69 6d  DATE zz SET mtim
0930: 65 3d 34 20 57 48 45 52 45 20 6e 61 6d 65 3d 27  e=4 WHERE name='
0940: 69 2e 74 78 74 27 3b 0a 20 20 53 45 4c 45 43 54  i.txt';.  SELECT
0950: 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74 69   name, mode, mti
0960: 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74 68 6f 64  me, data, method
0970: 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 27 74   FROM zipfile('t
0980: 65 73 74 2e 7a 69 70 27 29 3b 0a 7d 20 7b 0a 20  est.zip');.} {. 
0990: 20 66 2e 74 78 74 20 33 33 31 38 38 20 31 30 30   f.txt 33188 100
09a0: 30 30 30 30 30 30 30 20 61 62 63 64 65 20 30 0a  0000000 abcde 0.
09b0: 20 20 68 2e 74 78 74 20 33 33 31 38 38 20 31 30    h.txt 33188 10
09c0: 30 30 30 30 30 30 30 34 20 61 61 61 61 61 61 61  00000004 aaaaaaa
09d0: 61 61 61 62 62 62 62 62 62 62 62 62 62 20 38 0a  aaabbbbbbbbbb 8.
09e0: 20 20 69 2e 74 78 74 20 33 33 31 38 38 20 34 20    i.txt 33188 4 
09f0: 7a 78 63 76 62 20 30 0a 7d 0a 0a 64 6f 5f 65 78  zxcvb 0.}..do_ex
0a00: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 36 2e 33  ecsql_test 1.6.3
0a10: 20 7b 0a 20 20 55 50 44 41 54 45 20 7a 7a 20 53   {.  UPDATE zz S
0a20: 45 54 20 6d 6f 64 65 3d 27 2d 72 77 2d 72 2d 2d  ET mode='-rw-r--
0a30: 72 2d 78 27 20 57 48 45 52 45 20 6e 61 6d 65 3d  r-x' WHERE name=
0a40: 27 68 2e 74 78 74 27 3b 0a 20 20 53 45 4c 45 43  'h.txt';.  SELEC
0a50: 54 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74  T name, mode, mt
0a60: 69 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74 68 6f  ime, data, metho
0a70: 64 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28 27  d FROM zipfile('
0a80: 74 65 73 74 2e 7a 69 70 27 29 3b 0a 7d 20 7b 0a  test.zip');.} {.
0a90: 20 20 66 2e 74 78 74 20 33 33 31 38 38 20 31 30    f.txt 33188 10
0aa0: 30 30 30 30 30 30 30 30 20 61 62 63 64 65 20 30  00000000 abcde 0
0ab0: 0a 20 20 68 2e 74 78 74 20 33 33 31 38 39 20 31  .  h.txt 33189 1
0ac0: 30 30 30 30 30 30 30 30 34 20 61 61 61 61 61 61  000000004 aaaaaa
0ad0: 61 61 61 61 62 62 62 62 62 62 62 62 62 62 20 38  aaaabbbbbbbbbb 8
0ae0: 0a 20 20 69 2e 74 78 74 20 33 33 31 38 38 20 34  .  i.txt 33188 4
0af0: 20 7a 78 63 76 62 20 30 0a 7d 0a 0a 64 6f 5f 65   zxcvb 0.}..do_e
0b00: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 36 2e  xecsql_test 1.6.
0b10: 34 20 7b 0a 20 20 55 50 44 41 54 45 20 7a 7a 20  4 {.  UPDATE zz 
0b20: 53 45 54 20 6e 61 6d 65 20 3d 20 27 62 6c 75 65  SET name = 'blue
0b30: 2e 74 78 74 27 20 57 48 45 52 45 20 6e 61 6d 65  .txt' WHERE name
0b40: 3d 27 66 2e 74 78 74 27 3b 0a 20 20 53 45 4c 45  ='f.txt';.  SELE
0b50: 43 54 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d  CT name, mode, m
0b60: 74 69 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74 68  time, data, meth
0b70: 6f 64 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28  od FROM zipfile(
0b80: 27 74 65 73 74 2e 7a 69 70 27 29 3b 0a 7d 20 7b  'test.zip');.} {
0b90: 0a 20 20 62 6c 75 65 2e 74 78 74 20 33 33 31 38  .  blue.txt 3318
0ba0: 38 20 31 30 30 30 30 30 30 30 30 30 20 61 62 63  8 1000000000 abc
0bb0: 64 65 20 30 0a 20 20 68 2e 74 78 74 20 33 33 31  de 0.  h.txt 331
0bc0: 38 39 20 31 30 30 30 30 30 30 30 30 34 20 61 61  89 1000000004 aa
0bd0: 61 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62  aaaaaaaabbbbbbbb
0be0: 62 62 20 38 0a 20 20 69 2e 74 78 74 20 33 33 31  bb 8.  i.txt 331
0bf0: 38 38 20 34 20 7a 78 63 76 62 20 30 0a 7d 0a 0a  88 4 zxcvb 0.}..
0c00: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0c10: 31 2e 36 2e 35 20 7b 0a 20 20 55 50 44 41 54 45  1.6.5 {.  UPDATE
0c20: 20 7a 7a 20 53 45 54 20 64 61 74 61 20 3d 20 27   zz SET data = '
0c30: 65 64 63 62 61 27 20 57 48 45 52 45 20 6e 61 6d  edcba' WHERE nam
0c40: 65 3d 27 62 6c 75 65 2e 74 78 74 27 3b 0a 20 20  e='blue.txt';.  
0c50: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 6d 6f 64  SELECT name, mod
0c60: 65 2c 20 6d 74 69 6d 65 2c 20 64 61 74 61 2c 20  e, mtime, data, 
0c70: 6d 65 74 68 6f 64 20 46 52 4f 4d 20 7a 69 70 66  method FROM zipf
0c80: 69 6c 65 28 27 74 65 73 74 2e 7a 69 70 27 29 3b  ile('test.zip');
0c90: 0a 7d 20 7b 0a 20 20 62 6c 75 65 2e 74 78 74 20  .} {.  blue.txt 
0ca0: 33 33 31 38 38 20 31 30 30 30 30 30 30 30 30 30  33188 1000000000
0cb0: 20 65 64 63 62 61 20 30 0a 20 20 68 2e 74 78 74   edcba 0.  h.txt
0cc0: 20 33 33 31 38 39 20 31 30 30 30 30 30 30 30 30   33189 100000000
0cd0: 34 20 61 61 61 61 61 61 61 61 61 61 62 62 62 62  4 aaaaaaaaaabbbb
0ce0: 62 62 62 62 62 62 20 38 0a 20 20 69 2e 74 78 74  bbbbbb 8.  i.txt
0cf0: 20 33 33 31 38 38 20 34 20 7a 78 63 76 62 20 30   33188 4 zxcvb 0
0d00: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
0d10: 65 73 74 20 31 2e 36 2e 36 20 7b 0a 20 20 55 50  est 1.6.6 {.  UP
0d20: 44 41 54 45 20 7a 7a 20 53 45 54 20 6d 6f 64 65  DATE zz SET mode
0d30: 3d 4e 55 4c 4c 2c 20 64 61 74 61 20 3d 20 4e 55  =NULL, data = NU
0d40: 4c 4c 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 62  LL WHERE name='b
0d50: 6c 75 65 2e 74 78 74 27 3b 0a 20 20 53 45 4c 45  lue.txt';.  SELE
0d60: 43 54 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d  CT name, mode, m
0d70: 74 69 6d 65 2c 20 64 61 74 61 2c 20 6d 65 74 68  time, data, meth
0d80: 6f 64 20 46 52 4f 4d 20 7a 69 70 66 69 6c 65 28  od FROM zipfile(
0d90: 27 74 65 73 74 2e 7a 69 70 27 29 3b 0a 7d 20 7b  'test.zip');.} {
0da0: 0a 20 20 62 6c 75 65 2e 74 78 74 2f 20 31 36 38  .  blue.txt/ 168
0db0: 37 37 20 31 30 30 30 30 30 30 30 30 30 20 7b 7d  77 1000000000 {}
0dc0: 20 30 0a 20 20 68 2e 74 78 74 20 33 33 31 38 39   0.  h.txt 33189
0dd0: 20 31 30 30 30 30 30 30 30 30 34 20 61 61 61 61   1000000004 aaaa
0de0: 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 62  aaaaaabbbbbbbbbb
0df0: 20 38 0a 20 20 69 2e 74 78 74 20 33 33 31 38 38   8.  i.txt 33188
0e00: 20 34 20 7a 78 63 76 62 20 30 0a 7d 0a 0a 64 6f   4 zxcvb 0.}..do
0e10: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31  _catchsql_test 1
0e20: 2e 36 2e 37 20 7b 0a 20 20 55 50 44 41 54 45 20  .6.7 {.  UPDATE 
0e30: 7a 7a 20 53 45 54 20 64 61 74 61 3d 4e 55 4c 4c  zz SET data=NULL
0e40: 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 69 2e 74   WHERE name='i.t
0e50: 78 74 27 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72  xt'.} {1 {constr
0e60: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
0e70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0e80: 36 2e 38 20 7b 0a 20 20 53 45 4c 45 43 54 20 6e  6.8 {.  SELECT n
0e90: 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65  ame, mode, mtime
0ea0: 2c 20 64 61 74 61 2c 20 6d 65 74 68 6f 64 20 46  , data, method F
0eb0: 52 4f 4d 20 7a 69 70 66 69 6c 65 28 27 74 65 73  ROM zipfile('tes
0ec0: 74 2e 7a 69 70 27 29 3b 0a 7d 20 7b 0a 20 20 62  t.zip');.} {.  b
0ed0: 6c 75 65 2e 74 78 74 2f 20 31 36 38 37 37 20 31  lue.txt/ 16877 1
0ee0: 30 30 30 30 30 30 30 30 30 20 7b 7d 20 30 0a 20  000000000 {} 0. 
0ef0: 20 68 2e 74 78 74 20 33 33 31 38 39 20 31 30 30   h.txt 33189 100
0f00: 30 30 30 30 30 30 34 20 61 61 61 61 61 61 61 61  0000004 aaaaaaaa
0f10: 61 61 62 62 62 62 62 62 62 62 62 62 20 38 0a 20  aabbbbbbbbbb 8. 
0f20: 20 69 2e 74 78 74 20 33 33 31 38 38 20 34 20 7a   i.txt 33188 4 z
0f30: 78 63 76 62 20 30 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  xcvb 0.}..#-----
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f  ----.db close.fo
0f90: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 7a  rcedelete test.z
0fa0: 69 70 0a 72 65 73 65 74 5f 64 62 0a 6c 6f 61 64  ip.reset_db.load
0fb0: 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  _static_extensio
0fc0: 6e 20 64 62 20 7a 69 70 66 69 6c 65 0a 64 6f 5f  n db zipfile.do_
0fd0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 31  execsql_test 2.1
0fe0: 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54   {.  CREATE VIRT
0ff0: 55 41 4c 20 54 41 42 4c 45 20 7a 7a 7a 20 55 53  UAL TABLE zzz US
1000: 49 4e 47 20 7a 69 70 66 69 6c 65 28 27 74 65 73  ING zipfile('tes
1010: 74 2e 7a 69 70 27 29 3b 0a 20 20 49 4e 53 45 52  t.zip');.  INSER
1020: 54 20 49 4e 54 4f 20 7a 7a 7a 28 6e 61 6d 65 2c  T INTO zzz(name,
1030: 20 6d 6f 64 65 29 20 56 41 4c 55 45 53 28 27 64   mode) VALUES('d
1040: 69 72 6e 61 6d 65 27 2c 20 27 64 72 77 78 72 2d  irname', 'drwxr-
1050: 78 72 2d 78 27 29 3b 0a 20 20 53 45 4c 45 43 54  xr-x');.  SELECT
1060: 20 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 64 61 74   name, mode, dat
1070: 61 20 46 52 4f 4d 20 7a 7a 7a 3b 0a 7d 20 7b 64  a FROM zzz;.} {d
1080: 69 72 6e 61 6d 65 2f 20 31 36 38 37 37 20 7b 7d  irname/ 16877 {}
1090: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
10a0: 74 20 32 2e 32 20 7b 0a 20 20 49 4e 53 45 52 54  t 2.2 {.  INSERT
10b0: 20 49 4e 54 4f 20 7a 7a 7a 28 6e 61 6d 65 2c 20   INTO zzz(name, 
10c0: 64 61 74 61 29 20 56 41 4c 55 45 53 28 27 64 69  data) VALUES('di
10d0: 72 6e 61 6d 65 32 27 2c 20 4e 55 4c 4c 29 3b 0a  rname2', NULL);.
10e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
10f0: 7a 28 6e 61 6d 65 2c 20 64 61 74 61 29 20 56 41  z(name, data) VA
1100: 4c 55 45 53 28 27 64 69 72 6e 61 6d 65 32 2f 66  LUES('dirname2/f
1110: 69 6c 65 31 2e 74 78 74 27 2c 20 27 61 62 63 64  ile1.txt', 'abcd
1120: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 27 29 3b 0a  efghijklmnop');.
1130: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 6d    SELECT name, m
1140: 6f 64 65 2c 20 64 61 74 61 20 46 52 4f 4d 20 7a  ode, data FROM z
1150: 7a 7a 3b 0a 7d 20 7b 0a 20 20 64 69 72 6e 61 6d  zz;.} {.  dirnam
1160: 65 2f 20 31 36 38 37 37 20 7b 7d 0a 20 20 64 69  e/ 16877 {}.  di
1170: 72 6e 61 6d 65 32 2f 20 31 36 38 37 37 20 7b 7d  rname2/ 16877 {}
1180: 0a 20 20 64 69 72 6e 61 6d 65 32 2f 66 69 6c 65  .  dirname2/file
1190: 31 2e 74 78 74 20 33 33 31 38 38 20 61 62 63 64  1.txt 33188 abcd
11a0: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 0a 7d 0a 0a  efghijklmnop.}..
11b0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
11c0: 20 32 2e 33 20 7b 0a 20 20 55 50 44 41 54 45 20   2.3 {.  UPDATE 
11d0: 7a 7a 7a 20 53 45 54 20 6e 61 6d 65 20 3d 20 27  zzz SET name = '
11e0: 64 69 72 6e 61 6d 65 33 27 20 57 48 45 52 45 20  dirname3' WHERE 
11f0: 6e 61 6d 65 20 3d 20 27 64 69 72 6e 61 6d 65 2f  name = 'dirname/
1200: 27 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65  ';.} {0 {}}.do_e
1210: 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 34 20  xecsql_test 2.4 
1220: 7b 0a 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c  {.  SELECT name,
1230: 20 6d 6f 64 65 2c 20 64 61 74 61 20 46 52 4f 4d   mode, data FROM
1240: 20 7a 7a 7a 3b 0a 7d 20 7b 0a 20 20 64 69 72 6e   zzz;.} {.  dirn
1250: 61 6d 65 33 2f 20 31 36 38 37 37 20 7b 7d 0a 20  ame3/ 16877 {}. 
1260: 20 64 69 72 6e 61 6d 65 32 2f 20 31 36 38 37 37   dirname2/ 16877
1270: 20 7b 7d 0a 20 20 64 69 72 6e 61 6d 65 32 2f 66   {}.  dirname2/f
1280: 69 6c 65 31 2e 74 78 74 20 33 33 31 38 38 20 61  ile1.txt 33188 a
1290: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 0a  bcdefghijklmnop.
12a0: 7d 0a 0a 23 20 49 66 20 6f 6e 20 75 6e 69 78 2c  }..# If on unix,
12b0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
12c0: 5b 75 6e 7a 69 70 5d 20 75 74 69 6c 69 74 79 20  [unzip] utility 
12d0: 63 61 6e 20 75 6e 70 61 63 6b 20 6f 75 72 20 61  can unpack our a
12e0: 72 63 68 69 76 65 2e 0a 23 0a 69 66 20 7b 24 3a  rchive..#.if {$:
12f0: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c  :tcl_platform(pl
1300: 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d  atform)=="unix"}
1310: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 35   {.  do_test 2.5
1320: 2e 31 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65  .1 {.    forcede
1330: 6c 65 74 65 20 64 69 72 6e 61 6d 65 0a 20 20 20  lete dirname.   
1340: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 64 69 72   forcedelete dir
1350: 6e 61 6d 65 32 0a 20 20 20 20 73 65 74 20 72 63  name2.    set rc
1360: 20 5b 63 61 74 63 68 20 7b 20 65 78 65 63 20 75   [catch { exec u
1370: 6e 7a 69 70 20 74 65 73 74 2e 7a 69 70 20 3e 20  nzip test.zip > 
1380: 2f 64 65 76 2f 6e 75 6c 6c 20 7d 20 6d 73 67 5d  /dev/null } msg]
1390: 0a 20 20 20 20 6c 69 73 74 20 24 72 63 20 24 6d  .    list $rc $m
13a0: 73 67 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20  sg.  } {0 {}}.  
13b0: 64 6f 5f 74 65 73 74 20 32 2e 35 2e 32 20 7b 20  do_test 2.5.2 { 
13c0: 66 69 6c 65 20 69 73 64 69 72 20 64 69 72 6e 61  file isdir dirna
13d0: 6d 65 33 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  me3 } 1.  do_tes
13e0: 74 20 32 2e 35 2e 33 20 7b 20 66 69 6c 65 20 69  t 2.5.3 { file i
13f0: 73 64 69 72 20 64 69 72 6e 61 6d 65 32 20 7d 20  sdir dirname2 } 
1400: 31 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 35 2e  1.  do_test 2.5.
1410: 34 20 7b 20 66 69 6c 65 20 69 73 64 69 72 20 64  4 { file isdir d
1420: 69 72 6e 61 6d 65 32 2f 66 69 6c 65 31 2e 74 78  irname2/file1.tx
1430: 74 20 7d 20 30 0a 20 20 64 6f 5f 74 65 73 74 20  t } 0.  do_test 
1440: 32 2e 35 2e 35 20 7b 20 0a 20 20 20 20 73 65 74  2.5.5 { .    set
1450: 20 66 64 20 5b 6f 70 65 6e 20 64 69 72 6e 61 6d   fd [open dirnam
1460: 65 32 2f 66 69 6c 65 31 2e 74 78 74 5d 0a 20 20  e2/file1.txt].  
1470: 20 20 73 65 74 20 64 61 74 61 20 5b 72 65 61 64    set data [read
1480: 20 24 66 64 5d 0a 20 20 20 20 63 6c 6f 73 65 20   $fd].    close 
1490: 24 66 64 0a 20 20 20 20 73 65 74 20 64 61 74 61  $fd.    set data
14a0: 0a 20 20 7d 20 7b 61 62 63 64 65 66 67 68 69 6a  .  } {abcdefghij
14b0: 6b 6c 6d 6e 6f 70 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  klmnop}.}..#----
14c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1500: 2d 2d 2d 2d 2d 0a 72 65 73 65 74 5f 64 62 0a 66  -----.reset_db.f
1510: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
1520: 7a 69 70 0a 6c 6f 61 64 5f 73 74 61 74 69 63 5f  zip.load_static_
1530: 65 78 74 65 6e 73 69 6f 6e 20 64 62 20 7a 69 70  extension db zip
1540: 66 69 6c 65 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  file..do_execsql
1550: 5f 74 65 73 74 20 33 2e 30 20 7b 0a 20 20 43 52  _test 3.0 {.  CR
1560: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1570: 4c 45 20 74 65 6d 70 2e 78 31 20 55 53 49 4e 47  LE temp.x1 USING
1580: 20 7a 69 70 66 69 6c 65 28 27 74 65 73 74 2e 7a   zipfile('test.z
1590: 69 70 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ip');.  INSERT I
15a0: 4e 54 4f 20 78 31 28 6e 61 6d 65 2c 20 64 61 74  NTO x1(name, dat
15b0: 61 29 20 56 41 4c 55 45 53 28 27 64 69 72 31 2f  a) VALUES('dir1/
15c0: 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45  ', NULL);.  INSE
15d0: 52 54 20 49 4e 54 4f 20 78 31 28 6e 61 6d 65 2c  RT INTO x1(name,
15e0: 20 64 61 74 61 29 20 56 41 4c 55 45 53 28 27 66   data) VALUES('f
15f0: 69 6c 65 31 27 2c 20 27 31 32 33 34 27 29 3b 0a  ile1', '1234');.
1600: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
1610: 28 6e 61 6d 65 2c 20 64 61 74 61 29 20 56 41 4c  (name, data) VAL
1620: 55 45 53 28 27 64 69 72 31 2f 66 69 6c 65 32 27  UES('dir1/file2'
1630: 2c 20 27 35 36 37 38 27 29 3b 0a 7d 0a 66 6f 72  , '5678');.}.for
1640: 65 61 63 68 20 7b 74 6e 20 66 6e 61 6d 65 7d 20  each {tn fname} 
1650: 7b 0a 20 20 31 20 64 69 72 31 0a 20 20 32 20 66  {.  1 dir1.  2 f
1660: 69 6c 65 31 0a 20 20 33 20 64 69 72 31 2f 66 69  ile1.  3 dir1/fi
1670: 6c 65 32 0a 7d 20 7b 0a 20 20 64 6f 5f 63 61 74  le2.} {.  do_cat
1680: 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 31 2e 24  chsql_test 3.1.$
1690: 74 6e 2e 30 20 7b 0a 20 20 20 20 49 4e 53 45 52  tn.0 {.    INSER
16a0: 54 20 49 4e 54 4f 20 78 31 28 6e 61 6d 65 2c 20  T INTO x1(name, 
16b0: 64 61 74 61 29 20 56 41 4c 55 45 53 28 24 66 6e  data) VALUES($fn
16c0: 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d 20  ame, NULL);.  } 
16d0: 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66  {1 {constraint f
16e0: 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 63 61 74  ailed}}.  do_cat
16f0: 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 31 2e 24  chsql_test 3.1.$
1700: 74 6e 2e 31 20 7b 0a 20 20 20 20 49 4e 53 45 52  tn.1 {.    INSER
1710: 54 20 49 4e 54 4f 20 78 31 28 6e 61 6d 65 2c 20  T INTO x1(name, 
1720: 64 61 74 61 29 20 56 41 4c 55 45 53 28 24 66 6e  data) VALUES($fn
1730: 61 6d 65 20 7c 7c 20 27 2f 27 2c 20 4e 55 4c 4c  ame || '/', NULL
1740: 29 3b 0a 20 20 7d 20 7b 31 20 7b 63 6f 6e 73 74  );.  } {1 {const
1750: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20  raint failed}}. 
1760: 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73   do_catchsql_tes
1770: 74 20 33 2e 31 2e 24 74 6e 2e 32 20 7b 0a 20 20  t 3.1.$tn.2 {.  
1780: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
1790: 28 6e 61 6d 65 2c 20 64 61 74 61 29 20 56 41 4c  (name, data) VAL
17a0: 55 45 53 28 24 66 6e 61 6d 65 2c 20 27 61 62 63  UES($fname, 'abc
17b0: 64 27 29 3b 0a 20 20 7d 20 7b 31 20 7b 63 6f 6e  d');.  } {1 {con
17c0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
17d0: 0a 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  .}..do_catchsql_
17e0: 74 65 73 74 20 33 2e 32 20 7b 0a 20 20 53 45 4c  test 3.2 {.  SEL
17f0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 78  ECT rowid FROM x
1800: 31 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  1.} {1 {no such 
1810: 63 6f 6c 75 6d 6e 3a 20 72 6f 77 69 64 7d 7d 0a  column: rowid}}.
1820: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a     ..finish_test..