/ Hex Artifact Content
Login

Artifact 32b8e0b99a0e215f25996516c64b90c525810d02:


0000: 23 20 32 30 31 31 20 4d 61 79 20 30 36 0a 23 0a  # 2011 May 06.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 0a 0a 73 65 74 20 74 65 73 74 64  ***.#..set testd
0170: 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ir [file dirname
0180: 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20   $argv0].source 
0190: 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e  $testdir/tester.
01a0: 74 63 6c 0a 73 65 74 20 74 65 73 74 70 72 65 66  tcl.set testpref
01b0: 69 78 20 65 5f 75 72 69 0a 0a 64 62 20 63 6c 6f  ix e_uri..db clo
01c0: 73 65 0a 0a 70 72 6f 63 20 70 61 72 73 65 5f 75  se..proc parse_u
01d0: 72 69 20 7b 75 72 69 7d 20 7b 0a 20 20 74 65 73  ri {uri} {.  tes
01e0: 74 76 66 73 20 74 76 66 73 32 0a 20 20 74 65 73  tvfs tvfs2.  tes
01f0: 74 76 66 73 20 74 76 66 73 20 0a 20 20 74 76 66  tvfs tvfs .  tvf
0200: 73 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 20  s filter xOpen. 
0210: 20 74 76 66 73 20 73 63 72 69 70 74 20 70 61 72   tvfs script par
0220: 73 65 5f 75 72 69 5f 6f 70 65 6e 5f 63 62 0a 0a  se_uri_open_cb..
0230: 20 20 73 65 74 20 3a 3a 75 72 69 5f 6f 70 65 6e    set ::uri_open
0240: 20 5b 6c 69 73 74 5d 0a 20 20 73 65 74 20 44 42   [list].  set DB
0250: 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76   [sqlite3_open_v
0260: 32 20 24 75 72 69 20 7b 0a 20 20 20 20 53 51 4c  2 $uri {.    SQL
0270: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
0280: 54 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE SQLITE_OPEN_C
0290: 52 45 41 54 45 20 53 51 4c 49 54 45 5f 4f 50 45  REATE SQLITE_OPE
02a0: 4e 5f 57 41 4c 0a 20 20 7d 20 74 76 66 73 5d 0a  N_WAL.  } tvfs].
02b0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20    sqlite3_close 
02c0: 24 44 42 0a 20 20 74 76 66 73 20 64 65 6c 65 74  $DB.  tvfs delet
02d0: 65 0a 20 20 74 76 66 73 32 20 64 65 6c 65 74 65  e.  tvfs2 delete
02e0: 0a 0a 20 20 73 65 74 20 3a 3a 75 72 69 5f 6f 70  ..  set ::uri_op
02f0: 65 6e 0a 7d 0a 70 72 6f 63 20 70 61 72 73 65 5f  en.}.proc parse_
0300: 75 72 69 5f 6f 70 65 6e 5f 63 62 20 7b 6d 65 74  uri_open_cb {met
0310: 68 6f 64 20 66 69 6c 65 20 61 72 67 6c 69 73 74  hod file arglist
0320: 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 75 72 69 5f  } {.  set ::uri_
0330: 6f 70 65 6e 20 5b 6c 69 73 74 20 24 66 69 6c 65  open [list $file
0340: 20 24 61 72 67 6c 69 73 74 5d 0a 7d 0a 0a 70 72   $arglist].}..pr
0350: 6f 63 20 6f 70 65 6e 5f 75 72 69 5f 65 72 72 6f  oc open_uri_erro
0360: 72 20 7b 75 72 69 7d 20 7b 0a 20 20 73 65 74 20  r {uri} {.  set 
0370: 66 6c 61 67 73 20 7b 53 51 4c 49 54 45 5f 4f 50  flags {SQLITE_OP
0380: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 53 51 4c  EN_READWRITE SQL
0390: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
03a0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7d  SQLITE_OPEN_WAL}
03b0: 0a 20 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74  .  set DB [sqlit
03c0: 65 33 5f 6f 70 65 6e 5f 76 32 20 24 75 72 69 20  e3_open_v2 $uri 
03d0: 24 66 6c 61 67 73 20 22 22 5d 0a 20 20 73 65 74  $flags ""].  set
03e0: 20 65 20 5b 73 71 6c 69 74 65 33 5f 65 72 72 6d   e [sqlite3_errm
03f0: 73 67 20 24 44 42 5d 0a 20 20 73 71 6c 69 74 65  sg $DB].  sqlite
0400: 33 5f 63 6c 6f 73 65 20 24 44 42 0a 20 20 73 65  3_close $DB.  se
0410: 74 20 65 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  t e.}..# EVIDENC
0420: 45 2d 4f 46 3a 20 52 2d 33 35 38 34 30 2d 33 33  E-OF: R-35840-33
0430: 32 30 34 20 49 66 20 55 52 49 20 66 69 6c 65 6e  204 If URI filen
0440: 61 6d 65 20 69 6e 74 65 72 70 72 65 74 61 74 69  ame interpretati
0450: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 0a 23  on is enabled,.#
0460: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d   and the filenam
0470: 65 20 61 72 67 75 6d 65 6e 74 20 62 65 67 69 6e  e argument begin
0480: 73 20 77 69 74 68 20 22 66 69 6c 65 3a 22 2c 20  s with "file:", 
0490: 74 68 65 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d  then the filenam
04a0: 65 20 69 73 0a 23 20 69 6e 74 65 72 70 72 65 74  e is.# interpret
04b0: 65 64 20 61 73 20 61 20 55 52 49 2e 0a 23 0a 23  ed as a URI..#.#
04c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
04d0: 32 34 31 32 34 2d 35 36 39 36 30 20 55 52 49 20  24124-56960 URI 
04e0: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 65 72 70 72  filename interpr
04f0: 65 74 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  etation is enabl
0500: 65 64 20 69 66 0a 23 20 74 68 65 20 53 51 4c 49  ed if.# the SQLI
0510: 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67  TE_OPEN_URI flag
0520: 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 66   is set in the f
0530: 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 74  ourth argument t
0540: 6f 0a 23 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  o.# sqlite3_open
0550: 5f 76 32 28 29 2c 20 6f 72 20 69 66 20 69 74 20  _v2(), or if it 
0560: 68 61 73 20 62 65 65 6e 20 65 6e 61 62 6c 65 64  has been enabled
0570: 20 67 6c 6f 62 61 6c 6c 79 20 75 73 69 6e 67 20   globally using 
0580: 74 68 65 0a 23 20 53 51 4c 49 54 45 5f 43 4f 4e  the.# SQLITE_CON
0590: 46 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 77  FIG_URI option w
05a0: 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ith the sqlite3_
05b0: 63 6f 6e 66 69 67 28 29 20 6d 65 74 68 6f 64 20  config() method 
05c0: 6f 72 20 62 79 20 74 68 65 0a 23 20 53 51 4c 49  or by the.# SQLI
05d0: 54 45 5f 55 53 45 5f 55 52 49 20 63 6f 6d 70 69  TE_USE_URI compi
05e0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a  le-time option..
05f0: 23 0a 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66  #.if {$tcl_platf
0600: 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20 3d 3d  orm(platform) ==
0610: 20 22 75 6e 69 78 22 7d 20 7b 0a 20 20 73 65 74   "unix"} {.  set
0620: 20 66 6c 61 67 73 20 5b 6c 69 73 74 20 53 51 4c   flags [list SQL
0630: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
0640: 54 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE SQLITE_OPEN_C
0650: 52 45 41 54 45 5d 0a 0a 20 20 23 20 54 65 73 74  REATE]..  # Test
0660: 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f 43 4f  s with SQLITE_CO
0670: 4e 46 49 47 5f 55 52 49 20 63 6f 6e 66 69 67 75  NFIG_URI configu
0680: 72 65 64 20 74 6f 20 66 61 6c 73 65 2e 20 55 52  red to false. UR
0690: 49 20 69 6e 74 65 70 72 65 74 61 74 69 6f 6e 20  I intepretation 
06a0: 69 73 0a 20 20 23 20 6f 6e 6c 79 20 65 6e 61 62  is.  # only enab
06b0: 6c 65 64 20 69 66 20 74 68 65 20 53 51 4c 49 54  led if the SQLIT
06c0: 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20  E_OPEN_URI flag 
06d0: 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  is specified..  
06e0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
06f0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
0700: 67 5f 75 72 69 20 30 0a 20 20 64 6f 5f 74 65 73  g_uri 0.  do_tes
0710: 74 20 31 2e 31 20 7b 0a 20 20 20 20 66 6f 72 63  t 1.1 {.    forc
0720: 65 64 65 6c 65 74 65 20 66 69 6c 65 3a 74 65 73  edelete file:tes
0730: 74 2e 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  t.db test.db.   
0740: 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74 65 33   set DB [sqlite3
0750: 5f 6f 70 65 6e 5f 76 32 20 66 69 6c 65 3a 74 65  _open_v2 file:te
0760: 73 74 2e 64 62 20 5b 63 6f 6e 63 61 74 20 24 66  st.db [concat $f
0770: 6c 61 67 73 20 53 51 4c 49 54 45 5f 4f 50 45 4e  lags SQLITE_OPEN
0780: 5f 55 52 49 5d 20 22 22 5d 0a 20 20 20 20 6c 69  _URI] ""].    li
0790: 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  st [file exists 
07a0: 66 69 6c 65 3a 74 65 73 74 2e 64 62 5d 20 5b 66  file:test.db] [f
07b0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
07c0: 64 62 5d 0a 20 20 7d 20 7b 30 20 31 7d 0a 20 20  db].  } {0 1}.  
07d0: 64 6f 5f 74 65 73 74 20 31 2e 32 20 7b 0a 20 20  do_test 1.2 {.  
07e0: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 66 69    forcedelete fi
07f0: 6c 65 3a 74 65 73 74 2e 64 62 32 20 74 65 73 74  le:test.db2 test
0800: 2e 64 62 32 0a 20 20 20 20 73 65 74 20 53 54 4d  .db2.    set STM
0810: 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  T [sqlite3_prepa
0820: 72 65 20 24 44 42 20 22 41 54 54 41 43 48 20 27  re $DB "ATTACH '
0830: 66 69 6c 65 3a 74 65 73 74 2e 64 62 32 27 20 41  file:test.db2' A
0840: 53 20 61 75 78 22 20 2d 31 20 64 75 6d 6d 79 5d  S aux" -1 dummy]
0850: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
0860: 70 20 24 53 54 4d 54 0a 20 20 20 20 73 71 6c 69  p $STMT.    sqli
0870: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 54  te3_finalize $ST
0880: 4d 54 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c  MT.    list [fil
0890: 65 20 65 78 69 73 74 73 20 66 69 6c 65 3a 74 65  e exists file:te
08a0: 73 74 2e 64 62 32 5d 20 5b 66 69 6c 65 20 65 78  st.db2] [file ex
08b0: 69 73 74 73 20 74 65 73 74 2e 64 62 32 5d 0a 20  ists test.db2]. 
08c0: 20 7d 20 7b 30 20 31 7d 0a 20 20 73 71 6c 69 74   } {0 1}.  sqlit
08d0: 65 33 5f 63 6c 6f 73 65 20 24 44 42 0a 20 20 64  e3_close $DB.  d
08e0: 6f 5f 74 65 73 74 20 31 2e 33 20 7b 0a 20 20 20  o_test 1.3 {.   
08f0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 66 69 6c   forcedelete fil
0900: 65 3a 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e:test.db test.d
0910: 62 0a 20 20 20 20 73 65 74 20 44 42 20 5b 73 71  b.    set DB [sq
0920: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 66 69  lite3_open_v2 fi
0930: 6c 65 3a 74 65 73 74 2e 64 62 20 5b 63 6f 6e 63  le:test.db [conc
0940: 61 74 20 24 66 6c 61 67 73 5d 20 22 22 5d 0a 20  at $flags] ""]. 
0950: 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78     list [file ex
0960: 69 73 74 73 20 66 69 6c 65 3a 74 65 73 74 2e 64  ists file:test.d
0970: 62 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  b] [file exists 
0980: 74 65 73 74 2e 64 62 5d 0a 20 20 7d 20 7b 31 20  test.db].  } {1 
0990: 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 34  0}.  do_test 1.4
09a0: 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65   {.    forcedele
09b0: 74 65 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 32  te file:test.db2
09c0: 20 74 65 73 74 2e 64 62 32 0a 20 20 20 20 73 65   test.db2.    se
09d0: 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  t STMT [sqlite3_
09e0: 70 72 65 70 61 72 65 20 24 44 42 20 22 41 54 54  prepare $DB "ATT
09f0: 41 43 48 20 27 66 69 6c 65 3a 74 65 73 74 2e 64  ACH 'file:test.d
0a00: 62 32 27 20 41 53 20 61 75 78 22 20 2d 31 20 64  b2' AS aux" -1 d
0a10: 75 6d 6d 79 5d 0a 20 20 20 20 73 71 6c 69 74 65  ummy].    sqlite
0a20: 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 20 20 20  3_step $STMT.   
0a30: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
0a40: 65 20 24 53 54 4d 54 0a 20 20 20 20 6c 69 73 74  e $STMT.    list
0a50: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 66 69   [file exists fi
0a60: 6c 65 3a 74 65 73 74 2e 64 62 32 5d 20 5b 66 69  le:test.db2] [fi
0a70: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
0a80: 62 32 5d 0a 20 20 7d 20 7b 31 20 30 7d 0a 20 20  b2].  } {1 0}.  
0a90: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 24 44  sqlite3_close $D
0aa0: 42 0a 0a 20 20 23 20 54 65 73 74 73 20 77 69 74  B..  # Tests wit
0ab0: 68 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  h SQLITE_CONFIG_
0ac0: 55 52 49 20 63 6f 6e 66 69 67 75 72 65 64 20 74  URI configured t
0ad0: 6f 20 74 72 75 65 2e 20 55 52 49 20 69 6e 74 65  o true. URI inte
0ae0: 70 72 65 74 61 74 69 6f 6e 20 69 73 0a 20 20 23  pretation is.  #
0af0: 20 65 6e 61 62 6c 65 64 20 77 69 74 68 20 6f 72   enabled with or
0b00: 20 77 69 74 68 6f 75 74 20 53 51 4c 49 54 45 5f   without SQLITE_
0b10: 4f 50 45 4e 5f 55 52 49 2e 0a 20 20 23 0a 20 20  OPEN_URI..  #.  
0b20: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
0b30: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
0b40: 67 5f 75 72 69 20 31 0a 20 20 64 6f 5f 74 65 73  g_uri 1.  do_tes
0b50: 74 20 31 2e 35 20 7b 0a 20 20 20 20 66 6f 72 63  t 1.5 {.    forc
0b60: 65 64 65 6c 65 74 65 20 66 69 6c 65 3a 74 65 73  edelete file:tes
0b70: 74 2e 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  t.db test.db.   
0b80: 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74 65 33   set DB [sqlite3
0b90: 5f 6f 70 65 6e 5f 76 32 20 66 69 6c 65 3a 74 65  _open_v2 file:te
0ba0: 73 74 2e 64 62 20 5b 63 6f 6e 63 61 74 20 24 66  st.db [concat $f
0bb0: 6c 61 67 73 20 53 51 4c 49 54 45 5f 4f 50 45 4e  lags SQLITE_OPEN
0bc0: 5f 55 52 49 5d 20 22 22 5d 0a 20 20 20 20 6c 69  _URI] ""].    li
0bd0: 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  st [file exists 
0be0: 66 69 6c 65 3a 74 65 73 74 2e 64 62 5d 20 5b 66  file:test.db] [f
0bf0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
0c00: 64 62 5d 0a 20 20 7d 20 7b 30 20 31 7d 0a 20 20  db].  } {0 1}.  
0c10: 64 6f 5f 74 65 73 74 20 31 2e 36 20 7b 0a 20 20  do_test 1.6 {.  
0c20: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 66 69    forcedelete fi
0c30: 6c 65 3a 74 65 73 74 2e 64 62 32 20 74 65 73 74  le:test.db2 test
0c40: 2e 64 62 32 0a 20 20 20 20 73 65 74 20 53 54 4d  .db2.    set STM
0c50: 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  T [sqlite3_prepa
0c60: 72 65 20 24 44 42 20 22 41 54 54 41 43 48 20 27  re $DB "ATTACH '
0c70: 66 69 6c 65 3a 74 65 73 74 2e 64 62 32 27 20 41  file:test.db2' A
0c80: 53 20 61 75 78 22 20 2d 31 20 64 75 6d 6d 79 5d  S aux" -1 dummy]
0c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
0ca0: 70 20 24 53 54 4d 54 0a 20 20 20 20 73 71 6c 69  p $STMT.    sqli
0cb0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 54  te3_finalize $ST
0cc0: 4d 54 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c  MT.    list [fil
0cd0: 65 20 65 78 69 73 74 73 20 66 69 6c 65 3a 74 65  e exists file:te
0ce0: 73 74 2e 64 62 32 5d 20 5b 66 69 6c 65 20 65 78  st.db2] [file ex
0cf0: 69 73 74 73 20 74 65 73 74 2e 64 62 32 5d 0a 20  ists test.db2]. 
0d00: 20 7d 20 7b 30 20 31 7d 0a 20 20 73 71 6c 69 74   } {0 1}.  sqlit
0d10: 65 33 5f 63 6c 6f 73 65 20 24 44 42 0a 20 20 64  e3_close $DB.  d
0d20: 6f 5f 74 65 73 74 20 31 2e 37 20 7b 0a 20 20 20  o_test 1.7 {.   
0d30: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 66 69 6c   forcedelete fil
0d40: 65 3a 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e:test.db test.d
0d50: 62 0a 20 20 20 20 73 65 74 20 44 42 20 5b 73 71  b.    set DB [sq
0d60: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 66 69  lite3_open_v2 fi
0d70: 6c 65 3a 74 65 73 74 2e 64 62 20 5b 63 6f 6e 63  le:test.db [conc
0d80: 61 74 20 24 66 6c 61 67 73 5d 20 22 22 5d 0a 20  at $flags] ""]. 
0d90: 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78     list [file ex
0da0: 69 73 74 73 20 66 69 6c 65 3a 74 65 73 74 2e 64  ists file:test.d
0db0: 62 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  b] [file exists 
0dc0: 74 65 73 74 2e 64 62 5d 0a 20 20 7d 20 7b 30 20  test.db].  } {0 
0dd0: 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 38  1}.  do_test 1.8
0de0: 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65   {.    forcedele
0df0: 74 65 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 32  te file:test.db2
0e00: 20 74 65 73 74 2e 64 62 32 0a 20 20 20 20 73 65   test.db2.    se
0e10: 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  t STMT [sqlite3_
0e20: 70 72 65 70 61 72 65 20 24 44 42 20 22 41 54 54  prepare $DB "ATT
0e30: 41 43 48 20 27 66 69 6c 65 3a 74 65 73 74 2e 64  ACH 'file:test.d
0e40: 62 32 27 20 41 53 20 61 75 78 22 20 2d 31 20 64  b2' AS aux" -1 d
0e50: 75 6d 6d 79 5d 0a 20 20 20 20 73 71 6c 69 74 65  ummy].    sqlite
0e60: 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 20 20 20  3_step $STMT.   
0e70: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
0e80: 65 20 24 53 54 4d 54 0a 20 20 20 20 6c 69 73 74  e $STMT.    list
0e90: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 66 69   [file exists fi
0ea0: 6c 65 3a 74 65 73 74 2e 64 62 32 5d 20 5b 66 69  le:test.db2] [fi
0eb0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
0ec0: 62 32 5d 0a 20 20 7d 20 7b 30 20 31 7d 0a 20 20  b2].  } {0 1}.  
0ed0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 24 44  sqlite3_close $D
0ee0: 42 0a 7d 0a 0a 23 20 65 6e 73 75 72 65 20 75 72  B.}..# ensure ur
0ef0: 69 20 70 72 6f 63 65 73 73 69 6e 67 20 65 6e 61  i processing ena
0f00: 62 6c 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  bled for the res
0f10: 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0a 73  t of the tests.s
0f20: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a  qlite3_shutdown.
0f30: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 75  sqlite3_config_u
0f40: 72 69 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45  ri 1..# EVIDENCE
0f50: 2d 4f 46 3a 20 52 2d 31 37 34 38 32 2d 30 30 33  -OF: R-17482-003
0f60: 39 38 20 49 66 20 74 68 65 20 61 75 74 68 6f 72  98 If the author
0f70: 69 74 79 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d  ity is not an em
0f80: 70 74 79 20 73 74 72 69 6e 67 20 6f 72 0a 23 20  pty string or.# 
0f90: 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 61 6e 20  "localhost", an 
0fa0: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
0fb0: 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
0fc0: 0a 23 0a 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74  .#.if {$tcl_plat
0fd0: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20 3d  form(platform) =
0fe0: 3d 20 22 75 6e 69 78 22 7d 20 7b 0a 20 20 73 65  = "unix"} {.  se
0ff0: 74 20 66 6c 61 67 73 20 5b 6c 69 73 74 20 53 51  t flags [list SQ
1000: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1010: 49 54 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE SQLITE_OPEN_
1020: 43 52 45 41 54 45 20 53 51 4c 49 54 45 5f 4f 50  CREATE SQLITE_OP
1030: 45 4e 5f 55 52 49 5d 0a 20 20 66 6f 72 65 61 63  EN_URI].  foreac
1040: 68 20 7b 74 6e 20 75 72 69 20 65 72 72 6f 72 7d  h {tn uri error}
1050: 20 22 0a 20 20 20 20 31 20 20 7b 66 69 6c 65 3a   ".    1  {file:
1060: 2f 2f 6c 6f 63 61 6c 68 6f 73 74 5b 74 65 73 74  //localhost[test
1070: 5f 70 77 64 20 2f 5d 74 65 73 74 2e 64 62 7d 20  _pwd /]test.db} 
1080: 20 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d    {not an error}
1090: 0a 20 20 20 20 32 20 20 7b 66 69 6c 65 3a 2f 2f  .    2  {file://
10a0: 5b 74 65 73 74 5f 70 77 64 20 2f 5d 74 65 73 74  [test_pwd /]test
10b0: 2e 64 62 7d 20 20 20 20 20 20 20 20 20 20 20 20  .db}            
10c0: 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a 20  {not an error}. 
10d0: 20 20 20 33 20 20 7b 66 69 6c 65 3a 2f 2f 78 5b     3  {file://x[
10e0: 74 65 73 74 5f 70 77 64 20 2f 5d 74 65 73 74 2e  test_pwd /]test.
10f0: 64 62 7d 20 20 20 20 20 20 20 20 20 20 20 7b 69  db}           {i
1100: 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f  nvalid uri autho
1110: 72 69 74 79 3a 20 78 7d 0a 20 20 20 20 34 20 20  rity: x}.    4  
1120: 7b 66 69 6c 65 3a 2f 2f 69 6e 76 61 6c 69 64 5b  {file://invalid[
1130: 74 65 73 74 5f 70 77 64 20 2f 5d 74 65 73 74 2e  test_pwd /]test.
1140: 64 62 7d 20 20 20 20 20 7b 69 6e 76 61 6c 69 64  db}     {invalid
1150: 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
1160: 69 6e 76 61 6c 69 64 7d 0a 20 20 22 20 7b 0a 20  invalid}.  " {. 
1170: 20 20 20 64 6f 5f 74 65 73 74 20 32 2e 24 74 6e     do_test 2.$tn
1180: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 44 42 20   {.      set DB 
1190: 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32  [sqlite3_open_v2
11a0: 20 24 75 72 69 20 24 66 6c 61 67 73 20 22 22 5d   $uri $flags ""]
11b0: 0a 20 20 20 20 20 20 73 65 74 20 65 20 5b 73 71  .      set e [sq
11c0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 24 44 42  lite3_errmsg $DB
11d0: 5d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ].      sqlite3_
11e0: 63 6c 6f 73 65 20 24 44 42 0a 20 20 20 20 20 20  close $DB.      
11f0: 73 65 74 20 65 0a 20 20 20 20 7d 20 24 65 72 72  set e.    } $err
1200: 6f 72 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44  or.  }.}..# EVID
1210: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 35 39 38 31  ENCE-OF: R-45981
1220: 2d 32 35 35 32 38 20 54 68 65 20 66 72 61 67 6d  -25528 The fragm
1230: 65 6e 74 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ent component of
1240: 20 61 20 55 52 49 2c 20 69 66 0a 23 20 70 72 65   a URI, if.# pre
1250: 73 65 6e 74 2c 20 69 73 20 69 67 6e 6f 72 65 64  sent, is ignored
1260: 2e 0a 23 0a 23 20 20 20 49 74 20 69 73 20 64 69  ..#.#   It is di
1270: 66 66 69 63 75 6c 74 20 74 6f 20 74 65 73 74 20  fficult to test 
1280: 74 68 61 74 20 73 6f 6d 65 74 68 69 6e 67 20 69  that something i
1290: 73 20 69 67 6e 6f 72 65 64 20 63 6f 72 72 65 63  s ignored correc
12a0: 74 6c 79 2e 20 53 6f 20 74 68 65 73 65 20 74 65  tly. So these te
12b0: 73 74 73 0a 23 20 20 20 6a 75 73 74 20 73 68 6f  sts.#   just sho
12c0: 77 20 74 68 61 74 20 61 64 64 69 6e 67 20 61 20  w that adding a 
12d0: 66 72 61 67 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  fragment does no
12e0: 74 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68  t interfere with
12f0: 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 72   the pathname or
1300: 0a 23 20 20 20 70 61 72 61 6d 65 74 65 72 73 20  .#   parameters 
1310: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
1320: 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e 28  o the VFS xOpen(
1330: 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 66 6f 72  ) methods..#.for
1340: 65 61 63 68 20 7b 74 6e 20 75 72 69 20 70 61 72  each {tn uri par
1350: 73 65 7d 20 22 0a 20 20 31 20 20 20 20 7b 66 69  se} ".  1    {fi
1360: 6c 65 3a 74 65 73 74 2e 64 62 23 61 62 63 7d 20  le:test.db#abc} 
1370: 20 20 20 20 20 7b 5b 74 65 73 74 5f 70 77 64 20       {[test_pwd 
1380: 2f 20 7b 7d 5d 74 65 73 74 2e 64 62 20 7b 7d 7d  / {}]test.db {}}
1390: 0a 20 20 32 20 20 20 20 7b 66 69 6c 65 3a 74 65  .  2    {file:te
13a0: 73 74 2e 64 62 3f 61 3d 62 23 61 62 63 7d 20 20  st.db?a=b#abc}  
13b0: 7b 5b 74 65 73 74 5f 70 77 64 20 2f 20 7b 7d 5d  {[test_pwd / {}]
13c0: 74 65 73 74 2e 64 62 20 7b 61 20 62 7d 7d 0a 20  test.db {a b}}. 
13d0: 20 33 20 20 20 20 7b 66 69 6c 65 3a 74 65 73 74   3    {file:test
13e0: 2e 64 62 3f 61 3d 62 23 3f 63 3d 64 7d 20 7b 5b  .db?a=b#?c=d} {[
13f0: 74 65 73 74 5f 70 77 64 20 2f 20 7b 7d 5d 74 65  test_pwd / {}]te
1400: 73 74 2e 64 62 20 7b 61 20 62 7d 7d 0a 22 20 7b  st.db {a b}}." {
1410: 0a 20 20 64 6f 5f 66 69 6c 65 70 61 74 68 5f 74  .  do_filepath_t
1420: 65 73 74 20 33 2e 24 74 6e 20 7b 20 70 61 72 73  est 3.$tn { pars
1430: 65 5f 75 72 69 20 24 75 72 69 20 7d 20 24 70 61  e_uri $uri } $pa
1440: 72 73 65 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  rse.}..# EVIDENC
1450: 45 2d 4f 46 3a 20 52 2d 36 32 35 35 37 2d 30 39  E-OF: R-62557-09
1460: 33 39 30 20 53 51 4c 69 74 65 20 75 73 65 73 20  390 SQLite uses 
1470: 74 68 65 20 70 61 74 68 20 63 6f 6d 70 6f 6e 65  the path compone
1480: 6e 74 20 6f 66 20 74 68 65 20 55 52 49 0a 23 20  nt of the URI.# 
1490: 61 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  as the name of t
14a0: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 68 69  he disk file whi
14b0: 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ch contains the 
14c0: 64 61 74 61 62 61 73 65 2e 0a 23 0a 23 20 45 56  database..#.# EV
14d0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 36  IDENCE-OF: R-286
14e0: 35 39 2d 31 31 30 33 35 20 49 66 20 74 68 65 20  59-11035 If the 
14f0: 70 61 74 68 20 62 65 67 69 6e 73 20 77 69 74 68  path begins with
1500: 20 61 20 27 2f 27 20 63 68 61 72 61 63 74 65 72   a '/' character
1510: 2c 0a 23 20 74 68 65 6e 20 69 74 20 69 73 20 69  ,.# then it is i
1520: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
1530: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 0a   absolute path..
1540: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
1550: 20 52 2d 34 36 32 33 34 2d 36 31 33 32 33 20 49   R-46234-61323 I
1560: 66 20 74 68 65 20 70 61 74 68 20 64 6f 65 73 20  f the path does 
1570: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
1580: 20 27 2f 27 0a 23 20 28 6d 65 61 6e 69 6e 67 20   '/'.# (meaning 
1590: 74 68 61 74 20 74 68 65 20 61 75 74 68 6f 72 69  that the authori
15a0: 74 79 20 73 65 63 74 69 6f 6e 20 69 73 20 6f 6d  ty section is om
15b0: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 55  itted from the U
15c0: 52 49 29 20 74 68 65 6e 20 74 68 65 0a 23 20 70  RI) then the.# p
15d0: 61 74 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ath is interpret
15e0: 65 64 20 61 73 20 61 20 72 65 6c 61 74 69 76 65  ed as a relative
15f0: 20 70 61 74 68 2e 0a 23 0a 66 6f 72 65 61 63 68   path..#.foreach
1600: 20 7b 74 6e 20 75 72 69 20 70 61 72 73 65 7d 20   {tn uri parse} 
1610: 22 0a 20 20 31 20 20 20 20 7b 66 69 6c 65 3a 74  ".  1    {file:t
1620: 65 73 74 2e 64 62 7d 20 20 20 20 20 20 20 20 20  est.db}         
1630: 20 20 20 20 7b 5b 74 65 73 74 5f 70 77 64 20 2f      {[test_pwd /
1640: 20 7b 7d 5d 74 65 73 74 2e 64 62 20 7b 7d 7d 0a   {}]test.db {}}.
1650: 20 20 32 20 20 20 20 7b 66 69 6c 65 3a 2f 74 65    2    {file:/te
1660: 73 74 2e 64 62 7d 20 20 20 20 20 20 20 20 20 20  st.db}          
1670: 20 20 7b 2f 74 65 73 74 2e 64 62 20 7b 7d 7d 0a    {/test.db {}}.
1680: 20 20 33 20 20 20 20 7b 66 69 6c 65 3a 2f 2f 2f    3    {file:///
1690: 74 65 73 74 2e 64 62 7d 20 20 20 20 20 20 20 20  test.db}        
16a0: 20 20 7b 2f 74 65 73 74 2e 64 62 20 7b 7d 7d 0a    {/test.db {}}.
16b0: 20 20 34 20 20 20 20 7b 66 69 6c 65 3a 2f 2f 6c    4    {file://l
16c0: 6f 63 61 6c 68 6f 73 74 2f 74 65 73 74 2e 64 62  ocalhost/test.db
16d0: 7d 20 7b 2f 74 65 73 74 2e 64 62 20 7b 7d 7d 0a  } {/test.db {}}.
16e0: 20 20 35 20 20 20 20 7b 66 69 6c 65 3a 2f 61 2f    5    {file:/a/
16f0: 62 2f 63 2f 74 65 73 74 2e 64 62 7d 20 20 20 20  b/c/test.db}    
1700: 20 20 7b 2f 61 2f 62 2f 63 2f 74 65 73 74 2e 64    {/a/b/c/test.d
1710: 62 20 7b 7d 7d 0a 22 20 7b 0a 20 20 64 6f 5f 66  b {}}." {.  do_f
1720: 69 6c 65 70 61 74 68 5f 74 65 73 74 20 34 2e 24  ilepath_test 4.$
1730: 74 6e 20 7b 20 70 61 72 73 65 5f 75 72 69 20 24  tn { parse_uri $
1740: 75 72 69 20 7d 20 24 70 61 72 73 65 0a 7d 0a 0a  uri } $parse.}..
1750: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
1760: 2d 30 31 36 31 32 2d 33 30 38 37 37 20 54 68 65  -01612-30877 The
1770: 20 22 76 66 73 22 20 70 61 72 61 6d 65 74 65 72   "vfs" parameter
1780: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
1790: 73 70 65 63 69 66 79 0a 23 20 74 68 65 20 6e 61  specify.# the na
17a0: 6d 65 20 6f 66 20 61 20 56 46 53 20 6f 62 6a 65  me of a VFS obje
17b0: 63 74 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  ct that provides
17c0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
17d0: 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 0a  ystem interface.
17e0: 23 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  # that should be
17f0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
1800: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1810: 65 20 6f 6e 20 64 69 73 6b 2e 0a 23 0a 23 20 20  e on disk..#.#  
1820: 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 74 65   The above is te
1830: 73 74 65 64 20 62 79 20 63 61 73 65 73 20 31 2e  sted by cases 1.
1840: 2a 20 62 65 6c 6f 77 2e 0a 23 0a 23 20 45 56 49  * below..#.# EVI
1850: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 32 39  DENCE-OF: R-5229
1860: 33 2d 35 38 34 39 37 20 49 66 20 74 68 69 73 20  3-58497 If this 
1870: 6f 70 74 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  option is set to
1880: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
1890: 0a 23 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  .# the default V
18a0: 46 53 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  FS object is use
18b0: 64 2e 0a 23 0a 23 20 20 20 54 68 65 20 61 62 6f  d..#.#   The abo
18c0: 76 65 20 69 73 20 74 65 73 74 65 64 20 62 79 20  ve is tested by 
18d0: 63 61 73 65 73 20 32 2e 2a 20 62 65 6c 6f 77 2e  cases 2.* below.
18e0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
18f0: 3a 20 52 2d 33 31 38 35 35 2d 31 38 36 36 35 20  : R-31855-18665 
1900: 49 66 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  If sqlite3_open_
1910: 76 32 28 29 20 69 73 20 75 73 65 64 20 61 6e 64  v2() is used and
1920: 20 74 68 65 20 76 66 73 0a 23 20 6f 70 74 69 6f   the vfs.# optio
1930: 6e 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  n is present, th
1940: 65 6e 20 74 68 65 20 56 46 53 20 73 70 65 63 69  en the VFS speci
1950: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 74 69  fied by the opti
1960: 6f 6e 20 74 61 6b 65 73 0a 23 20 70 72 65 63 65  on takes.# prece
1970: 64 65 6e 63 65 20 6f 76 65 72 20 74 68 65 20 76  dence over the v
1980: 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
1990: 68 65 20 66 6f 75 72 74 68 20 70 61 72 61 6d 65  he fourth parame
19a0: 74 65 72 20 74 6f 0a 23 20 73 71 6c 69 74 65 33  ter to.# sqlite3
19b0: 5f 6f 70 65 6e 5f 76 32 28 29 2e 0a 23 0a 23 20  _open_v2()..#.# 
19c0: 20 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 74    The above is t
19d0: 65 73 74 65 64 20 62 79 20 63 61 73 65 73 20 33  ested by cases 3
19e0: 2e 2a 20 62 65 6c 6f 77 2e 0a 23 0a 70 72 6f 63  .* below..#.proc
19f0: 20 76 66 73 5f 6f 70 65 6e 5f 63 62 20 7b 6e 61   vfs_open_cb {na
1a00: 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74  me args} {.  set
1a10: 20 3a 3a 76 66 73 20 24 6e 61 6d 65 0a 7d 0a 66   ::vfs $name.}.f
1a20: 6f 72 65 61 63 68 20 7b 6e 61 6d 65 20 64 65 66  oreach {name def
1a30: 61 75 6c 74 7d 20 7b 76 66 73 31 20 30 20 76 66  ault} {vfs1 0 vf
1a40: 73 32 20 30 20 76 66 73 33 20 31 7d 20 7b 0a 20  s2 0 vfs3 1} {. 
1a50: 20 74 65 73 74 76 66 73 20 24 6e 61 6d 65 20 2d   testvfs $name -
1a60: 64 65 66 61 75 6c 74 20 24 64 65 66 61 75 6c 74  default $default
1a70: 0a 20 20 24 6e 61 6d 65 20 66 69 6c 74 65 72 20  .  $name filter 
1a80: 78 4f 70 65 6e 0a 20 20 24 6e 61 6d 65 20 73 63  xOpen.  $name sc
1a90: 72 69 70 74 20 5b 6c 69 73 74 20 76 66 73 5f 6f  ript [list vfs_o
1aa0: 70 65 6e 5f 63 62 20 24 6e 61 6d 65 5d 0a 7d 0a  pen_cb $name].}.
1ab0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 75 72 69 20  foreach {tn uri 
1ac0: 64 65 66 76 66 73 20 76 66 73 7d 20 7b 0a 20 20  defvfs vfs} {.  
1ad0: 31 2e 31 20 20 20 20 22 66 69 6c 65 3a 74 65 73  1.1    "file:tes
1ae0: 74 2e 64 62 3f 76 66 73 3d 76 66 73 31 22 20 20  t.db?vfs=vfs1"  
1af0: 20 20 22 22 20 20 20 20 76 66 73 31 0a 20 20 31    ""    vfs1.  1
1b00: 2e 32 20 20 20 20 22 66 69 6c 65 3a 74 65 73 74  .2    "file:test
1b10: 2e 64 62 3f 76 66 73 3d 76 66 73 32 22 20 20 20  .db?vfs=vfs2"   
1b20: 20 22 22 20 20 20 20 76 66 73 32 0a 0a 20 20 32   ""    vfs2..  2
1b30: 2e 31 20 20 20 20 22 66 69 6c 65 3a 74 65 73 74  .1    "file:test
1b40: 2e 64 62 22 20 20 20 20 20 20 20 20 20 20 20 20  .db"            
1b50: 20 76 66 73 31 20 20 76 66 73 31 0a 20 20 32 2e   vfs1  vfs1.  2.
1b60: 32 20 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e  2    "file:test.
1b70: 64 62 3f 76 66 73 3d 22 20 20 20 20 20 20 20 20  db?vfs="        
1b80: 76 66 73 31 20 20 76 66 73 33 0a 0a 20 20 33 2e  vfs1  vfs3..  3.
1b90: 31 20 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e  1    "file:test.
1ba0: 64 62 3f 76 66 73 3d 76 66 73 31 22 20 20 20 20  db?vfs=vfs1"    
1bb0: 76 66 73 32 20 20 76 66 73 31 0a 20 20 33 2e 32  vfs2  vfs1.  3.2
1bc0: 20 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e 64      "file:test.d
1bd0: 62 3f 76 66 73 3d 76 66 73 32 22 20 20 20 20 76  b?vfs=vfs2"    v
1be0: 66 73 31 20 20 76 66 73 32 0a 20 20 33 2e 33 20  fs1  vfs2.  3.3 
1bf0: 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62     "file:test.db
1c00: 3f 78 76 66 73 3d 76 66 73 31 22 20 20 20 76 66  ?xvfs=vfs1"   vf
1c10: 73 32 20 20 76 66 73 32 0a 20 20 33 2e 34 20 20  s2  vfs2.  3.4  
1c20: 20 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f    "file:test.db?
1c30: 78 76 66 73 3d 76 66 73 32 22 20 20 20 76 66 73  xvfs=vfs2"   vfs
1c40: 31 20 20 76 66 73 31 0a 7d 20 7b 0a 20 20 64 6f  1  vfs1.} {.  do
1c50: 5f 74 65 73 74 20 35 2e 24 74 6e 20 7b 0a 20 20  _test 5.$tn {.  
1c60: 20 20 73 65 74 20 66 6c 61 67 73 20 5b 6c 69 73    set flags [lis
1c70: 74 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t SQLITE_OPEN_RE
1c80: 41 44 57 52 49 54 45 20 53 51 4c 49 54 45 5f 4f  ADWRITE SQLITE_O
1c90: 50 45 4e 5f 43 52 45 41 54 45 20 53 51 4c 49 54  PEN_CREATE SQLIT
1ca0: 45 5f 4f 50 45 4e 5f 55 52 49 5d 0a 20 20 20 20  E_OPEN_URI].    
1cb0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 5b 0a  sqlite3_close [.
1cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1cd0: 65 6e 5f 76 32 20 24 75 72 69 20 24 66 6c 61 67  en_v2 $uri $flag
1ce0: 73 20 24 64 65 66 76 66 73 0a 20 20 20 20 5d 0a  s $defvfs.    ].
1cf0: 20 20 20 20 73 65 74 20 3a 3a 76 66 73 0a 20 20      set ::vfs.  
1d00: 7d 20 24 76 66 73 0a 7d 0a 76 66 73 31 20 64 65  } $vfs.}.vfs1 de
1d10: 6c 65 74 65 0a 76 66 73 32 20 64 65 6c 65 74 65  lete.vfs2 delete
1d20: 0a 76 66 73 33 20 64 65 6c 65 74 65 0a 0a 23 20  .vfs3 delete..# 
1d30: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
1d40: 38 33 36 35 2d 33 36 33 30 38 20 53 70 65 63 69  8365-36308 Speci
1d50: 66 79 69 6e 67 20 61 6e 20 75 6e 6b 6e 6f 77 6e  fying an unknown
1d60: 20 56 46 53 20 69 73 20 61 6e 20 65 72 72 6f 72   VFS is an error
1d70: 2e 0a 23 0a 73 65 74 20 66 6c 61 67 73 20 5b 6c  ..#.set flags [l
1d80: 69 73 74 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ist SQLITE_OPEN_
1d90: 52 45 41 44 57 52 49 54 45 20 53 51 4c 49 54 45  READWRITE SQLITE
1da0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 53 51 4c  _OPEN_CREATE SQL
1db0: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 5d 0a 64 6f  ITE_OPEN_URI].do
1dc0: 5f 74 65 73 74 20 36 2e 31 20 7b 0a 20 20 73 65  _test 6.1 {.  se
1dd0: 74 20 44 42 20 5b 73 71 6c 69 74 65 33 5f 6f 70  t DB [sqlite3_op
1de0: 65 6e 5f 76 32 20 66 69 6c 65 3a 74 65 73 74 2e  en_v2 file:test.
1df0: 64 62 3f 76 66 73 3d 6e 6f 73 75 63 68 76 66 73  db?vfs=nosuchvfs
1e00: 20 24 66 6c 61 67 73 20 22 22 5d 0a 20 20 73 65   $flags ""].  se
1e10: 74 20 65 72 72 6d 73 67 20 5b 73 71 6c 69 74 65  t errmsg [sqlite
1e20: 33 5f 65 72 72 6d 73 67 20 24 44 42 5d 0a 20 20  3_errmsg $DB].  
1e30: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 24 44  sqlite3_close $D
1e40: 42 0a 20 20 73 65 74 20 65 72 72 6d 73 67 0a 7d  B.  set errmsg.}
1e50: 20 7b 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 6e   {no such vfs: n
1e60: 6f 73 75 63 68 76 66 73 7d 0a 0a 0a 23 20 45 56  osuchvfs}...# EV
1e70: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 34  IDENCE-OF: R-604
1e80: 37 39 2d 36 34 32 37 30 20 54 68 65 20 6d 6f 64  79-64270 The mod
1e90: 65 20 70 61 72 61 6d 65 74 65 72 20 6d 61 79 20  e parameter may 
1ea0: 62 65 20 73 65 74 20 74 6f 20 65 69 74 68 65 72  be set to either
1eb0: 0a 23 20 22 72 6f 22 2c 20 22 72 77 22 20 6f 72  .# "ro", "rw" or
1ec0: 20 22 72 77 63 22 2e 20 41 74 74 65 6d 70 74 69   "rwc". Attempti
1ed0: 6e 67 20 74 6f 20 73 65 74 20 69 74 20 74 6f 20  ng to set it to 
1ee0: 61 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20  any other value 
1ef0: 69 73 20 61 6e 0a 23 20 65 72 72 6f 72 0a 23 0a  is an.# error.#.
1f00: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
1f10: 64 62 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 65  db.db close.fore
1f20: 61 63 68 20 7b 74 6e 20 75 72 69 20 65 72 72 6f  ach {tn uri erro
1f30: 72 7d 20 22 0a 20 20 31 20 20 20 20 7b 66 69 6c  r} ".  1    {fil
1f40: 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d 72  e:test.db?mode=r
1f50: 6f 7d 20 20 20 20 7b 6e 6f 74 20 61 6e 20 65 72  o}    {not an er
1f60: 72 6f 72 7d 0a 20 20 32 20 20 20 20 7b 66 69 6c  ror}.  2    {fil
1f70: 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d 72  e:test.db?mode=r
1f80: 77 7d 20 20 20 20 7b 6e 6f 74 20 61 6e 20 65 72  w}    {not an er
1f90: 72 6f 72 7d 0a 20 20 33 20 20 20 20 7b 66 69 6c  ror}.  3    {fil
1fa0: 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d 72  e:test.db?mode=r
1fb0: 77 63 7d 20 20 20 7b 6e 6f 74 20 61 6e 20 65 72  wc}   {not an er
1fc0: 72 6f 72 7d 0a 20 20 34 20 20 20 20 7b 66 69 6c  ror}.  4    {fil
1fd0: 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d 52  e:test.db?mode=R
1fe0: 6f 7d 20 20 20 20 7b 6e 6f 20 73 75 63 68 20 61  o}    {no such a
1ff0: 63 63 65 73 73 20 6d 6f 64 65 3a 20 52 6f 7d 0a  ccess mode: Ro}.
2000: 20 20 35 20 20 20 20 7b 66 69 6c 65 3a 74 65 73    5    {file:tes
2010: 74 2e 64 62 3f 6d 6f 64 65 3d 52 77 7d 20 20 20  t.db?mode=Rw}   
2020: 20 7b 6e 6f 20 73 75 63 68 20 61 63 63 65 73 73   {no such access
2030: 20 6d 6f 64 65 3a 20 52 77 7d 0a 20 20 36 20 20   mode: Rw}.  6  
2040: 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f    {file:test.db?
2050: 6d 6f 64 65 3d 52 77 63 7d 20 20 20 7b 6e 6f 20  mode=Rwc}   {no 
2060: 73 75 63 68 20 61 63 63 65 73 73 20 6d 6f 64 65  such access mode
2070: 3a 20 52 77 63 7d 0a 20 20 37 20 20 20 20 7b 66  : Rwc}.  7    {f
2080: 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65  ile:test.db?mode
2090: 3d 6d 65 6d 6f 72 79 7d 20 7b 6e 6f 74 20 61 6e  =memory} {not an
20a0: 20 65 72 72 6f 72 7d 0a 20 20 38 20 20 20 20 7b   error}.  8    {
20b0: 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64  file:test.db?mod
20c0: 65 3d 4d 45 4d 4f 52 59 7d 20 7b 6e 6f 20 73 75  e=MEMORY} {no su
20d0: 63 68 20 61 63 63 65 73 73 20 6d 6f 64 65 3a 20  ch access mode: 
20e0: 4d 45 4d 4f 52 59 7d 0a 22 20 7b 0a 20 20 64 6f  MEMORY}." {.  do
20f0: 5f 74 65 73 74 20 37 2e 24 74 6e 20 7b 20 6f 70  _test 7.$tn { op
2100: 65 6e 5f 75 72 69 5f 65 72 72 6f 72 20 24 75 72  en_uri_error $ur
2110: 69 20 7d 20 24 65 72 72 6f 72 0a 7d 0a 0a 0a 23  i } $error.}...#
2120: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2130: 30 39 36 35 31 2d 33 31 38 30 35 20 49 66 20 22  09651-31805 If "
2140: 72 6f 22 20 69 73 20 73 70 65 63 69 66 69 65 64  ro" is specified
2150: 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2160: 61 73 65 20 69 73 0a 23 20 6f 70 65 6e 65 64 20  ase is.# opened 
2170: 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63  for read-only ac
2180: 63 65 73 73 2c 20 6a 75 73 74 20 61 73 20 69 66  cess, just as if
2190: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   the SQLITE_OPEN
21a0: 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 0a 23  _READONLY flag.#
21b0: 20 68 61 64 20 62 65 65 6e 20 73 65 74 20 69 6e   had been set in
21c0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
21d0: 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 5f 70  ent to sqlite3_p
21e0: 72 65 70 61 72 65 5f 76 32 28 29 2e 0a 23 0a 23  repare_v2()..#.#
21f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2200: 34 30 31 33 37 2d 32 36 30 35 30 20 49 66 20 74  40137-26050 If t
2210: 68 65 20 6d 6f 64 65 20 6f 70 74 69 6f 6e 20 69  he mode option i
2220: 73 20 73 65 74 20 74 6f 20 22 72 77 22 2c 20 74  s set to "rw", t
2230: 68 65 6e 20 74 68 65 0a 23 20 64 61 74 61 62 61  hen the.# databa
2240: 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72  se is opened for
2250: 20 72 65 61 64 2d 77 72 69 74 65 20 28 62 75 74   read-write (but
2260: 20 6e 6f 74 20 63 72 65 61 74 65 29 20 61 63 63   not create) acc
2270: 65 73 73 2c 20 61 73 20 69 66 0a 23 20 53 51 4c  ess, as if.# SQL
2280: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2290: 54 45 20 28 62 75 74 20 6e 6f 74 20 53 51 4c 49  TE (but not SQLI
22a0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 20  TE_OPEN_CREATE) 
22b0: 68 61 64 20 62 65 65 6e 20 73 65 74 2e 0a 23 0a  had been set..#.
22c0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
22d0: 2d 32 36 38 34 35 2d 33 32 39 37 36 20 56 61 6c  -26845-32976 Val
22e0: 75 65 20 22 72 77 63 22 20 69 73 20 65 71 75 69  ue "rwc" is equi
22f0: 76 61 6c 65 6e 74 20 74 6f 20 73 65 74 74 69 6e  valent to settin
2300: 67 20 62 6f 74 68 0a 23 20 53 51 4c 49 54 45 5f  g both.# SQLITE_
2310: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 61  OPEN_READWRITE a
2320: 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  nd SQLITE_OPEN_C
2330: 52 45 41 54 45 2e 0a 23 0a 66 6f 72 65 61 63 68  REATE..#.foreach
2340: 20 7b 74 6e 20 75 72 69 20 72 65 61 64 20 77 72   {tn uri read wr
2350: 69 74 65 20 63 72 65 61 74 65 7d 20 7b 0a 20 20  ite create} {.  
2360: 31 20 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e  1    {file:test.
2370: 64 62 3f 6d 6f 64 65 3d 72 6f 7d 20 20 20 20 20  db?mode=ro}     
2380: 31 20 30 20 30 0a 20 20 32 20 20 20 20 7b 66 69  1 0 0.  2    {fi
2390: 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d  le:test.db?mode=
23a0: 72 77 7d 20 20 20 20 20 31 20 31 20 30 0a 20 20  rw}     1 1 0.  
23b0: 33 20 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e  3    {file:test.
23c0: 64 62 3f 6d 6f 64 65 3d 72 77 63 7d 20 20 20 20  db?mode=rwc}    
23d0: 31 20 31 20 31 0a 7d 20 7b 0a 20 20 73 65 74 20  1 1 1.} {.  set 
23e0: 52 45 53 28 63 2c 30 29 20 7b 31 20 7b 75 6e 61  RES(c,0) {1 {una
23f0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
2400: 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 73 65  base file}}.  se
2410: 74 20 52 45 53 28 63 2c 31 29 20 7b 30 20 7b 7d  t RES(c,1) {0 {}
2420: 7d 0a 20 20 73 65 74 20 52 45 53 28 77 2c 30 29  }.  set RES(w,0)
2430: 20 7b 31 20 7b 61 74 74 65 6d 70 74 20 74 6f 20   {1 {attempt to 
2440: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
2450: 20 64 61 74 61 62 61 73 65 7d 7d 0a 20 20 73 65   database}}.  se
2460: 74 20 52 45 53 28 77 2c 31 29 20 7b 30 20 7b 7d  t RES(w,1) {0 {}
2470: 7d 0a 20 20 73 65 74 20 52 45 53 28 72 2c 30 29  }.  set RES(r,0)
2480: 20 7b 31 20 7b 74 68 69 73 20 6e 65 76 65 72 20   {1 {this never 
2490: 68 61 70 70 65 6e 73 7d 7d 0a 20 20 73 65 74 20  happens}}.  set 
24a0: 52 45 53 28 72 2c 31 29 20 7b 30 20 7b 61 20 62  RES(r,1) {0 {a b
24b0: 7d 7d 0a 0a 20 20 23 20 54 65 73 74 20 43 52 45  }}..  # Test CRE
24c0: 41 54 45 20 61 63 63 65 73 73 3a 0a 20 20 66 6f  ATE access:.  fo
24d0: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
24e0: 62 0a 20 20 64 6f 5f 74 65 73 74 20 38 2e 24 74  b.  do_test 8.$t
24f0: 6e 2e 63 20 7b 20 6c 69 73 74 20 5b 63 61 74 63  n.c { list [catc
2500: 68 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 24  h { sqlite3 db $
2510: 75 72 69 20 7d 20 6d 73 67 5d 20 24 6d 73 67 20  uri } msg] $msg 
2520: 7d 20 24 52 45 53 28 63 2c 24 63 72 65 61 74 65  } $RES(c,$create
2530: 29 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63  ).  catch { db c
2540: 6c 6f 73 65 20 7d 0a 0a 20 20 73 71 6c 69 74 65  lose }..  sqlite
2550: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
2560: 62 20 65 76 61 6c 20 7b 20 43 52 45 41 54 45 20  b eval { CREATE 
2570: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 20 3b  TABLE t1(a, b) ;
2580: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2590: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
25a0: 20 3b 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20   ;}.  db close. 
25b0: 20 0a 20 20 23 20 54 65 73 74 20 52 45 41 44 20   .  # Test READ 
25c0: 61 63 63 65 73 73 3a 0a 20 20 64 6f 5f 74 65 73  access:.  do_tes
25d0: 74 20 38 2e 24 74 6e 2e 72 20 7b 20 0a 20 20 20  t 8.$tn.r { .   
25e0: 20 73 71 6c 69 74 65 33 20 64 62 20 24 75 72 69   sqlite3 db $uri
25f0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
2600: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2610: 20 7d 0a 20 20 7d 20 24 52 45 53 28 72 2c 24 72   }.  } $RES(r,$r
2620: 65 61 64 29 0a 20 20 0a 20 20 23 20 54 65 73 74  ead).  .  # Test
2630: 20 57 52 49 54 45 20 61 63 63 65 73 73 3a 0a 20   WRITE access:. 
2640: 20 64 6f 5f 74 65 73 74 20 38 2e 24 74 6e 2e 77   do_test 8.$tn.w
2650: 20 7b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 20   { .    sqlite3 
2660: 64 62 20 24 75 72 69 0a 20 20 20 20 63 61 74 63  db $uri.    catc
2670: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
2680: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
2690: 32 29 20 7d 0a 20 20 7d 20 24 52 45 53 28 77 2c  2) }.  } $RES(w,
26a0: 24 77 72 69 74 65 29 0a 0a 20 20 63 61 74 63 68  $write)..  catch
26b0: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 7d 0a 0a 23   {db close}.}..#
26c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
26d0: 35 36 30 33 32 2d 33 32 32 38 37 20 49 66 20 73  56032-32287 If s
26e0: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
26f0: 20 69 73 20 75 73 65 64 2c 20 69 74 20 69 73 20   is used, it is 
2700: 61 6e 0a 23 20 65 72 72 6f 72 20 74 6f 20 73 70  an.# error to sp
2710: 65 63 69 66 79 20 61 20 76 61 6c 75 65 20 66 6f  ecify a value fo
2720: 72 20 74 68 65 20 6d 6f 64 65 20 70 61 72 61 6d  r the mode param
2730: 65 74 65 72 20 74 68 61 74 20 69 73 20 6c 65 73  eter that is les
2740: 73 0a 23 20 72 65 73 74 72 69 63 74 69 76 65 20  s.# restrictive 
2750: 74 68 61 6e 20 74 68 61 74 20 73 70 65 63 69 66  than that specif
2760: 69 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73  ied by the flags
2770: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74   passed as the t
2780: 68 69 72 64 0a 23 20 70 61 72 61 6d 65 74 65 72  hird.# parameter
2790: 2e 0a 23 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  ..#.forcedelete 
27a0: 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33 20  test.db.sqlite3 
27b0: 64 62 20 74 65 73 74 2e 64 62 0a 64 62 20 63 6c  db test.db.db cl
27c0: 6f 73 65 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  ose.foreach {tn 
27d0: 75 72 69 20 66 6c 61 67 73 20 65 72 72 6f 72 7d  uri flags error}
27e0: 20 7b 0a 20 20 31 20 20 20 7b 66 69 6c 65 3a 74   {.  1   {file:t
27f0: 65 73 74 2e 64 62 3f 6d 6f 64 65 3d 72 6f 7d 20  est.db?mode=ro} 
2800: 20 20 72 6f 20 20 20 20 7b 6e 6f 74 20 61 6e 20    ro    {not an 
2810: 65 72 72 6f 72 7d 0a 20 20 32 20 20 20 7b 66 69  error}.  2   {fi
2820: 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d  le:test.db?mode=
2830: 72 6f 7d 20 20 20 72 77 20 20 20 20 7b 6e 6f 74  ro}   rw    {not
2840: 20 61 6e 20 65 72 72 6f 72 7d 0a 20 20 33 20 20   an error}.  3  
2850: 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d   {file:test.db?m
2860: 6f 64 65 3d 72 6f 7d 20 20 20 72 77 63 20 20 20  ode=ro}   rwc   
2870: 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a 0a  {not an error}..
2880: 20 20 34 20 20 20 7b 66 69 6c 65 3a 74 65 73 74    4   {file:test
2890: 2e 64 62 3f 6d 6f 64 65 3d 72 77 7d 20 20 20 72  .db?mode=rw}   r
28a0: 6f 20 20 20 20 7b 61 63 63 65 73 73 20 6d 6f 64  o    {access mod
28b0: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 72  e not allowed: r
28c0: 77 7d 0a 20 20 35 20 20 20 7b 66 69 6c 65 3a 74  w}.  5   {file:t
28d0: 65 73 74 2e 64 62 3f 6d 6f 64 65 3d 72 77 7d 20  est.db?mode=rw} 
28e0: 20 20 72 77 20 20 20 20 7b 6e 6f 74 20 61 6e 20    rw    {not an 
28f0: 65 72 72 6f 72 7d 0a 20 20 36 20 20 20 7b 66 69  error}.  6   {fi
2900: 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d  le:test.db?mode=
2910: 72 77 7d 20 20 20 72 77 63 20 20 20 7b 6e 6f 74  rw}   rwc   {not
2920: 20 61 6e 20 65 72 72 6f 72 7d 0a 0a 20 20 37 20   an error}..  7 
2930: 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f    {file:test.db?
2940: 6d 6f 64 65 3d 72 77 63 7d 20 20 72 6f 20 20 20  mode=rwc}  ro   
2950: 20 7b 61 63 63 65 73 73 20 6d 6f 64 65 20 6e 6f   {access mode no
2960: 74 20 61 6c 6c 6f 77 65 64 3a 20 72 77 63 7d 0a  t allowed: rwc}.
2970: 20 20 38 20 20 20 7b 66 69 6c 65 3a 74 65 73 74    8   {file:test
2980: 2e 64 62 3f 6d 6f 64 65 3d 72 77 63 7d 20 20 72  .db?mode=rwc}  r
2990: 77 20 20 20 20 7b 61 63 63 65 73 73 20 6d 6f 64  w    {access mod
29a0: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 72  e not allowed: r
29b0: 77 63 7d 0a 20 20 39 20 20 20 7b 66 69 6c 65 3a  wc}.  9   {file:
29c0: 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d 72 77 63  test.db?mode=rwc
29d0: 7d 20 20 72 77 63 20 20 20 7b 6e 6f 74 20 61 6e  }  rwc   {not an
29e0: 20 65 72 72 6f 72 7d 0a 7d 20 7b 0a 20 20 73 65   error}.} {.  se
29f0: 74 20 66 28 72 6f 29 20 20 5b 6c 69 73 74 20 53  t f(ro)  [list S
2a00: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2a10: 4e 4c 59 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY SQLITE_OPEN_
2a20: 55 52 49 5d 0a 20 20 73 65 74 20 66 28 72 77 29  URI].  set f(rw)
2a30: 20 20 5b 6c 69 73 74 20 53 51 4c 49 54 45 5f 4f    [list SQLITE_O
2a40: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 53 51  PEN_READWRITE SQ
2a50: 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 5d 0a 20  LITE_OPEN_URI]. 
2a60: 20 73 65 74 20 66 28 72 77 63 29 20 5b 6c 69 73   set f(rwc) [lis
2a70: 74 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t SQLITE_OPEN_RE
2a80: 41 44 57 52 49 54 45 20 53 51 4c 49 54 45 5f 4f  ADWRITE SQLITE_O
2a90: 50 45 4e 5f 43 52 45 41 54 45 20 53 51 4c 49 54  PEN_CREATE SQLIT
2aa0: 45 5f 4f 50 45 4e 5f 55 52 49 5d 0a 0a 20 20 73  E_OPEN_URI]..  s
2ab0: 65 74 20 44 42 20 5b 73 71 6c 69 74 65 33 5f 6f  et DB [sqlite3_o
2ac0: 70 65 6e 5f 76 32 20 24 75 72 69 20 24 66 28 24  pen_v2 $uri $f($
2ad0: 66 6c 61 67 73 29 20 22 22 5d 0a 20 20 73 65 74  flags) ""].  set
2ae0: 20 65 20 5b 73 71 6c 69 74 65 33 5f 65 72 72 6d   e [sqlite3_errm
2af0: 73 67 20 24 44 42 5d 0a 20 20 73 71 6c 69 74 65  sg $DB].  sqlite
2b00: 33 5f 63 6c 6f 73 65 20 24 44 42 0a 0a 20 20 64  3_close $DB..  d
2b10: 6f 5f 74 65 73 74 20 39 2e 24 74 6e 20 7b 20 73  o_test 9.$tn { s
2b20: 65 74 20 65 20 7d 20 24 65 72 72 6f 72 0a 7d 0a  et e } $error.}.
2b30: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
2b40: 52 2d 32 33 31 38 32 2d 35 34 32 39 35 20 54 68  R-23182-54295 Th
2b50: 65 20 63 61 63 68 65 20 70 61 72 61 6d 65 74 65  e cache paramete
2b60: 72 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  r may be set to 
2b70: 65 69 74 68 65 72 0a 23 20 22 73 68 61 72 65 64  either.# "shared
2b80: 22 20 6f 72 20 22 70 72 69 76 61 74 65 22 2e 0a  " or "private"..
2b90: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
2ba0: 64 62 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 65  db.db close.fore
2bb0: 61 63 68 20 7b 74 6e 20 75 72 69 20 65 72 72 6f  ach {tn uri erro
2bc0: 72 7d 20 22 0a 20 20 31 20 20 20 20 7b 66 69 6c  r} ".  1    {fil
2bd0: 65 3a 74 65 73 74 2e 64 62 3f 63 61 63 68 65 3d  e:test.db?cache=
2be0: 70 72 69 76 61 74 65 7d 20 20 20 20 7b 6e 6f 74  private}    {not
2bf0: 20 61 6e 20 65 72 72 6f 72 7d 0a 20 20 32 20 20   an error}.  2  
2c00: 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f    {file:test.db?
2c10: 63 61 63 68 65 3d 73 68 61 72 65 64 7d 20 20 20  cache=shared}   
2c20: 20 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d    {not an error}
2c30: 0a 20 20 33 20 20 20 20 7b 66 69 6c 65 3a 74 65  .  3    {file:te
2c40: 73 74 2e 64 62 3f 63 61 63 68 65 3d 79 65 73 7d  st.db?cache=yes}
2c50: 20 20 20 20 20 20 20 20 7b 6e 6f 20 73 75 63 68          {no such
2c60: 20 63 61 63 68 65 20 6d 6f 64 65 3a 20 79 65 73   cache mode: yes
2c70: 7d 0a 20 20 34 20 20 20 20 7b 66 69 6c 65 3a 74  }.  4    {file:t
2c80: 65 73 74 2e 64 62 3f 63 61 63 68 65 3d 7d 20 20  est.db?cache=}  
2c90: 20 20 20 20 20 20 20 20 20 7b 6e 6f 20 73 75 63           {no suc
2ca0: 68 20 63 61 63 68 65 20 6d 6f 64 65 3a 20 7d 0a  h cache mode: }.
2cb0: 22 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 31 30  " {.  do_test 10
2cc0: 2e 24 74 6e 20 7b 20 6f 70 65 6e 5f 75 72 69 5f  .$tn { open_uri_
2cd0: 65 72 72 6f 72 20 24 75 72 69 20 7d 20 24 65 72  error $uri } $er
2ce0: 72 6f 72 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  ror.}..# EVIDENC
2cf0: 45 2d 4f 46 3a 20 52 2d 32 33 30 32 37 2d 30 33  E-OF: R-23027-03
2d00: 35 31 35 20 53 65 74 74 69 6e 67 20 69 74 20 74  515 Setting it t
2d10: 6f 20 22 73 68 61 72 65 64 22 20 69 73 20 65 71  o "shared" is eq
2d20: 75 69 76 61 6c 65 6e 74 20 74 6f 0a 23 20 73 65  uivalent to.# se
2d30: 74 74 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  tting the SQLITE
2d40: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
2d50: 45 20 62 69 74 20 69 6e 20 74 68 65 20 66 6c 61  E bit in the fla
2d60: 67 73 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  gs argument pass
2d70: 65 64 0a 23 20 74 6f 20 73 71 6c 69 74 65 33 5f  ed.# to sqlite3_
2d80: 6f 70 65 6e 5f 76 32 28 29 2e 0a 23 0a 23 20 45  open_v2()..#.# E
2d90: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39  VIDENCE-OF: R-49
2da0: 37 39 33 2d 32 38 35 32 35 20 53 65 74 74 69 6e  793-28525 Settin
2db0: 67 20 74 68 65 20 63 61 63 68 65 20 70 61 72 61  g the cache para
2dc0: 6d 65 74 65 72 20 74 6f 20 22 70 72 69 76 61 74  meter to "privat
2dd0: 65 22 20 69 73 0a 23 20 65 71 75 69 76 61 6c 65  e" is.# equivale
2de0: 6e 74 20 74 6f 20 73 65 74 74 69 6e 67 20 74 68  nt to setting th
2df0: 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  e SQLITE_OPEN_PR
2e00: 49 56 41 54 45 43 41 43 48 45 20 62 69 74 2e 0a  IVATECACHE bit..
2e10: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
2e20: 20 52 2d 31 39 35 31 30 2d 34 38 30 38 30 20 49   R-19510-48080 I
2e30: 66 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  f sqlite3_open_v
2e40: 32 28 29 20 69 73 20 75 73 65 64 20 61 6e 64 20  2() is used and 
2e50: 74 68 65 0a 23 20 22 63 61 63 68 65 22 20 70 61  the.# "cache" pa
2e60: 72 61 6d 65 74 65 72 20 69 73 20 70 72 65 73 65  rameter is prese
2e70: 6e 74 20 69 6e 20 61 20 55 52 49 20 66 69 6c 65  nt in a URI file
2e80: 6e 61 6d 65 2c 20 69 74 73 20 76 61 6c 75 65 20  name, its value 
2e90: 6f 76 65 72 72 69 64 65 73 0a 23 20 61 6e 79 20  overrides.# any 
2ea0: 62 65 68 61 76 69 6f 75 72 20 72 65 71 75 65 73  behaviour reques
2eb0: 74 65 64 20 62 79 20 73 65 74 74 69 6e 67 20 53  ted by setting S
2ec0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
2ed0: 54 45 43 41 43 48 45 20 6f 72 0a 23 20 53 51 4c  TECACHE or.# SQL
2ee0: 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
2ef0: 41 43 48 45 20 66 6c 61 67 2e 0a 23 0a 73 65 74  ACHE flag..#.set
2f00: 20 6f 72 69 67 20 5b 73 71 6c 69 74 65 33 5f 65   orig [sqlite3_e
2f10: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
2f20: 68 65 5d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  he].foreach {tn 
2f30: 75 72 69 20 66 6c 61 67 73 20 73 68 61 72 65 64  uri flags shared
2f40: 5f 64 65 66 61 75 6c 74 20 69 73 73 68 61 72 65  _default isshare
2f50: 64 7d 20 7b 0a 20 20 31 2e 31 20 20 20 22 66 69  d} {.  1.1   "fi
2f60: 6c 65 3a 74 65 73 74 2e 64 62 22 20 20 20 20 20  le:test.db"     
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 22 20               "" 
2f80: 20 20 20 20 20 20 20 20 30 20 20 20 20 30 0a 20          0    0. 
2f90: 20 31 2e 32 20 20 20 22 66 69 6c 65 3a 74 65 73   1.2   "file:tes
2fa0: 74 2e 64 62 22 20 20 20 20 20 20 20 20 20 20 20  t.db"           
2fb0: 20 20 20 20 20 20 20 22 22 20 20 20 20 20 20 20         ""       
2fc0: 20 20 31 20 20 20 20 31 0a 20 20 31 2e 33 20 20    1    1.  1.3  
2fd0: 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 22 20   "file:test.db" 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 70 72 69 76 61 74 65 20 20 20 20 30 20 20 20   private    0   
3000: 20 30 0a 20 20 31 2e 34 20 20 20 22 66 69 6c 65   0.  1.4   "file
3010: 3a 74 65 73 74 2e 64 62 22 20 20 20 20 20 20 20  :test.db"       
3020: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61             priva
3030: 74 65 20 20 20 20 31 20 20 20 20 30 0a 20 20 31  te    1    0.  1
3040: 2e 35 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e  .5   "file:test.
3050: 64 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20  db"             
3060: 20 20 20 20 20 73 68 61 72 65 64 20 20 20 20 20       shared     
3070: 30 20 20 20 20 31 0a 20 20 31 2e 36 20 20 20 22  0    1.  1.6   "
3080: 66 69 6c 65 3a 74 65 73 74 2e 64 62 22 20 20 20  file:test.db"   
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
30a0: 68 61 72 65 64 20 20 20 20 20 31 20 20 20 20 31  hared     1    1
30b0: 0a 0a 20 20 32 2e 31 20 20 20 22 66 69 6c 65 3a  ..  2.1   "file:
30c0: 74 65 73 74 2e 64 62 3f 63 61 63 68 65 3d 70 72  test.db?cache=pr
30d0: 69 76 61 74 65 22 20 20 20 20 22 22 20 20 20 20  ivate"    ""    
30e0: 20 20 20 20 20 30 20 20 20 20 30 0a 20 20 32 2e       0    0.  2.
30f0: 32 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e 64  2   "file:test.d
3100: 62 3f 63 61 63 68 65 3d 70 72 69 76 61 74 65 22  b?cache=private"
3110: 20 20 20 20 22 22 20 20 20 20 20 20 20 20 20 31      ""         1
3120: 20 20 20 20 30 0a 20 20 32 2e 33 20 20 20 22 66      0.  2.3   "f
3130: 69 6c 65 3a 74 65 73 74 2e 64 62 3f 63 61 63 68  ile:test.db?cach
3140: 65 3d 70 72 69 76 61 74 65 22 20 20 20 20 70 72  e=private"    pr
3150: 69 76 61 74 65 20 20 20 20 30 20 20 20 20 30 0a  ivate    0    0.
3160: 20 20 32 2e 34 20 20 20 22 66 69 6c 65 3a 74 65    2.4   "file:te
3170: 73 74 2e 64 62 3f 63 61 63 68 65 3d 70 72 69 76  st.db?cache=priv
3180: 61 74 65 22 20 20 20 20 70 72 69 76 61 74 65 20  ate"    private 
3190: 20 20 20 31 20 20 20 20 30 0a 20 20 32 2e 35 20     1    0.  2.5 
31a0: 20 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f    "file:test.db?
31b0: 63 61 63 68 65 3d 70 72 69 76 61 74 65 22 20 20  cache=private"  
31c0: 20 20 73 68 61 72 65 64 20 20 20 20 20 30 20 20    shared     0  
31d0: 20 20 30 0a 20 20 32 2e 36 20 20 20 22 66 69 6c    0.  2.6   "fil
31e0: 65 3a 74 65 73 74 2e 64 62 3f 63 61 63 68 65 3d  e:test.db?cache=
31f0: 70 72 69 76 61 74 65 22 20 20 20 20 73 68 61 72  private"    shar
3200: 65 64 20 20 20 20 20 31 20 20 20 20 30 0a 0a 20  ed     1    0.. 
3210: 20 33 2e 31 20 20 20 22 66 69 6c 65 3a 74 65 73   3.1   "file:tes
3220: 74 2e 64 62 3f 63 61 63 68 65 3d 73 68 61 72 65  t.db?cache=share
3230: 64 22 20 20 20 20 20 22 22 20 20 20 20 20 20 20  d"     ""       
3240: 20 20 30 20 20 20 20 31 0a 20 20 33 2e 32 20 20    0    1.  3.2  
3250: 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 63   "file:test.db?c
3260: 61 63 68 65 3d 73 68 61 72 65 64 22 20 20 20 20  ache=shared"    
3270: 20 22 22 20 20 20 20 20 20 20 20 20 31 20 20 20   ""         1   
3280: 20 31 0a 20 20 33 2e 33 20 20 20 22 66 69 6c 65   1.  3.3   "file
3290: 3a 74 65 73 74 2e 64 62 3f 63 61 63 68 65 3d 73  :test.db?cache=s
32a0: 68 61 72 65 64 22 20 20 20 20 20 70 72 69 76 61  hared"     priva
32b0: 74 65 20 20 20 20 30 20 20 20 20 31 0a 20 20 33  te    0    1.  3
32c0: 2e 34 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e  .4   "file:test.
32d0: 64 62 3f 63 61 63 68 65 3d 73 68 61 72 65 64 22  db?cache=shared"
32e0: 20 20 20 20 20 70 72 69 76 61 74 65 20 20 20 20       private    
32f0: 31 20 20 20 20 31 0a 20 20 33 2e 35 20 20 20 22  1    1.  3.5   "
3300: 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 63 61 63  file:test.db?cac
3310: 68 65 3d 73 68 61 72 65 64 22 20 20 20 20 20 73  he=shared"     s
3320: 68 61 72 65 64 20 20 20 20 20 30 20 20 20 20 31  hared     0    1
3330: 0a 20 20 33 2e 36 20 20 20 22 66 69 6c 65 3a 74  .  3.6   "file:t
3340: 65 73 74 2e 64 62 3f 63 61 63 68 65 3d 73 68 61  est.db?cache=sha
3350: 72 65 64 22 20 20 20 20 20 73 68 61 72 65 64 20  red"     shared 
3360: 20 20 20 20 31 20 20 20 20 31 0a 7d 20 7b 0a 20      1    1.} {. 
3370: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
3380: 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 5f 65  t.db.  sqlite3_e
3390: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
33a0: 68 65 20 31 0a 20 20 73 71 6c 69 74 65 33 20 64  he 1.  sqlite3 d
33b0: 62 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69  b test.db.  sqli
33c0: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
33d0: 64 5f 63 61 63 68 65 20 30 0a 0a 20 20 64 62 20  d_cache 0..  db 
33e0: 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  eval {.    CREAT
33f0: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
3400: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3410: 31 20 56 41 4c 55 45 53 28 27 6f 6b 27 29 3b 0a  1 VALUES('ok');.
3420: 20 20 7d 0a 0a 20 20 75 6e 73 65 74 20 2d 6e 6f    }..  unset -no
3430: 63 6f 6d 70 6c 61 69 6e 20 66 0a 20 20 73 65 74  complain f.  set
3440: 20 66 28 29 20 20 20 20 20 20 20 20 7b 53 51 4c   f()        {SQL
3450: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
3460: 54 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE SQLITE_OPEN_C
3470: 52 45 41 54 45 20 53 51 4c 49 54 45 5f 4f 50 45  REATE SQLITE_OPE
3480: 4e 5f 55 52 49 7d 0a 20 20 73 65 74 20 66 28 73  N_URI}.  set f(s
3490: 68 61 72 65 64 29 20 20 5b 63 6f 6e 63 61 74 20  hared)  [concat 
34a0: 24 66 28 29 20 53 51 4c 49 54 45 5f 4f 50 45 4e  $f() SQLITE_OPEN
34b0: 5f 53 48 41 52 45 44 43 41 43 48 45 5d 0a 20 20  _SHAREDCACHE].  
34c0: 73 65 74 20 66 28 70 72 69 76 61 74 65 29 20 5b  set f(private) [
34d0: 63 6f 6e 63 61 74 20 24 66 28 29 20 53 51 4c 49  concat $f() SQLI
34e0: 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
34f0: 41 43 48 45 5d 0a 0a 20 20 73 71 6c 69 74 65 33  ACHE]..  sqlite3
3500: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
3510: 61 63 68 65 20 24 73 68 61 72 65 64 5f 64 65 66  ache $shared_def
3520: 61 75 6c 74 0a 20 20 73 65 74 20 44 42 20 5b 73  ault.  set DB [s
3530: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 24  qlite3_open_v2 $
3540: 75 72 69 20 24 66 28 24 66 6c 61 67 73 29 20 22  uri $f($flags) "
3550: 22 5d 0a 0a 20 20 73 65 74 20 53 54 4d 54 20 5b  "]..  set STMT [
3560: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
3570: 24 44 42 20 22 53 45 4c 45 43 54 20 2a 20 46 52  $DB "SELECT * FR
3580: 4f 4d 20 74 31 22 20 2d 31 20 64 75 6d 6d 79 5d  OM t1" -1 dummy]
3590: 0a 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20  ..  db eval {.  
35a0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
35b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
35c0: 4c 55 45 53 28 27 6b 6f 27 29 3b 0a 20 20 7d 0a  LUES('ko');.  }.
35d0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  .  sqlite3_step 
35e0: 24 53 54 4d 54 0a 20 20 73 71 6c 69 74 65 33 5f  $STMT.  sqlite3_
35f0: 66 69 6e 61 6c 69 7a 65 20 24 53 54 4d 54 0a 0a  finalize $STMT..
3600: 20 20 73 65 74 20 52 45 53 28 30 29 20 7b 6e 6f    set RES(0) {no
3610: 74 20 61 6e 20 65 72 72 6f 72 7d 0a 20 20 73 65  t an error}.  se
3620: 74 20 52 45 53 28 31 29 20 7b 64 61 74 61 62 61  t RES(1) {databa
3630: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
3640: 65 64 3a 20 74 31 7d 0a 0a 20 20 64 6f 5f 74 65  ed: t1}..  do_te
3650: 73 74 20 31 31 2e 24 74 6e 20 7b 20 73 71 6c 69  st 11.$tn { sqli
3660: 74 65 33 5f 65 72 72 6d 73 67 20 24 44 42 20 7d  te3_errmsg $DB }
3670: 20 24 52 45 53 28 24 69 73 73 68 61 72 65 64 29   $RES($isshared)
3680: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ..  sqlite3_clos
3690: 65 20 24 44 42 0a 20 20 64 62 20 63 6c 6f 73 65  e $DB.  db close
36a0: 0a 7d 0a 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  .}.sqlite3_enabl
36b0: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 24  e_shared_cache $
36c0: 6f 72 69 67 0a 0a 23 20 45 56 49 44 45 4e 43 45  orig..# EVIDENCE
36d0: 2d 4f 46 3a 20 52 2d 36 33 34 37 32 2d 34 36 37  -OF: R-63472-467
36e0: 36 39 20 53 70 65 63 69 66 79 69 6e 67 20 61 6e  69 Specifying an
36f0: 20 75 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74   unknown paramet
3700: 65 72 20 69 6e 20 74 68 65 0a 23 20 71 75 65 72  er in the.# quer
3710: 79 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 61  y component of a
3720: 20 55 52 49 20 69 73 20 6e 6f 74 20 61 6e 20 65   URI is not an e
3730: 72 72 6f 72 2e 0a 23 0a 64 6f 5f 66 69 6c 65 70  rror..#.do_filep
3740: 61 74 68 5f 74 65 73 74 20 31 32 2e 31 20 7b 0a  ath_test 12.1 {.
3750: 20 20 70 61 72 73 65 5f 75 72 69 20 66 69 6c 65    parse_uri file
3760: 3a 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 74 65 73  ://localhost/tes
3770: 74 2e 64 62 3f 61 6e 3d 75 6e 6b 6e 6f 77 6e 26  t.db?an=unknown&
3780: 70 61 72 61 6d 65 74 65 72 3d 69 73 26 6f 6b 3d  parameter=is&ok=
3790: 0a 7d 20 7b 2f 74 65 73 74 2e 64 62 20 7b 61 6e  .} {/test.db {an
37a0: 20 75 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74   unknown paramet
37b0: 65 72 20 69 73 20 6f 6b 20 7b 7d 7d 7d 0a 64 6f  er is ok {}}}.do
37c0: 5f 66 69 6c 65 70 61 74 68 5f 74 65 73 74 20 31  _filepath_test 1
37d0: 32 2e 32 20 7b 0a 20 20 70 61 72 73 65 5f 75 72  2.2 {.  parse_ur
37e0: 69 20 66 69 6c 65 3a 2f 2f 6c 6f 63 61 6c 68 6f  i file://localho
37f0: 73 74 2f 74 65 73 74 2e 64 62 3f 61 6e 26 75 6e  st/test.db?an&un
3800: 6b 6e 6f 77 6e 26 70 61 72 61 6d 65 74 65 72 26  known&parameter&
3810: 69 73 26 6f 6b 0a 7d 20 7b 2f 74 65 73 74 2e 64  is&ok.} {/test.d
3820: 62 20 7b 61 6e 20 7b 7d 20 75 6e 6b 6e 6f 77 6e  b {an {} unknown
3830: 20 7b 7d 20 70 61 72 61 6d 65 74 65 72 20 7b 7d   {} parameter {}
3840: 20 69 73 20 7b 7d 20 6f 6b 20 7b 7d 7d 7d 0a 0a   is {} ok {}}}..
3850: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
3860: 2d 32 37 34 35 38 2d 30 34 30 34 33 20 55 52 49  -27458-04043 URI
3870: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 73 63   hexadecimal esc
3880: 61 70 65 20 73 65 71 75 65 6e 63 65 73 20 28 25  ape sequences (%
3890: 48 48 29 20 61 72 65 0a 23 20 73 75 70 70 6f 72  HH) are.# suppor
38a0: 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 70  ted within the p
38b0: 61 74 68 20 61 6e 64 20 71 75 65 72 79 20 63 6f  ath and query co
38c0: 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 55 52  mponents of a UR
38d0: 49 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  I..#.# EVIDENCE-
38e0: 4f 46 3a 20 52 2d 35 32 37 36 35 2d 35 30 33 36  OF: R-52765-5036
38f0: 38 20 42 65 66 6f 72 65 20 74 68 65 20 70 61 74  8 Before the pat
3900: 68 20 6f 72 20 71 75 65 72 79 20 63 6f 6d 70 6f  h or query compo
3910: 6e 65 6e 74 73 20 6f 66 20 61 0a 23 20 55 52 49  nents of a.# URI
3920: 20 66 69 6c 65 6e 61 6d 65 20 61 72 65 20 69 6e   filename are in
3930: 74 65 72 70 72 65 74 65 64 2c 20 74 68 65 79 20  terpreted, they 
3940: 61 72 65 20 65 6e 63 6f 64 65 64 20 75 73 69 6e  are encoded usin
3950: 67 20 55 54 46 2d 38 20 61 6e 64 20 61 6c 6c 0a  g UTF-8 and all.
3960: 23 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 73  # hexadecimal es
3970: 63 61 70 65 20 73 65 71 75 65 6e 63 65 73 20 72  cape sequences r
3980: 65 70 6c 61 63 65 64 20 62 79 20 61 20 73 69 6e  eplaced by a sin
3990: 67 6c 65 20 62 79 74 65 20 63 6f 6e 74 61 69 6e  gle byte contain
39a0: 69 6e 67 20 74 68 65 0a 23 20 63 6f 72 72 65 73  ing the.# corres
39b0: 70 6f 6e 64 69 6e 67 20 6f 63 74 65 74 2e 0a 23  ponding octet..#
39c0: 0a 23 20 20 20 54 68 65 20 73 65 63 6f 6e 64 20  .#   The second 
39d0: 6f 66 20 74 68 65 20 74 77 6f 20 73 74 61 74 65  of the two state
39e0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 69 73 20 74  ments above is t
39f0: 65 73 74 65 64 20 62 79 20 63 72 65 61 74 69 6e  ested by creatin
3a00: 67 20 61 0a 23 20 20 20 6d 75 6c 74 69 2d 62 79  g a.#   multi-by
3a10: 74 65 20 75 74 66 2d 38 20 63 68 61 72 61 63 74  te utf-8 charact
3a20: 65 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65  er using a seque
3a30: 6e 63 65 20 6f 66 20 25 48 48 20 65 73 63 61 70  nce of %HH escap
3a40: 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  es..#.foreach {t
3a50: 6e 20 75 72 69 20 70 61 72 73 65 7d 20 22 0a 20  n uri parse} ". 
3a60: 20 31 20 20 7b 66 69 6c 65 3a 2f 74 65 73 74 2e   1  {file:/test.
3a70: 25 36 34 25 36 32 7d 20 20 20 20 20 20 20 20 20  %64%62}         
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 7b 2f 74 65 73 74 2e 64 62 20 7b 7d      {/test.db {}
3aa0: 7d 0a 20 20 32 20 20 7b 66 69 6c 65 3a 2f 74 65  }.  2  {file:/te
3ab0: 73 74 2e 64 62 3f 25 36 38 25 36 35 25 36 63 25  st.db?%68%65%6c%
3ac0: 36 63 25 36 66 3d 25 37 37 25 36 66 25 37 32 25  6c%6f=%77%6f%72%
3ad0: 36 63 25 36 34 7d 20 7b 2f 74 65 73 74 2e 64 62  6c%64} {/test.db
3ae0: 20 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 7d 0a   {hello world}}.
3af0: 20 20 33 20 20 7b 66 69 6c 65 3a 2f 25 43 33 25    3  {file:/%C3%
3b00: 42 46 2e 64 62 7d 20 20 20 20 20 20 20 20 20 20  BF.db}          
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 20 20 7b 2f 5c 78 46 46 2e 64 62 20 7b       {/\xFF.db {
3b30: 7d 7d 0a 22 20 7b 0a 20 20 64 6f 5f 66 69 6c 65  }}." {.  do_file
3b40: 70 61 74 68 5f 74 65 73 74 20 31 33 2e 24 74 6e  path_test 13.$tn
3b50: 20 7b 20 70 61 72 73 65 5f 75 72 69 20 24 75 72   { parse_uri $ur
3b60: 69 20 7d 20 24 70 61 72 73 65 0a 7d 0a 0a 66 69  i } $parse.}..fi
3b70: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.