/ Hex Artifact Content
Login

Artifact a2becabcb9fe25d08d1ae49c0788f4a75dda97bfe4c8641c2d04e224faf7a6e2:


0000: 23 20 32 30 31 31 20 41 70 72 69 6c 20 32 32 0a  # 2011 April 22.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73  *****.#..set tes
0170: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
0180: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
0190: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
01a0: 72 2e 74 63 6c 0a 0a 23 20 54 65 73 74 20 6f 72  r.tcl..# Test or
01b0: 67 61 6e 69 7a 61 74 69 6f 6e 3a 0a 23 0a 23 20  ganization:.#.# 
01c0: 20 20 31 2e 2a 3a 20 54 68 61 74 20 66 69 6c 65    1.*: That file
01d0: 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 72 72 65   names are corre
01e0: 63 74 6c 79 20 65 78 74 72 61 63 74 65 64 20 66  ctly extracted f
01f0: 72 6f 6d 20 55 52 49 73 2e 0a 23 20 20 20 32 2e  rom URIs..#   2.
0200: 2a 3a 20 54 68 61 74 20 55 52 49 20 6f 70 74 69  *: That URI opti
0210: 6f 6e 73 20 28 71 75 65 72 79 20 70 61 72 61 6d  ons (query param
0220: 65 74 65 72 73 29 20 61 72 65 20 63 6f 72 72 65  eters) are corre
0230: 63 74 6c 79 20 65 78 74 72 61 63 74 65 64 20 66  ctly extracted f
0240: 72 6f 6d 20 55 52 49 73 2e 0a 23 20 20 20 33 2e  rom URIs..#   3.
0250: 2a 3a 20 54 68 61 74 20 73 70 65 63 69 66 79 69  *: That specifyi
0260: 6e 67 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 56 46  ng an unknown VF
0270: 53 20 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f  S causes an erro
0280: 72 2e 0a 23 20 20 20 34 2e 2a 3a 20 54 65 73 74  r..#   4.*: Test
0290: 73 20 66 6f 72 20 73 70 65 63 69 66 79 69 6e 67  s for specifying
02a0: 20 6f 74 68 65 72 20 6f 70 74 69 6f 6e 73 20 28   other options (
02b0: 6f 74 68 65 72 20 74 68 61 6e 20 22 76 66 73 22  other than "vfs"
02c0: 29 2e 0a 23 20 20 20 35 2e 2a 3a 20 54 65 73 74  )..#   5.*: Test
02d0: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
02e0: 6e 74 20 56 46 53 20 77 69 74 68 20 61 6e 20 61  nt VFS with an a
02f0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
0300: 2e 0a 23 20 20 20 36 2e 2a 3a 20 54 65 73 74 20  ..#   6.*: Test 
0310: 74 68 61 74 20 61 75 74 68 6f 72 69 74 69 65 73  that authorities
0320: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 22 20 61   other than "" a
0330: 6e 64 20 6c 6f 63 61 6c 68 6f 73 74 20 63 61 75  nd localhost cau
0340: 73 65 20 65 72 72 6f 72 73 2e 0a 23 20 20 20 37  se errors..#   7
0350: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61 20  .*: Test that a 
0360: 72 65 61 64 2d 77 72 69 74 65 20 64 62 20 63 61  read-write db ca
0370: 6e 20 62 65 20 61 74 74 61 63 68 65 64 20 74 6f  n be attached to
0380: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 6f 6e   a read-only con
0390: 6e 65 63 74 69 6f 6e 2e 0a 23 0a 0a 73 65 74 20  nection..#..set 
03a0: 74 65 73 74 70 72 65 66 69 78 20 75 72 69 0a 64  testprefix uri.d
03b0: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 5f  b close.sqlite3_
03c0: 73 68 75 74 64 6f 77 6e 0a 73 71 6c 69 74 65 33  shutdown.sqlite3
03d0: 5f 63 6f 6e 66 69 67 5f 75 72 69 20 31 0a 0a 23  _config_uri 1..#
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
0430: 20 74 68 61 74 20 66 69 6c 65 20 6e 61 6d 65 73   that file names
0440: 20 61 72 65 20 63 6f 72 72 65 63 74 6c 79 20 65   are correctly e
0450: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 55 52  xtracted from UR
0460: 49 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  Is..#.foreach {t
0470: 6e 20 75 72 69 20 66 69 6c 65 7d 20 7b 0a 20 20  n uri file} {.  
0480: 31 20 20 20 20 20 20 74 65 73 74 2e 64 62 20 20  1      test.db  
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
04b0: 2e 64 62 0a 20 20 32 20 20 20 20 20 20 66 69 6c  .db.  2      fil
04c0: 65 3a 74 65 73 74 2e 64 62 20 20 20 20 20 20 20  e:test.db       
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 20 20 74 65 73 74 2e 64 62 0a 20 20 33 20 20 20    test.db.  3   
04f0: 20 20 20 66 69 6c 65 3a 2f 2f 50 57 44 2f 74 65     file://PWD/te
0500: 73 74 2e 64 62 20 20 20 20 20 20 20 20 20 20 20  st.db           
0510: 20 20 20 20 20 20 20 20 74 65 73 74 2e 64 62 0a          test.db.
0520: 20 20 34 20 20 20 20 20 20 66 69 6c 65 3a 50 57    4      file:PW
0530: 44 2f 74 65 73 74 2e 64 62 20 20 20 20 20 20 20  D/test.db       
0540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
0550: 73 74 2e 64 62 0a 20 20 35 20 20 20 20 20 20 66  st.db.  5      f
0560: 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 72 6b  ile:test.db?mork
0570: 3d 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =1              
0580: 20 20 20 20 74 65 73 74 2e 64 62 0a 20 20 36 20      test.db.  6 
0590: 20 20 20 20 20 66 69 6c 65 3a 74 65 73 74 2e 64       file:test.d
05a0: 62 3f 6d 6f 72 6b 3d 31 26 74 6f 6e 67 6c 6f 72  b?mork=1&tonglor
05b0: 3d 32 20 20 20 20 20 20 20 20 74 65 73 74 2e 64  =2        test.d
05c0: 62 0a 20 20 37 20 20 20 20 20 20 66 69 6c 65 3a  b.  7      file:
05d0: 74 65 73 74 2e 64 62 3f 6d 6f 72 6b 3d 31 23 62  test.db?mork=1#b
05e0: 6f 72 69 73 20 20 20 20 20 20 20 20 20 20 20 20  oris            
05f0: 74 65 73 74 2e 64 62 0a 20 20 38 20 20 20 20 20  test.db.  8     
0600: 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 23 62 6f   file:test.db#bo
0610: 72 69 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ris             
0620: 20 20 20 20 20 20 74 65 73 74 2e 64 62 0a 20 20        test.db.  
0630: 39 20 20 20 20 20 20 74 65 73 74 2e 64 62 23 62  9      test.db#b
0640: 6f 72 69 73 20 20 20 20 20 20 20 20 20 20 20 20  oris            
0650: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
0660: 2e 64 62 23 62 6f 72 69 73 0a 20 20 31 30 20 20  .db#boris.  10  
0670: 20 20 20 66 69 6c 65 3a 74 65 73 74 25 32 45 64     file:test%2Ed
0680: 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
0690: 20 20 20 20 20 20 20 20 74 65 73 74 2e 64 62 0a          test.db.
06a0: 20 20 31 31 20 20 20 20 20 66 69 6c 65 20 20 20    11     file   
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
06d0: 6c 65 0a 20 20 31 32 20 20 20 20 20 68 74 74 70  le.  12     http
06e0: 3a 74 65 73 74 2e 64 62 20 20 20 20 20 20 20 20  :test.db        
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 68 74 74 70 3a 74 65 73 74 2e 64 62 0a 20 20   http:test.db.  
0710: 31 33 20 20 20 20 20 66 69 6c 65 3a 74 65 73 74  13     file:test
0720: 2e 64 62 25 30 30 65 78 74 72 61 20 20 20 20 20  .db%00extra     
0730: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
0740: 2e 64 62 0a 20 20 31 34 20 20 20 20 20 66 69 6c  .db.  14     fil
0750: 65 3a 74 65 73 74 64 62 25 30 30 2e 64 62 25 30  e:testdb%00.db%0
0760: 30 65 78 74 72 61 20 20 20 20 20 20 20 20 20 20  0extra          
0770: 20 20 74 65 73 74 64 62 0a 0a 20 20 31 35 20 20    testdb..  15  
0780: 20 20 20 74 65 73 74 2e 64 62 3f 6d 6f 72 6b 3d     test.db?mork=
0790: 31 23 62 6f 72 69 73 20 20 20 20 20 20 20 20 20  1#boris         
07a0: 20 20 20 20 20 20 20 20 74 65 73 74 2e 64 62 3f          test.db?
07b0: 6d 6f 72 6b 3d 31 23 62 6f 72 69 73 0a 20 20 31  mork=1#boris.  1
07c0: 36 20 20 20 20 20 66 69 6c 65 3a 2f 2f 6c 6f 63  6     file://loc
07d0: 61 6c 68 6f 73 74 50 57 44 2f 74 65 73 74 2e 64  alhostPWD/test.d
07e0: 62 25 33 46 68 65 6c 6c 6f 20 20 74 65 73 74 2e  b%3Fhello  test.
07f0: 64 62 3f 68 65 6c 6c 6f 0a 7d 20 7b 0a 20 20 0a  db?hello.} {.  .
0800: 0a 20 20 69 66 63 61 70 61 62 6c 65 20 21 63 75  .  ifcapable !cu
0810: 72 64 69 72 20 7b 20 69 66 20 7b 24 74 6e 3d 3d  rdir { if {$tn==
0820: 33 7d 20 62 72 65 61 6b 20 7d 0a 0a 20 20 69 66  3} break }..  if
0830: 63 61 70 61 62 6c 65 20 75 72 69 5f 30 30 5f 65  capable uri_00_e
0840: 72 72 6f 72 20 7b 0a 20 20 20 20 69 66 20 7b 5b  rror {.    if {[
0850: 73 74 72 69 6e 67 20 66 69 72 73 74 20 25 30 30  string first %00
0860: 20 24 75 72 69 5d 3e 3d 30 7d 20 63 6f 6e 74 69   $uri]>=0} conti
0870: 6e 75 65 0a 20 20 7d 0a 0a 20 20 69 66 20 7b 24  nue.  }..  if {$
0880: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
0890: 74 66 6f 72 6d 29 3d 3d 22 77 69 6e 64 6f 77 73  tform)=="windows
08a0: 22 7d 20 7b 0a 20 20 20 20 23 0a 20 20 20 20 23  "} {.    #.    #
08b0: 20 4e 4f 54 45 3a 20 44 75 65 20 74 6f 20 6c 69   NOTE: Due to li
08c0: 6d 69 74 73 20 6f 6e 20 6c 65 67 61 6c 20 63 68  mits on legal ch
08d0: 61 72 61 63 74 65 72 73 20 66 6f 72 20 66 69 6c  aracters for fil
08e0: 65 20 6e 61 6d 65 73 20 69 6d 70 6f 73 65 64 20  e names imposed 
08f0: 62 79 0a 20 20 20 20 23 20 20 20 20 20 20 20 57  by.    #       W
0900: 69 6e 64 6f 77 73 2c 20 77 65 20 6d 75 73 74 20  indows, we must 
0910: 73 6b 69 70 20 74 68 65 20 66 69 6e 61 6c 20 74  skip the final t
0920: 77 6f 20 74 65 73 74 73 20 68 65 72 65 20 28 69  wo tests here (i
0930: 2e 65 2e 20 74 68 65 0a 20 20 20 20 23 20 20 20  .e. the.    #   
0940: 20 20 20 20 71 75 65 73 74 69 6f 6e 20 6d 61 72      question mar
0950: 6b 20 69 73 20 69 6c 6c 65 67 61 6c 20 69 6e 20  k is illegal in 
0960: 61 20 66 69 6c 65 20 6e 61 6d 65 20 6f 6e 20 57  a file name on W
0970: 69 6e 64 6f 77 73 29 2e 0a 20 20 20 20 23 0a 20  indows)..    #. 
0980: 20 20 20 69 66 20 7b 24 74 6e 3e 31 34 7d 20 62     if {$tn>14} b
0990: 72 65 61 6b 0a 0a 20 20 20 20 23 0a 20 20 20 20  reak..    #.    
09a0: 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 72 75 6e  # NOTE: When run
09b0: 6e 69 6e 67 20 6f 6e 20 54 63 6c 20 38 2e 36 20  ning on Tcl 8.6 
09c0: 28 6f 72 20 68 69 67 68 65 72 3f 29 20 6f 6e 20  (or higher?) on 
09d0: 57 69 6e 64 6f 77 73 2c 20 61 20 63 6f 6c 6f 6e  Windows, a colon
09e0: 20 77 69 74 68 69 6e 0a 20 20 20 20 23 20 20 20   within.    #   
09f0: 20 20 20 20 74 68 65 20 66 69 6c 65 20 6e 61 6d      the file nam
0a00: 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 69 65  e no longer trie
0a10: 73 20 74 6f 20 61 63 63 65 73 73 20 61 6e 20 61  s to access an a
0a20: 6c 74 65 72 6e 61 74 65 20 64 61 74 61 20 73 74  lternate data st
0a30: 72 65 61 6d 0a 20 20 20 20 23 20 20 20 20 20 20  ream.    #      
0a40: 20 28 41 44 53 29 20 6e 61 6d 65 64 20 22 74 65   (ADS) named "te
0a50: 73 74 2e 64 62 22 20 66 6f 72 20 74 68 65 20 22  st.db" for the "
0a60: 68 74 74 70 22 20 66 69 6c 65 2c 20 63 61 75 73  http" file, caus
0a70: 69 6e 67 20 73 6f 6d 65 20 73 70 75 72 69 6f 75  ing some spuriou
0a80: 73 0a 20 20 20 20 23 20 20 20 20 20 20 20 66 61  s.    #       fa
0a90: 69 6c 75 72 65 73 20 6f 66 20 74 68 69 73 20 74  ilures of this t
0aa0: 65 73 74 2e 0a 20 20 20 20 23 0a 20 20 20 20 69  est..    #.    i
0ab0: 66 20 7b 24 74 6e 3d 3d 31 32 20 26 26 20 24 3a  f {$tn==12 && $:
0ac0: 3a 74 63 6c 5f 76 65 72 73 69 6f 6e 3e 3d 38 2e  :tcl_version>=8.
0ad0: 36 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 20 20 20  6} continue..   
0ae0: 20 23 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f   #.    # NOTE: O
0af0: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 6e 65  n Windows, we ne
0b00: 65 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ed to account fo
0b10: 72 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  r the fact that 
0b20: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
0b30: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
0b40: 79 20 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74  y does not start
0b50: 20 77 69 74 68 20 61 20 66 6f 72 77 61 72 64 20   with a forward 
0b60: 73 6c 61 73 68 2e 0a 20 20 20 20 23 0a 20 20 20  slash..    #.   
0b70: 20 73 65 74 20 75 72 69 20 20 5b 73 74 72 69 6e   set uri  [strin
0b80: 67 20 6d 61 70 20 5b 6c 69 73 74 20 50 57 44 2f  g map [list PWD/
0b90: 20 2f 5b 74 65 73 74 5f 70 77 64 20 2f 5d 5d 20   /[test_pwd /]] 
0ba0: 24 75 72 69 5d 0a 20 20 7d 20 65 6c 73 65 20 7b  $uri].  } else {
0bb0: 0a 20 20 20 20 73 65 74 20 75 72 69 20 20 5b 73  .    set uri  [s
0bc0: 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
0bd0: 50 57 44 2f 20 5b 74 65 73 74 5f 70 77 64 20 2f  PWD/ [test_pwd /
0be0: 5d 5d 20 24 75 72 69 5d 0a 20 20 7d 0a 0a 20 20  ]] $uri].  }..  
0bf0: 69 66 20 7b 5b 66 69 6c 65 20 69 73 64 69 72 20  if {[file isdir 
0c00: 24 66 69 6c 65 5d 7d 20 7b 65 72 72 6f 72 20 22  $file]} {error "
0c10: 24 66 69 6c 65 20 69 73 20 61 20 64 69 72 65 63  $file is a direc
0c20: 74 6f 72 79 22 7d 0a 20 20 66 6f 72 63 65 64 65  tory"}.  forcede
0c30: 6c 65 74 65 20 24 66 69 6c 65 0a 20 20 64 6f 5f  lete $file.  do_
0c40: 74 65 73 74 20 31 2e 24 74 6e 2e 31 20 7b 20 66  test 1.$tn.1 { f
0c50: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
0c60: 20 7d 20 30 0a 20 20 73 65 74 20 44 42 20 5b 73   } 0.  set DB [s
0c70: 71 6c 69 74 65 33 5f 6f 70 65 6e 20 24 75 72 69  qlite3_open $uri
0c80: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 74  ].  do_test 1.$t
0c90: 6e 2e 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74  n.2 { file exist
0ca0: 73 20 24 66 69 6c 65 20 7d 20 31 0a 20 20 73 71  s $file } 1.  sq
0cb0: 6c 69 74 65 33 5f 63 6c 6f 73 65 20 24 44 42 0a  lite3_close $DB.
0cc0: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66    forcedelete $f
0cd0: 69 6c 65 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31  ile..  do_test 1
0ce0: 2e 24 74 6e 2e 33 20 7b 20 66 69 6c 65 20 65 78  .$tn.3 { file ex
0cf0: 69 73 74 73 20 24 66 69 6c 65 20 7d 20 30 0a 20  ists $file } 0. 
0d00: 20 73 71 6c 69 74 65 33 20 64 62 20 78 78 78 2e   sqlite3 db xxx.
0d10: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
0d20: 41 54 54 41 43 48 20 24 75 72 69 20 41 53 20 61  ATTACH $uri AS a
0d30: 75 78 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31  ux }.  do_test 1
0d40: 2e 24 74 6e 2e 34 20 7b 20 66 69 6c 65 20 65 78  .$tn.4 { file ex
0d50: 69 73 74 73 20 24 66 69 6c 65 20 7d 20 31 0a 20  ists $file } 1. 
0d60: 20 64 62 20 63 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d   db close.}..#--
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
0dc0: 68 61 74 20 55 52 49 20 71 75 65 72 79 20 70 61  hat URI query pa
0dd0: 72 61 6d 65 74 65 72 73 20 61 72 65 20 70 61 73  rameters are pas
0de0: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
0df0: 68 65 20 56 46 53 20 6c 61 79 65 72 0a 23 20 63  he VFS layer.# c
0e00: 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 74 65 73 74  orrectly..#.test
0e10: 76 66 73 20 74 76 66 73 32 0a 74 65 73 74 76 66  vfs tvfs2.testvf
0e20: 73 20 74 76 66 73 20 2d 64 65 66 61 75 6c 74 20  s tvfs -default 
0e30: 31 0a 74 76 66 73 20 66 69 6c 74 65 72 20 78 4f  1.tvfs filter xO
0e40: 70 65 6e 0a 74 76 66 73 20 73 63 72 69 70 74 20  pen.tvfs script 
0e50: 6f 70 65 6e 5f 6d 65 74 68 6f 64 0a 70 72 6f 63  open_method.proc
0e60: 20 6f 70 65 6e 5f 6d 65 74 68 6f 64 20 7b 6d 65   open_method {me
0e70: 74 68 6f 64 20 66 69 6c 65 20 61 72 67 6c 69 73  thod file arglis
0e80: 74 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 61 72 67  t} {.  set ::arg
0e90: 6c 69 73 74 20 24 61 72 67 6c 69 73 74 0a 7d 0a  list $arglist.}.
0ea0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 75 72 69 20  foreach {tn uri 
0eb0: 6b 76 6c 69 73 74 7d 20 7b 0a 20 20 31 20 20 20  kvlist} {.  1   
0ec0: 20 20 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f     file:test.db?
0ed0: 68 65 6c 6c 6f 3d 77 6f 72 6c 64 20 20 20 20 20  hello=world     
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 0a 20 20  {hello world}.  
0f00: 32 20 20 20 20 20 20 66 69 6c 65 3a 74 65 73 74  2      file:test
0f10: 2e 64 62 3f 68 65 6c 6c 6f 26 77 6f 72 6c 64 20  .db?hello&world 
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 20 20 7b 68 65 6c 6c 6f 20 7b 7d 20 77 6f      {hello {} wo
0f40: 72 6c 64 20 7b 7d 7d 0a 20 20 33 20 20 20 20 20  rld {}}.  3     
0f50: 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 68 65   file:test.db?he
0f60: 6c 6c 6f 3d 31 26 77 6f 72 6c 64 3d 32 26 76 66  llo=1&world=2&vf
0f70: 73 3d 74 76 66 73 20 20 20 20 20 20 20 20 7b 68  s=tvfs        {h
0f80: 65 6c 6c 6f 20 31 20 77 6f 72 6c 64 20 32 20 76  ello 1 world 2 v
0f90: 66 73 20 74 76 66 73 7d 0a 20 20 34 20 20 20 20  fs tvfs}.  4    
0fa0: 20 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 68    file:test.db?h
0fb0: 65 6c 6c 6f 3d 31 26 77 6f 72 6c 64 3d 32 26 76  ello=1&world=2&v
0fc0: 66 73 3d 74 76 66 73 32 20 20 20 20 20 20 20 20  fs=tvfs2        
0fd0: 7b 7d 0a 20 20 35 20 20 20 20 20 20 66 69 6c 65  {}.  5      file
0fe0: 3a 74 65 73 74 2e 64 62 3f 25 36 38 25 36 35 25  :test.db?%68%65%
0ff0: 36 43 25 36 43 25 36 46 3d 25 37 37 25 36 46 25  6C%6C%6F=%77%6F%
1000: 37 32 25 36 43 25 36 34 20 7b 68 65 6c 6c 6f 20  72%6C%64 {hello 
1010: 77 6f 72 6c 64 7d 0a 20 20 36 20 20 20 20 20 20  world}.  6      
1020: 66 69 6c 65 3a 74 65 73 74 64 62 25 30 30 2e 64  file:testdb%00.d
1030: 62 3f 68 65 6c 6c 6f 25 30 30 65 78 74 72 61 3d  b?hello%00extra=
1040: 77 6f 72 6c 64 25 30 30 65 78 20 20 20 7b 68 65  world%00ex   {he
1050: 6c 6c 6f 20 77 6f 72 6c 64 7d 0a 20 20 37 20 20  llo world}.  7  
1060: 20 20 20 20 66 69 6c 65 3a 74 65 73 74 64 62 25      file:testdb%
1070: 30 30 2e 64 62 3f 68 65 6c 6c 6f 25 30 30 3d 77  00.db?hello%00=w
1080: 6f 72 6c 64 25 30 30 20 20 20 20 20 20 20 20 20  orld%00         
1090: 20 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 0a 20   {hello world}. 
10a0: 20 38 20 20 20 20 20 20 66 69 6c 65 3a 74 65 73   8      file:tes
10b0: 74 64 62 25 30 30 2e 64 62 3f 3d 77 6f 72 6c 64  tdb%00.db?=world
10c0: 26 78 79 7a 3d 61 62 63 20 20 20 20 20 20 20 20  &xyz=abc        
10d0: 20 20 20 20 20 7b 78 79 7a 20 61 62 63 7d 0a 20       {xyz abc}. 
10e0: 20 39 20 20 20 20 20 20 66 69 6c 65 3a 74 65 73   9      file:tes
10f0: 74 2e 64 62 3f 25 30 30 68 65 6c 6c 6f 3d 77 6f  t.db?%00hello=wo
1100: 72 6c 64 26 78 79 7a 3d 61 62 63 20 20 20 20 20  rld&xyz=abc     
1110: 20 20 20 20 20 7b 78 79 7a 20 61 62 63 7d 0a 20       {xyz abc}. 
1120: 20 31 30 20 20 20 20 20 66 69 6c 65 3a 74 65 73   10     file:tes
1130: 74 2e 64 62 3f 68 65 6c 6c 6f 3d 25 30 30 77 6f  t.db?hello=%00wo
1140: 72 6c 64 26 78 79 7a 3d 20 20 20 20 20 20 20 20  rld&xyz=        
1150: 20 20 20 20 20 7b 68 65 6c 6c 6f 20 7b 7d 20 78       {hello {} x
1160: 79 7a 20 7b 7d 7d 0a 20 20 31 31 20 20 20 20 20  yz {}}.  11     
1170: 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 3d 23 72  file:test.db?=#r
1180: 61 76 61 64 61 20 20 20 20 20 20 20 20 20 20 20  avada           
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a               {}.
11a0: 20 20 31 32 20 20 20 20 20 66 69 6c 65 3a 74 65    12     file:te
11b0: 73 74 2e 64 62 3f 26 26 26 26 26 26 26 26 68 65  st.db?&&&&&&&&he
11c0: 6c 6c 6f 3d 77 6f 72 6c 64 26 26 26 26 26 26 26  llo=world&&&&&&&
11d0: 20 20 20 20 20 20 7b 68 65 6c 6c 6f 20 77 6f 72        {hello wor
11e0: 6c 64 7d 0a 0a 20 20 31 33 20 20 20 20 20 74 65  ld}..  13     te
11f0: 73 74 2e 64 62 3f 26 26 26 26 26 26 26 26 68 65  st.db?&&&&&&&&he
1200: 6c 6c 6f 3d 77 6f 72 6c 64 26 26 26 26 26 26 26  llo=world&&&&&&&
1210: 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20             {}.  
1220: 31 34 20 20 20 20 20 68 74 74 70 3a 74 65 73 74  14     http:test
1230: 2e 64 62 3f 68 65 6c 6c 6f 26 77 6f 72 6c 64 20  .db?hello&world 
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 20 7b 7d 0a 7d 20 7b 0a 0a 20 20 69 66      {}.} {..  if
1260: 63 61 70 61 62 6c 65 20 75 72 69 5f 30 30 5f 65  capable uri_00_e
1270: 72 72 6f 72 20 7b 0a 20 20 20 20 69 66 20 7b 5b  rror {.    if {[
1280: 73 74 72 69 6e 67 20 66 69 72 73 74 20 25 30 30  string first %00
1290: 20 24 75 72 69 5d 3e 3d 30 7d 20 63 6f 6e 74 69   $uri]>=0} conti
12a0: 6e 75 65 0a 20 20 7d 0a 0a 20 20 69 66 20 7b 24  nue.  }..  if {$
12b0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
12c0: 74 66 6f 72 6d 29 20 3d 3d 20 22 77 69 6e 64 6f  tform) == "windo
12d0: 77 73 22 20 26 26 20 24 74 6e 3e 31 32 7d 20 7b  ws" && $tn>12} {
12e0: 0a 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20  .    continue.  
12f0: 7d 0a 0a 20 20 73 65 74 20 3a 3a 61 72 67 6c 69  }..  set ::argli
1300: 73 74 20 22 22 0a 20 20 73 65 74 20 44 42 20 5b  st "".  set DB [
1310: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 24 75 72  sqlite3_open $ur
1320: 69 5d 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 24  i].  do_test 2.$
1330: 74 6e 2e 31 20 7b 20 73 65 74 20 3a 3a 61 72 67  tn.1 { set ::arg
1340: 6c 69 73 74 20 7d 20 24 6b 76 6c 69 73 74 0a 20  list } $kvlist. 
1350: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 24   sqlite3_close $
1360: 44 42 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62  DB..  sqlite3 db
1370: 20 78 78 78 2e 64 62 0a 20 20 73 65 74 20 3a 3a   xxx.db.  set ::
1380: 61 72 67 6c 69 73 74 20 22 22 0a 20 20 65 78 65  arglist "".  exe
1390: 63 73 71 6c 20 7b 20 41 54 54 41 43 48 20 24 75  csql { ATTACH $u
13a0: 72 69 20 41 53 20 61 75 78 20 7d 0a 20 20 64 6f  ri AS aux }.  do
13b0: 5f 74 65 73 74 20 32 2e 24 74 6e 2e 32 20 7b 20  _test 2.$tn.2 { 
13c0: 73 65 74 20 3a 3a 61 72 67 6c 69 73 74 20 7d 20  set ::arglist } 
13d0: 24 6b 76 6c 69 73 74 0a 20 20 64 62 20 63 6c 6f  $kvlist.  db clo
13e0: 73 65 0a 7d 0a 74 76 66 73 20 64 65 6c 65 74 65  se.}.tvfs delete
13f0: 0a 74 76 66 73 32 20 64 65 6c 65 74 65 0a 0a 23  .tvfs2 delete..#
1400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
1450: 20 74 68 61 74 20 73 70 65 63 69 66 79 69 6e 67   that specifying
1460: 20 61 20 6e 6f 6e 2d 65 78 69 73 74 65 6e 74 20   a non-existent 
1470: 56 46 53 20 72 61 69 73 65 73 20 61 6e 20 65 72  VFS raises an er
1480: 72 6f 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 33  ror..#.do_test 3
1490: 2e 31 20 7b 0a 20 20 6c 69 73 74 20 5b 63 61 74  .1 {.  list [cat
14a0: 63 68 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20  ch { sqlite3 db 
14b0: 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 76 66  "file:test.db?vf
14c0: 73 3d 6e 6f 73 75 63 68 76 66 73 22 20 7d 20 6d  s=nosuchvfs" } m
14d0: 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 6e  sg] $msg.} {1 {n
14e0: 6f 20 73 75 63 68 20 76 66 73 3a 20 6e 6f 73 75  o such vfs: nosu
14f0: 63 68 76 66 73 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  chvfs}}..#------
1500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1540: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 6f 6d 65 20  ---.# Test some 
1550: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 74  of the other opt
1560: 69 6f 6e 73 20 28 6f 74 68 65 72 20 74 68 61 6e  ions (other than
1570: 20 22 76 66 73 22 29 2e 0a 23 0a 66 6f 72 65 61   "vfs")..#.forea
1580: 63 68 20 7b 74 6e 20 6d 6f 64 65 20 63 72 65 61  ch {tn mode crea
1590: 74 65 5f 6f 6b 20 77 72 69 74 65 5f 6f 6b 20 72  te_ok write_ok r
15a0: 65 61 64 6f 6e 6c 79 5f 6f 6b 7d 20 7b 0a 20 20  eadonly_ok} {.  
15b0: 31 20 20 20 20 72 6f 20 20 20 20 30 20 20 20 30  1    ro    0   0
15c0: 20 20 20 31 0a 20 20 32 20 20 20 20 72 77 20 20     1.  2    rw  
15d0: 20 20 30 20 20 20 31 20 20 20 30 0a 20 20 33 20    0   1   0.  3 
15e0: 20 20 20 72 77 63 20 20 20 31 20 20 20 31 20 20     rwc   1   1  
15f0: 20 30 0a 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b   0.} {.  catch {
1600: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 6f   db close }.  fo
1610: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
1620: 62 0a 0a 20 20 73 65 74 20 41 28 31 29 20 7b 30  b..  set A(1) {0
1630: 20 7b 7d 7d 0a 20 20 73 65 74 20 41 28 30 29 20   {}}.  set A(0) 
1640: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70  {1 {unable to op
1650: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1660: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 34 2e 31  }}.  do_test 4.1
1670: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 6c 69 73  .$tn.1 {.    lis
1680: 74 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65  t [catch {sqlite
1690: 33 20 64 62 20 22 66 69 6c 65 3a 74 65 73 74 2e  3 db "file:test.
16a0: 64 62 3f 6d 6f 64 65 3d 24 6d 6f 64 65 22 7d 20  db?mode=$mode"} 
16b0: 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 24 41  msg] $msg.  } $A
16c0: 28 24 63 72 65 61 74 65 5f 6f 6b 29 0a 0a 20 20  ($create_ok)..  
16d0: 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
16e0: 20 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65   }.  forcedelete
16f0: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
1700: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
1710: 64 62 20 65 76 61 6c 20 7b 20 43 52 45 41 54 45  db eval { CREATE
1720: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 20   TABLE t1(a, b) 
1730: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20 20  }.  db close..  
1740: 73 65 74 20 41 28 31 29 20 7b 30 20 7b 7d 7d 0a  set A(1) {0 {}}.
1750: 20 20 73 65 74 20 41 28 30 29 20 7b 31 20 7b 61    set A(0) {1 {a
1760: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
1770: 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62  a readonly datab
1780: 61 73 65 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ase}}.  do_test 
1790: 34 2e 31 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  4.1.$tn.2 {.    
17a0: 73 71 6c 69 74 65 33 20 64 62 20 22 66 69 6c 65  sqlite3 db "file
17b0: 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d 24 6d  :test.db?mode=$m
17c0: 6f 64 65 22 0a 20 20 20 20 63 61 74 63 68 73 71  ode".    catchsq
17d0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
17e0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20  t1 VALUES(1, 2) 
17f0: 7d 0a 20 20 7d 20 24 41 28 24 77 72 69 74 65 5f  }.  } $A($write_
1800: 6f 6b 29 0a 0a 20 20 73 65 74 20 41 28 31 29 20  ok)..  set A(1) 
1810: 7b 30 20 7b 7d 7d 0a 20 20 73 65 74 20 41 28 30  {0 {}}.  set A(0
1820: 29 20 5b 6c 69 73 74 20 31 20 22 61 63 63 65 73  ) [list 1 "acces
1830: 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77  s mode not allow
1840: 65 64 3a 20 24 6d 6f 64 65 22 5d 0a 20 20 64 6f  ed: $mode"].  do
1850: 5f 74 65 73 74 20 34 2e 31 2e 24 74 6e 2e 33 20  _test 4.1.$tn.3 
1860: 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63  {.    list [catc
1870: 68 20 7b 73 71 6c 69 74 65 33 20 64 62 20 22 66  h {sqlite3 db "f
1880: 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65  ile:test.db?mode
1890: 3d 24 6d 6f 64 65 22 20 2d 72 65 61 64 6f 6e 6c  =$mode" -readonl
18a0: 79 20 31 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20  y 1} msg] $msg. 
18b0: 20 7d 20 24 41 28 24 72 65 61 64 6f 6e 6c 79 5f   } $A($readonly_
18c0: 6f 6b 29 0a 7d 0a 0a 73 65 74 20 6f 72 69 67 20  ok).}..set orig 
18d0: 5b 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f  [sqlite3_enable_
18e0: 73 68 61 72 65 64 5f 63 61 63 68 65 5d 0a 66 6f  shared_cache].fo
18f0: 72 65 61 63 68 20 7b 74 6e 20 6f 70 74 69 6f 6e  reach {tn option
1900: 73 20 73 63 5f 64 65 66 61 75 6c 74 20 69 73 5f  s sc_default is_
1910: 73 68 61 72 65 64 7d 20 7b 0a 20 20 31 20 20 20  shared} {.  1   
1920: 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ""             
1930: 20 20 20 31 20 20 20 31 0a 20 20 32 20 20 20 20     1   1.  2    
1940: 22 63 61 63 68 65 3d 70 72 69 76 61 74 65 22 20  "cache=private" 
1950: 20 20 31 20 20 20 30 0a 20 20 33 20 20 20 20 22    1   0.  3    "
1960: 63 61 63 68 65 3d 73 68 61 72 65 64 22 20 20 20  cache=shared"   
1970: 20 31 20 20 20 31 0a 20 20 34 20 20 20 20 22 22   1   1.  4    ""
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 30 20 20 20 30 0a 20 20 35 20 20 20 20 22 63 61  0   0.  5    "ca
19a0: 63 68 65 3d 70 72 69 76 61 74 65 22 20 20 20 30  che=private"   0
19b0: 20 20 20 30 0a 20 20 36 20 20 20 20 22 63 61 63     0.  6    "cac
19c0: 68 65 3d 73 68 61 72 65 64 22 20 20 20 20 30 20  he=shared"    0 
19d0: 20 20 31 0a 7d 20 7b 0a 20 20 63 61 74 63 68 20    1.} {.  catch 
19e0: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66  { db close }.  f
19f0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
1a00: 64 62 0a 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  db..  sqlite3_en
1a10: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
1a20: 65 20 31 0a 20 20 73 71 6c 69 74 65 33 20 64 62  e 1.  sqlite3 db
1a30: 32 20 74 65 73 74 2e 64 62 0a 20 20 64 62 32 20  2 test.db.  db2 
1a40: 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42  eval {CREATE TAB
1a50: 4c 45 20 74 31 28 61 2c 20 62 29 7d 0a 0a 20 20  LE t1(a, b)}..  
1a60: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
1a70: 68 61 72 65 64 5f 63 61 63 68 65 20 24 73 63 5f  hared_cache $sc_
1a80: 64 65 66 61 75 6c 74 0a 20 20 73 71 6c 69 74 65  default.  sqlite
1a90: 33 20 64 62 20 22 66 69 6c 65 3a 74 65 73 74 2e  3 db "file:test.
1aa0: 64 62 3f 24 6f 70 74 69 6f 6e 73 22 0a 20 20 64  db?$options".  d
1ab0: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a  b eval {SELECT *
1ac0: 20 46 52 4f 4d 20 74 31 7d 0a 0a 20 20 73 65 74   FROM t1}..  set
1ad0: 20 41 28 31 29 20 7b 31 20 7b 64 61 74 61 62 61   A(1) {1 {databa
1ae0: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
1af0: 65 64 3a 20 74 31 7d 7d 0a 20 20 73 65 74 20 41  ed: t1}}.  set A
1b00: 28 30 29 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f  (0) {0 {}}.  do_
1b10: 74 65 73 74 20 34 2e 32 2e 24 74 6e 20 7b 0a 20  test 4.2.$tn {. 
1b20: 20 20 20 64 62 32 20 65 76 61 6c 20 7b 42 45 47     db2 eval {BEG
1b30: 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  IN; INSERT INTO 
1b40: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
1b50: 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  }.    catchsql {
1b60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1b70: 31 20 7d 0a 20 20 7d 20 24 41 28 24 69 73 5f 73  1 }.  } $A($is_s
1b80: 68 61 72 65 64 29 0a 0a 20 20 64 62 32 20 63 6c  hared)..  db2 cl
1b90: 6f 73 65 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 34  ose.}..do_test 4
1ba0: 2e 33 2e 31 20 7b 0a 20 20 6c 69 73 74 20 5b 63  .3.1 {.  list [c
1bb0: 61 74 63 68 20 7b 73 71 6c 69 74 65 33 20 64 62  atch {sqlite3 db
1bc0: 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d   "file:test.db?m
1bd0: 6f 64 65 3d 72 63 22 7d 20 6d 73 67 5d 20 24 6d  ode=rc"} msg] $m
1be0: 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68  sg.} {1 {no such
1bf0: 20 61 63 63 65 73 73 20 6d 6f 64 65 3a 20 72 63   access mode: rc
1c00: 7d 7d 0a 64 6f 5f 74 65 73 74 20 34 2e 33 2e 32  }}.do_test 4.3.2
1c10: 20 7b 0a 20 20 6c 69 73 74 20 5b 63 61 74 63 68   {.  list [catch
1c20: 20 7b 73 71 6c 69 74 65 33 20 64 62 20 22 66 69   {sqlite3 db "fi
1c30: 6c 65 3a 74 65 73 74 2e 64 62 3f 63 61 63 68 65  le:test.db?cache
1c40: 3d 70 75 62 6c 69 63 22 7d 20 6d 73 67 5d 20 24  =public"} msg] $
1c50: 6d 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  msg.} {1 {no suc
1c60: 68 20 63 61 63 68 65 20 6d 6f 64 65 3a 20 70 75  h cache mode: pu
1c70: 62 6c 69 63 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  blic}}..#-------
1c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 74  --.# Test that t
1cd0: 68 69 6e 67 73 20 77 6f 72 6b 20 69 66 20 61 6e  hings work if an
1ce0: 20 41 54 54 41 43 48 65 64 20 64 61 74 61 62 61   ATTACHed databa
1cf0: 73 65 20 75 73 65 73 20 61 20 64 69 66 66 65 72  se uses a differ
1d00: 65 6e 74 20 56 46 53 20 74 68 61 6e 0a 23 20 74  ent VFS than.# t
1d10: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1d20: 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 20  . The important 
1d30: 70 6f 69 6e 74 20 69 73 20 74 68 61 74 20 66 6f  point is that fo
1d40: 72 20 61 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 73  r all operations
1d50: 20 0a 23 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68   .# involving th
1d60: 65 20 41 54 54 41 43 48 65 64 20 64 61 74 61 62  e ATTACHed datab
1d70: 61 73 65 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ase, the correct
1d80: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
1d90: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 23 20 56 46 53   following.# VFS
1da0: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 61 6c   are used for al
1db0: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e 76  l operations inv
1dc0: 6f 6c 76 69 6e 67 20 74 68 65 20 61 74 74 61 63  olving the attac
1dd0: 68 65 64 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  hed database..#.
1de0: 23 20 20 20 20 20 78 4f 70 65 6e 0a 23 20 20 20  #     xOpen.#   
1df0: 20 20 78 44 65 6c 65 74 65 0a 23 20 20 20 20 20    xDelete.#     
1e00: 78 41 63 63 65 73 73 0a 23 20 20 20 20 20 78 46  xAccess.#     xF
1e10: 75 6c 6c 50 61 74 68 6e 61 6d 65 0a 23 0a 0a 23  ullPathname.#..#
1e20: 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
1e30: 6f 64 65 20 63 72 65 61 74 65 73 20 74 77 6f 20  ode creates two 
1e40: 56 46 53 20 2d 20 22 74 76 66 73 31 22 20 61 6e  VFS - "tvfs1" an
1e50: 64 20 22 74 76 66 73 32 22 2e 20 45 61 63 68 20  d "tvfs2". Each 
1e60: 74 69 6d 65 20 6f 6e 65 0a 23 20 6f 66 20 74 68  time one.# of th
1e70: 65 20 61 62 6f 76 65 20 6d 65 74 68 6f 64 73 20  e above methods 
1e80: 69 73 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20  is called using 
1e90: 22 74 76 66 73 31 22 2c 20 67 6c 6f 62 61 6c 20  "tvfs1", global 
1ea0: 76 61 72 69 61 62 6c 65 20 3a 3a 54 31 28 58 29  variable ::T1(X)
1eb0: 20 69 73 0a 23 20 73 65 74 2c 20 77 68 65 72 65   is.# set, where
1ec0: 20 58 20 69 73 20 74 68 65 20 66 69 6c 65 2d 6e   X is the file-n
1ed0: 61 6d 65 20 74 68 65 20 6d 65 74 68 6f 64 20 69  ame the method i
1ee0: 73 20 63 61 6c 6c 65 64 20 6f 6e 2e 20 43 61 6c  s called on. Cal
1ef0: 6c 73 20 74 6f 20 74 68 65 20 61 62 6f 76 65 0a  ls to the above.
1f00: 23 20 6d 65 74 68 6f 64 73 20 75 73 69 6e 67 20  # methods using 
1f10: 22 74 76 66 73 32 22 20 73 65 74 20 65 6e 74 72  "tvfs2" set entr
1f20: 69 65 73 20 69 6e 20 74 68 65 20 67 6c 6f 62 61  ies in the globa
1f30: 6c 20 54 32 20 61 72 72 61 79 2e 0a 23 0a 69 66  l T2 array..#.if
1f40: 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20  capable wal {.  
1f50: 74 65 73 74 76 66 73 20 74 76 66 73 31 20 0a 20  testvfs tvfs1 . 
1f60: 20 74 76 66 73 31 20 66 69 6c 74 65 72 20 7b 78   tvfs1 filter {x
1f70: 4f 70 65 6e 20 78 44 65 6c 65 74 65 20 78 41 63  Open xDelete xAc
1f80: 63 65 73 73 20 78 46 75 6c 6c 50 61 74 68 6e 61  cess xFullPathna
1f90: 6d 65 7d 0a 20 20 74 76 66 73 31 20 73 63 72 69  me}.  tvfs1 scri
1fa0: 70 74 20 74 76 66 73 31 5f 63 61 6c 6c 62 61 63  pt tvfs1_callbac
1fb0: 6b 0a 20 20 70 72 6f 63 20 74 76 66 73 31 5f 63  k.  proc tvfs1_c
1fc0: 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64 20  allback {method 
1fd0: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
1fe0: 20 0a 20 20 20 20 73 65 74 20 3a 3a 54 31 28 5b   .    set ::T1([
1ff0: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e  file tail $filen
2000: 61 6d 65 5d 29 20 31 20 0a 20 20 20 20 72 65 74  ame]) 1 .    ret
2010: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  urn SQLITE_OK.  
2020: 7d 0a 20 20 74 65 73 74 76 66 73 20 74 76 66 73  }.  testvfs tvfs
2030: 32 20 0a 20 20 74 76 66 73 32 20 66 69 6c 74 65  2 .  tvfs2 filte
2040: 72 20 7b 78 4f 70 65 6e 20 78 44 65 6c 65 74 65  r {xOpen xDelete
2050: 20 78 41 63 63 65 73 73 20 78 46 75 6c 6c 50 61   xAccess xFullPa
2060: 74 68 6e 61 6d 65 7d 0a 20 20 74 76 66 73 32 20  thname}.  tvfs2 
2070: 73 63 72 69 70 74 20 74 76 66 73 32 5f 63 61 6c  script tvfs2_cal
2080: 6c 62 61 63 6b 0a 20 20 70 72 6f 63 20 74 76 66  lback.  proc tvf
2090: 73 32 5f 63 61 6c 6c 62 61 63 6b 20 7b 6d 65 74  s2_callback {met
20a0: 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67  hod filename arg
20b0: 73 7d 20 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a  s} { .    set ::
20c0: 54 32 28 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  T2([file tail $f
20d0: 69 6c 65 6e 61 6d 65 5d 29 20 31 20 0a 20 20 20  ilename]) 1 .   
20e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20f0: 4b 0a 20 20 7d 0a 20 20 0a 20 20 63 61 74 63 68  K.  }.  .  catch
2100: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 65 76   {db close}.  ev
2110: 61 6c 20 66 6f 72 63 65 64 65 6c 65 74 65 20 5b  al forcedelete [
2120: 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a 20  glob test.db*]. 
2130: 20 64 6f 5f 74 65 73 74 20 35 2e 31 2e 31 20 7b   do_test 5.1.1 {
2140: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
2150: 66 69 6c 65 3a 74 65 73 74 2e 64 62 31 3f 76 66  file:test.db1?vf
2160: 73 3d 74 76 66 73 31 0a 20 20 20 20 65 78 65 63  s=tvfs1.    exec
2170: 73 71 6c 20 7b 0a 20 20 20 20 20 20 41 54 54 41  sql {.      ATTA
2180: 43 48 20 27 66 69 6c 65 3a 74 65 73 74 2e 64 62  CH 'file:test.db
2190: 32 3f 76 66 73 3d 74 76 66 73 32 27 20 41 53 20  2?vfs=tvfs2' AS 
21a0: 61 75 78 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  aux;.      PRAGM
21b0: 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d  A main.journal_m
21c0: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
21d0: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
21e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
21f0: 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 43 52  ERSIST;.      CR
2200: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
2210: 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54   b);.      CREAT
2220: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61  E TABLE aux.t2(a
2230: 2c 20 62 29 3b 0a 20 20 20 20 20 20 50 52 41 47  , b);.      PRAG
2240: 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f  MA main.journal_
2250: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
2260: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 6a 6f 75    PRAGMA aux.jou
2270: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
2280: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2290: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 27  TO t1 VALUES('x'
22a0: 2c 20 27 79 27 29 3b 0a 20 20 20 20 20 20 49 4e  , 'y');.      IN
22b0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
22c0: 55 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a 20  UES('x', 'y');. 
22d0: 20 20 20 7d 0a 20 20 20 20 6c 73 6f 72 74 20 5b     }.    lsort [
22e0: 61 72 72 61 79 20 6e 61 6d 65 73 20 3a 3a 54 31  array names ::T1
22f0: 5d 0a 20 20 7d 20 7b 74 65 73 74 2e 64 62 31 20  ].  } {test.db1 
2300: 74 65 73 74 2e 64 62 31 2d 6a 6f 75 72 6e 61 6c  test.db1-journal
2310: 20 74 65 73 74 2e 64 62 31 2d 77 61 6c 20 74 65   test.db1-wal te
2320: 73 74 2e 64 62 31 2d 77 61 6c 32 7d 0a 20 20 0a  st.db1-wal2}.  .
2330: 20 20 64 6f 5f 74 65 73 74 20 35 2e 31 2e 32 20    do_test 5.1.2 
2340: 7b 0a 20 20 20 20 6c 73 6f 72 74 20 5b 61 72 72  {.    lsort [arr
2350: 61 79 20 6e 61 6d 65 73 20 3a 3a 54 32 5d 0a 20  ay names ::T2]. 
2360: 20 7d 20 7b 74 65 73 74 2e 64 62 32 20 74 65 73   } {test.db2 tes
2370: 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 74 65  t.db2-journal te
2380: 73 74 2e 64 62 32 2d 77 61 6c 20 74 65 73 74 2e  st.db2-wal test.
2390: 64 62 32 2d 77 61 6c 32 7d 0a 20 20 64 62 20 63  db2-wal2}.  db c
23a0: 6c 6f 73 65 0a 20 20 0a 20 20 74 76 66 73 31 20  lose.  .  tvfs1 
23b0: 64 65 6c 65 74 65 0a 20 20 74 76 66 73 32 20 64  delete.  tvfs2 d
23c0: 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  elete.}..#------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2410: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
2420: 20 6f 6e 6c 79 20 22 22 20 61 6e 64 20 22 6c 6f   only "" and "lo
2430: 63 61 6c 68 6f 73 74 22 20 61 72 65 20 61 63 63  calhost" are acc
2440: 65 70 74 61 62 6c 65 20 61 73 20 61 75 74 68 6f  eptable as autho
2450: 72 69 74 69 65 73 2e 0a 23 0a 63 61 74 63 68 20  rities..#.catch 
2460: 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72 65 61  {db close}.forea
2470: 63 68 20 7b 74 6e 20 75 72 69 20 72 65 73 7d 20  ch {tn uri res} 
2480: 7b 0a 20 20 31 20 20 20 20 20 22 66 69 6c 65 3a  {.  1     "file:
2490: 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 50 57 44 2f  //localhost/PWD/
24a0: 74 65 73 74 2e 64 62 22 20 20 20 7b 6e 6f 74 20  test.db"   {not 
24b0: 61 6e 20 65 72 72 6f 72 7d 0a 20 20 32 20 20 20  an error}.  2   
24c0: 20 20 22 66 69 6c 65 3a 2f 2f 2f 50 57 44 2f 74    "file:///PWD/t
24d0: 65 73 74 2e 64 62 22 20 20 20 20 20 20 20 20 20  est.db"         
24e0: 20 20 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72     {not an error
24f0: 7d 0a 20 20 33 20 20 20 20 20 22 66 69 6c 65 3a  }.  3     "file:
2500: 2f 50 57 44 2f 74 65 73 74 2e 64 62 22 20 20 20  /PWD/test.db"   
2510: 20 20 20 20 20 20 20 20 20 20 20 7b 6e 6f 74 20             {not 
2520: 61 6e 20 65 72 72 6f 72 7d 0a 20 20 34 20 20 20  an error}.  4   
2530: 20 20 22 66 69 6c 65 3a 2f 2f 6c 25 36 46 63 61    "file://l%6Fca
2540: 6c 68 6f 73 74 2f 50 57 44 2f 74 65 73 74 2e 64  lhost/PWD/test.d
2550: 62 22 20 7b 69 6e 76 61 6c 69 64 20 75 72 69 20  b" {invalid uri 
2560: 61 75 74 68 6f 72 69 74 79 3a 20 6c 25 36 46 63  authority: l%6Fc
2570: 61 6c 68 6f 73 74 7d 0a 20 20 35 20 20 20 20 20  alhost}.  5     
2580: 22 66 69 6c 65 3a 2f 2f 6c 62 63 61 6c 68 6f 73  "file://lbcalhos
2590: 74 2f 50 57 44 2f 74 65 73 74 2e 64 62 22 20 20  t/PWD/test.db"  
25a0: 20 7b 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75   {invalid uri au
25b0: 74 68 6f 72 69 74 79 3a 20 6c 62 63 61 6c 68 6f  thority: lbcalho
25c0: 73 74 7d 0a 20 20 36 20 20 20 20 20 22 66 69 6c  st}.  6     "fil
25d0: 65 3a 2f 2f 78 2f 50 57 44 2f 74 65 73 74 2e 64  e://x/PWD/test.d
25e0: 62 22 20 20 20 20 20 20 20 20 20 20 20 7b 69 6e  b"           {in
25f0: 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72  valid uri author
2600: 69 74 79 3a 20 78 7d 0a 7d 20 7b 0a 0a 20 20 69  ity: x}.} {..  i
2610: 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  f {$tcl_platform
2620: 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 77 69 6e  (platform)=="win
2630: 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20 73 65 74  dows"} {.    set
2640: 20 75 72 69 20 20 5b 73 74 72 69 6e 67 20 6d 61   uri  [string ma
2650: 70 20 5b 6c 69 73 74 20 50 57 44 20 5b 73 74 72  p [list PWD [str
2660: 69 6e 67 20 72 61 6e 67 65 20 5b 67 65 74 5f 70  ing range [get_p
2670: 77 64 5d 20 33 20 65 6e 64 5d 5d 20 24 75 72 69  wd] 3 end]] $uri
2680: 5d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ].  } else {.   
2690: 20 73 65 74 20 75 72 69 20 20 5b 73 74 72 69 6e   set uri  [strin
26a0: 67 20 6d 61 70 20 5b 6c 69 73 74 20 50 57 44 20  g map [list PWD 
26b0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 67  [string range [g
26c0: 65 74 5f 70 77 64 5d 20 31 20 65 6e 64 5d 5d 20  et_pwd] 1 end]] 
26d0: 24 75 72 69 5d 0a 20 20 7d 0a 0a 20 20 64 6f 5f  $uri].  }..  do_
26e0: 74 65 73 74 20 36 2e 24 74 6e 20 7b 0a 20 20 20  test 6.$tn {.   
26f0: 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74 65 33   set DB [sqlite3
2700: 5f 6f 70 65 6e 20 24 75 72 69 5d 0a 20 20 20 20  _open $uri].    
2710: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 24  sqlite3_errmsg $
2720: 44 42 0a 20 20 7d 20 24 72 65 73 0a 20 20 63 61  DB.  } $res.  ca
2730: 74 63 68 20 7b 20 73 71 6c 69 74 65 33 5f 63 6c  tch { sqlite3_cl
2740: 6f 73 65 20 24 44 42 20 7d 0a 7d 0a 0a 66 6f 72  ose $DB }.}..for
2750: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
2760: 20 74 65 73 74 2e 64 62 32 0a 64 6f 5f 74 65 73   test.db2.do_tes
2770: 74 20 37 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  t 7.1 {.  sqlite
2780: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
2790: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
27a0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
27b0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
27c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
27d0: 20 32 29 3b 0a 20 20 20 20 41 54 54 41 43 48 20   2);.    ATTACH 
27e0: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75  'test.db2' AS au
27f0: 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  x;.    CREATE TA
2800: 42 4c 45 20 61 75 78 2e 74 32 28 61 2c 20 62 29  BLE aux.t2(a, b)
2810: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2820: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c  O t1 VALUES('a',
2830: 20 27 62 27 29 3b 0a 20 20 7d 0a 20 20 64 62 20   'b');.  }.  db 
2840: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  close.} {}.do_te
2850: 73 74 20 37 2e 32 20 7b 0a 20 20 73 71 6c 69 74  st 7.2 {.  sqlit
2860: 65 33 20 64 62 20 66 69 6c 65 3a 74 65 73 74 2e  e3 db file:test.
2870: 64 62 3f 6d 6f 64 65 3d 72 6f 0a 20 20 65 78 65  db?mode=ro.  exe
2880: 63 73 71 6c 20 7b 20 41 54 54 41 43 48 20 27 66  csql { ATTACH 'f
2890: 69 6c 65 3a 74 65 73 74 2e 64 62 32 3f 6d 6f 64  ile:test.db2?mod
28a0: 65 3d 72 77 27 20 41 53 20 61 75 78 20 7d 0a 7d  e=rw' AS aux }.}
28b0: 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   {}.do_execsql_t
28c0: 65 73 74 20 20 37 2e 33 20 7b 20 0a 20 20 49 4e  est  7.3 { .  IN
28d0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
28e0: 55 45 53 28 27 63 27 2c 20 27 64 27 29 20 0a 7d  UES('c', 'd') .}
28f0: 20 7b 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f   {}.do_catchsql_
2900: 74 65 73 74 20 37 2e 34 20 7b 20 0a 20 20 49 4e  test 7.4 { .  IN
2910: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2920: 55 45 53 28 33 2c 20 34 29 20 0a 7d 20 7b 31 20  UES(3, 4) .} {1 
2930: 7b 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  {attempt to writ
2940: 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74  e a readonly dat
2950: 61 62 61 73 65 7d 7d 0a 0a 66 69 6e 69 73 68 5f  abase}}..finish_
2960: 74 65 73 74 0a                                   test.