/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 47eeb2960e74613f0f8722b2f13aef08fde69daa16e5380ac93df84dac8b1f72:


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 64 6f 5f 6e 6f 74 5f  ix e_uri.do_not_
01c0: 75 73 65 5f 63 6f 64 65 63 0a 64 62 20 63 6c 6f  use_codec.db clo
01d0: 73 65 0a 0a 70 72 6f 63 20 70 61 72 73 65 5f 75  se..proc parse_u
01e0: 72 69 20 7b 75 72 69 7d 20 7b 0a 20 20 74 65 73  ri {uri} {.  tes
01f0: 74 76 66 73 20 74 76 66 73 32 0a 20 20 74 65 73  tvfs tvfs2.  tes
0200: 74 76 66 73 20 74 76 66 73 20 0a 20 20 74 76 66  tvfs tvfs .  tvf
0210: 73 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 20  s filter xOpen. 
0220: 20 74 76 66 73 20 73 63 72 69 70 74 20 70 61 72   tvfs script par
0230: 73 65 5f 75 72 69 5f 6f 70 65 6e 5f 63 62 0a 0a  se_uri_open_cb..
0240: 20 20 73 65 74 20 3a 3a 75 72 69 5f 6f 70 65 6e    set ::uri_open
0250: 20 5b 6c 69 73 74 5d 0a 20 20 73 65 74 20 44 42   [list].  set DB
0260: 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76   [sqlite3_open_v
0270: 32 20 24 75 72 69 20 7b 0a 20 20 20 20 53 51 4c  2 $uri {.    SQL
0280: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
0290: 54 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE SQLITE_OPEN_C
02a0: 52 45 41 54 45 20 53 51 4c 49 54 45 5f 4f 50 45  REATE SQLITE_OPE
02b0: 4e 5f 57 41 4c 0a 20 20 7d 20 74 76 66 73 5d 0a  N_WAL.  } tvfs].
02c0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
02d0: 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
02e0: 61 6d 65 20 24 44 42 20 6d 61 69 6e 5d 0a 20 20  ame $DB main].  
02f0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 24 44  sqlite3_close $D
0300: 42 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  B.  forcedelete 
0310: 24 66 69 6c 65 4e 61 6d 65 0a 20 20 74 76 66 73  $fileName.  tvfs
0320: 20 64 65 6c 65 74 65 0a 20 20 74 76 66 73 32 20   delete.  tvfs2 
0330: 64 65 6c 65 74 65 0a 0a 20 20 73 65 74 20 3a 3a  delete..  set ::
0340: 75 72 69 5f 6f 70 65 6e 0a 7d 0a 70 72 6f 63 20  uri_open.}.proc 
0350: 70 61 72 73 65 5f 75 72 69 5f 6f 70 65 6e 5f 63  parse_uri_open_c
0360: 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61  b {method file a
0370: 72 67 6c 69 73 74 7d 20 7b 0a 20 20 73 65 74 20  rglist} {.  set 
0380: 3a 3a 75 72 69 5f 6f 70 65 6e 20 5b 6c 69 73 74  ::uri_open [list
0390: 20 24 66 69 6c 65 20 24 61 72 67 6c 69 73 74 5d   $file $arglist]
03a0: 0a 7d 0a 0a 70 72 6f 63 20 6f 70 65 6e 5f 75 72  .}..proc open_ur
03b0: 69 5f 65 72 72 6f 72 20 7b 75 72 69 7d 20 7b 0a  i_error {uri} {.
03c0: 20 20 73 65 74 20 66 6c 61 67 73 20 7b 53 51 4c    set flags {SQL
03d0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
03e0: 54 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE SQLITE_OPEN_C
03f0: 52 45 41 54 45 20 53 51 4c 49 54 45 5f 4f 50 45  REATE SQLITE_OPE
0400: 4e 5f 57 41 4c 7d 0a 20 20 73 65 74 20 44 42 20  N_WAL}.  set DB 
0410: 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32  [sqlite3_open_v2
0420: 20 24 75 72 69 20 24 66 6c 61 67 73 20 22 22 5d   $uri $flags ""]
0430: 0a 20 20 73 65 74 20 65 20 5b 73 71 6c 69 74 65  .  set e [sqlite
0440: 33 5f 65 72 72 6d 73 67 20 24 44 42 5d 0a 20 20  3_errmsg $DB].  
0450: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 24 44  sqlite3_close $D
0460: 42 0a 20 20 73 65 74 20 65 0a 7d 0a 0a 23 20 45  B.  set e.}..# E
0470: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35  VIDENCE-OF: R-35
0480: 38 34 30 2d 33 33 32 30 34 20 49 66 20 55 52 49  840-33204 If URI
0490: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 65 72 70   filename interp
04a0: 72 65 74 61 74 69 6f 6e 20 69 73 20 65 6e 61 62  retation is enab
04b0: 6c 65 64 2c 0a 23 20 61 6e 64 20 74 68 65 20 66  led,.# and the f
04c0: 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
04d0: 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 66 69   begins with "fi
04e0: 6c 65 3a 22 2c 20 74 68 65 6e 20 74 68 65 20 66  le:", then the f
04f0: 69 6c 65 6e 61 6d 65 20 69 73 0a 23 20 69 6e 74  ilename is.# int
0500: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 55 52  erpreted as a UR
0510: 49 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  I..#.# EVIDENCE-
0520: 4f 46 3a 20 52 2d 32 37 36 33 32 2d 32 34 32 30  OF: R-27632-2420
0530: 35 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 69  5 URI filename i
0540: 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 69 73  nterpretation is
0550: 20 65 6e 61 62 6c 65 64 20 69 66 0a 23 20 74 68   enabled if.# th
0560: 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  e SQLITE_OPEN_UR
0570: 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  I flag is set in
0580: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
0590: 65 6e 74 20 74 6f 0a 23 20 73 71 6c 69 74 65 33  ent to.# sqlite3
05a0: 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 6f 72 20 69  _open_v2(), or i
05b0: 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 65 6e  f it has been en
05c0: 61 62 6c 65 64 20 67 6c 6f 62 61 6c 6c 79 20 75  abled globally u
05d0: 73 69 6e 67 20 74 68 65 0a 23 20 53 51 4c 49 54  sing the.# SQLIT
05e0: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 6f 70 74  E_CONFIG_URI opt
05f0: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 71 6c  ion with the sql
0600: 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 6d 65  ite3_config() me
0610: 74 68 6f 64 20 6f 72 20 62 79 20 74 68 65 0a 23  thod or by the.#
0620: 20 53 51 4c 49 54 45 5f 55 53 45 5f 55 52 49 20   SQLITE_USE_URI 
0630: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
0640: 69 6f 6e 2e 0a 23 0a 69 66 20 7b 24 74 63 6c 5f  ion..#.if {$tcl_
0650: 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
0660: 6d 29 20 3d 3d 20 22 75 6e 69 78 22 7d 20 7b 0a  m) == "unix"} {.
0670: 20 20 73 65 74 20 66 6c 61 67 73 20 5b 6c 69 73    set flags [lis
0680: 74 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t SQLITE_OPEN_RE
0690: 41 44 57 52 49 54 45 20 53 51 4c 49 54 45 5f 4f  ADWRITE SQLITE_O
06a0: 50 45 4e 5f 43 52 45 41 54 45 5d 0a 0a 20 20 23  PEN_CREATE]..  #
06b0: 20 54 65 73 74 73 20 77 69 74 68 20 53 51 4c 49   Tests with SQLI
06c0: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 63 6f  TE_CONFIG_URI co
06d0: 6e 66 69 67 75 72 65 64 20 74 6f 20 66 61 6c 73  nfigured to fals
06e0: 65 2e 20 55 52 49 20 69 6e 74 65 70 72 65 74 61  e. URI intepreta
06f0: 74 69 6f 6e 20 69 73 0a 20 20 23 20 6f 6e 6c 79  tion is.  # only
0700: 20 65 6e 61 62 6c 65 64 20 69 66 20 74 68 65 20   enabled if the 
0710: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
0720: 66 6c 61 67 20 69 73 20 73 70 65 63 69 66 69 65  flag is specifie
0730: 64 2e 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75  d..  sqlite3_shu
0740: 74 64 6f 77 6e 0a 20 20 73 71 6c 69 74 65 33 5f  tdown.  sqlite3_
0750: 63 6f 6e 66 69 67 5f 75 72 69 20 30 0a 20 20 64  config_uri 0.  d
0760: 6f 5f 74 65 73 74 20 31 2e 31 20 7b 0a 20 20 20  o_test 1.1 {.   
0770: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 66 69 6c   forcedelete fil
0780: 65 3a 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e:test.db test.d
0790: 62 0a 20 20 20 20 73 65 74 20 44 42 20 5b 73 71  b.    set DB [sq
07a0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 66 69  lite3_open_v2 fi
07b0: 6c 65 3a 74 65 73 74 2e 64 62 20 5b 63 6f 6e 63  le:test.db [conc
07c0: 61 74 20 24 66 6c 61 67 73 20 53 51 4c 49 54 45  at $flags SQLITE
07d0: 5f 4f 50 45 4e 5f 55 52 49 5d 20 22 22 5d 0a 20  _OPEN_URI] ""]. 
07e0: 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78     list [file ex
07f0: 69 73 74 73 20 66 69 6c 65 3a 74 65 73 74 2e 64  ists file:test.d
0800: 62 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  b] [file exists 
0810: 74 65 73 74 2e 64 62 5d 0a 20 20 7d 20 7b 30 20  test.db].  } {0 
0820: 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 32  1}.  do_test 1.2
0830: 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65   {.    forcedele
0840: 74 65 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 32  te file:test.db2
0850: 20 74 65 73 74 2e 64 62 32 0a 20 20 20 20 73 65   test.db2.    se
0860: 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  t STMT [sqlite3_
0870: 70 72 65 70 61 72 65 20 24 44 42 20 22 41 54 54  prepare $DB "ATT
0880: 41 43 48 20 27 66 69 6c 65 3a 74 65 73 74 2e 64  ACH 'file:test.d
0890: 62 32 27 20 41 53 20 61 75 78 22 20 2d 31 20 64  b2' AS aux" -1 d
08a0: 75 6d 6d 79 5d 0a 20 20 20 20 73 71 6c 69 74 65  ummy].    sqlite
08b0: 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 20 20 20  3_step $STMT.   
08c0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
08d0: 65 20 24 53 54 4d 54 0a 20 20 20 20 6c 69 73 74  e $STMT.    list
08e0: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 66 69   [file exists fi
08f0: 6c 65 3a 74 65 73 74 2e 64 62 32 5d 20 5b 66 69  le:test.db2] [fi
0900: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
0910: 62 32 5d 0a 20 20 7d 20 7b 30 20 31 7d 0a 20 20  b2].  } {0 1}.  
0920: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 24 44  sqlite3_close $D
0930: 42 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 33 20  B.  do_test 1.3 
0940: 7b 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74  {.    forcedelet
0950: 65 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 20 74  e file:test.db t
0960: 65 73 74 2e 64 62 0a 20 20 20 20 73 65 74 20 44  est.db.    set D
0970: 42 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  B [sqlite3_open_
0980: 76 32 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 20  v2 file:test.db 
0990: 5b 63 6f 6e 63 61 74 20 24 66 6c 61 67 73 5d 20  [concat $flags] 
09a0: 22 22 5d 0a 20 20 20 20 6c 69 73 74 20 5b 66 69  ""].    list [fi
09b0: 6c 65 20 65 78 69 73 74 73 20 66 69 6c 65 3a 74  le exists file:t
09c0: 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 65 78  est.db] [file ex
09d0: 69 73 74 73 20 74 65 73 74 2e 64 62 5d 0a 20 20  ists test.db].  
09e0: 7d 20 7b 31 20 30 7d 0a 20 20 64 6f 5f 74 65 73  } {1 0}.  do_tes
09f0: 74 20 31 2e 34 20 7b 0a 20 20 20 20 66 6f 72 63  t 1.4 {.    forc
0a00: 65 64 65 6c 65 74 65 20 66 69 6c 65 3a 74 65 73  edelete file:tes
0a10: 74 2e 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20  t.db2 test.db2. 
0a20: 20 20 20 73 65 74 20 53 54 4d 54 20 5b 73 71 6c     set STMT [sql
0a30: 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 44 42  ite3_prepare $DB
0a40: 20 22 41 54 54 41 43 48 20 27 66 69 6c 65 3a 74   "ATTACH 'file:t
0a50: 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 22  est.db2' AS aux"
0a60: 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 20 20 73   -1 dummy].    s
0a70: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 54 4d  qlite3_step $STM
0a80: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  T.    sqlite3_fi
0a90: 6e 61 6c 69 7a 65 20 24 53 54 4d 54 0a 20 20 20  nalize $STMT.   
0aa0: 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73   list [file exis
0ab0: 74 73 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 32  ts file:test.db2
0ac0: 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  ] [file exists t
0ad0: 65 73 74 2e 64 62 32 5d 0a 20 20 7d 20 7b 31 20  est.db2].  } {1 
0ae0: 30 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  0}.  sqlite3_clo
0af0: 73 65 20 24 44 42 0a 0a 20 20 23 20 54 65 73 74  se $DB..  # Test
0b00: 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f 43 4f  s with SQLITE_CO
0b10: 4e 46 49 47 5f 55 52 49 20 63 6f 6e 66 69 67 75  NFIG_URI configu
0b20: 72 65 64 20 74 6f 20 74 72 75 65 2e 20 55 52 49  red to true. URI
0b30: 20 69 6e 74 65 70 72 65 74 61 74 69 6f 6e 20 69   intepretation i
0b40: 73 0a 20 20 23 20 65 6e 61 62 6c 65 64 20 77 69  s.  # enabled wi
0b50: 74 68 20 6f 72 20 77 69 74 68 6f 75 74 20 53 51  th or without SQ
0b60: 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 2e 0a 20  LITE_OPEN_URI.. 
0b70: 20 23 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75   #.  sqlite3_shu
0b80: 74 64 6f 77 6e 0a 20 20 73 71 6c 69 74 65 33 5f  tdown.  sqlite3_
0b90: 63 6f 6e 66 69 67 5f 75 72 69 20 31 0a 20 20 64  config_uri 1.  d
0ba0: 6f 5f 74 65 73 74 20 31 2e 35 20 7b 0a 20 20 20  o_test 1.5 {.   
0bb0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 66 69 6c   forcedelete fil
0bc0: 65 3a 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e:test.db test.d
0bd0: 62 0a 20 20 20 20 73 65 74 20 44 42 20 5b 73 71  b.    set DB [sq
0be0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 66 69  lite3_open_v2 fi
0bf0: 6c 65 3a 74 65 73 74 2e 64 62 20 5b 63 6f 6e 63  le:test.db [conc
0c00: 61 74 20 24 66 6c 61 67 73 20 53 51 4c 49 54 45  at $flags SQLITE
0c10: 5f 4f 50 45 4e 5f 55 52 49 5d 20 22 22 5d 0a 20  _OPEN_URI] ""]. 
0c20: 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78     list [file ex
0c30: 69 73 74 73 20 66 69 6c 65 3a 74 65 73 74 2e 64  ists file:test.d
0c40: 62 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  b] [file exists 
0c50: 74 65 73 74 2e 64 62 5d 0a 20 20 7d 20 7b 30 20  test.db].  } {0 
0c60: 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 36  1}.  do_test 1.6
0c70: 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65   {.    forcedele
0c80: 74 65 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 32  te file:test.db2
0c90: 20 74 65 73 74 2e 64 62 32 0a 20 20 20 20 73 65   test.db2.    se
0ca0: 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  t STMT [sqlite3_
0cb0: 70 72 65 70 61 72 65 20 24 44 42 20 22 41 54 54  prepare $DB "ATT
0cc0: 41 43 48 20 27 66 69 6c 65 3a 74 65 73 74 2e 64  ACH 'file:test.d
0cd0: 62 32 27 20 41 53 20 61 75 78 22 20 2d 31 20 64  b2' AS aux" -1 d
0ce0: 75 6d 6d 79 5d 0a 20 20 20 20 73 71 6c 69 74 65  ummy].    sqlite
0cf0: 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 20 20 20  3_step $STMT.   
0d00: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
0d10: 65 20 24 53 54 4d 54 0a 20 20 20 20 6c 69 73 74  e $STMT.    list
0d20: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 66 69   [file exists fi
0d30: 6c 65 3a 74 65 73 74 2e 64 62 32 5d 20 5b 66 69  le:test.db2] [fi
0d40: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
0d50: 62 32 5d 0a 20 20 7d 20 7b 30 20 31 7d 0a 20 20  b2].  } {0 1}.  
0d60: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 24 44  sqlite3_close $D
0d70: 42 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 37 20  B.  do_test 1.7 
0d80: 7b 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74  {.    forcedelet
0d90: 65 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 20 74  e file:test.db t
0da0: 65 73 74 2e 64 62 0a 20 20 20 20 73 65 74 20 44  est.db.    set D
0db0: 42 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  B [sqlite3_open_
0dc0: 76 32 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 20  v2 file:test.db 
0dd0: 5b 63 6f 6e 63 61 74 20 24 66 6c 61 67 73 5d 20  [concat $flags] 
0de0: 22 22 5d 0a 20 20 20 20 6c 69 73 74 20 5b 66 69  ""].    list [fi
0df0: 6c 65 20 65 78 69 73 74 73 20 66 69 6c 65 3a 74  le exists file:t
0e00: 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 65 78  est.db] [file ex
0e10: 69 73 74 73 20 74 65 73 74 2e 64 62 5d 0a 20 20  ists test.db].  
0e20: 7d 20 7b 30 20 31 7d 0a 20 20 64 6f 5f 74 65 73  } {0 1}.  do_tes
0e30: 74 20 31 2e 38 20 7b 0a 20 20 20 20 66 6f 72 63  t 1.8 {.    forc
0e40: 65 64 65 6c 65 74 65 20 66 69 6c 65 3a 74 65 73  edelete file:tes
0e50: 74 2e 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20  t.db2 test.db2. 
0e60: 20 20 20 73 65 74 20 53 54 4d 54 20 5b 73 71 6c     set STMT [sql
0e70: 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 44 42  ite3_prepare $DB
0e80: 20 22 41 54 54 41 43 48 20 27 66 69 6c 65 3a 74   "ATTACH 'file:t
0e90: 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 22  est.db2' AS aux"
0ea0: 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 20 20 73   -1 dummy].    s
0eb0: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 54 4d  qlite3_step $STM
0ec0: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  T.    sqlite3_fi
0ed0: 6e 61 6c 69 7a 65 20 24 53 54 4d 54 0a 20 20 20  nalize $STMT.   
0ee0: 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73   list [file exis
0ef0: 74 73 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 32  ts file:test.db2
0f00: 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  ] [file exists t
0f10: 65 73 74 2e 64 62 32 5d 0a 20 20 7d 20 7b 30 20  est.db2].  } {0 
0f20: 31 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  1}.  sqlite3_clo
0f30: 73 65 20 24 44 42 0a 7d 0a 0a 23 20 65 6e 73 75  se $DB.}..# ensu
0f40: 72 65 20 75 72 69 20 70 72 6f 63 65 73 73 69 6e  re uri processin
0f50: 67 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  g enabled for th
0f60: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 74 65  e rest of the te
0f70: 73 74 73 0a 73 71 6c 69 74 65 33 5f 73 68 75 74  sts.sqlite3_shut
0f80: 64 6f 77 6e 0a 73 71 6c 69 74 65 33 5f 63 6f 6e  down.sqlite3_con
0f90: 66 69 67 5f 75 72 69 20 31 0a 0a 23 20 45 56 49  fig_uri 1..# EVI
0fa0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 34  DENCE-OF: R-0684
0fb0: 32 2d 30 30 35 39 35 20 49 66 20 74 68 65 20 55  2-00595 If the U
0fc0: 52 49 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 61  RI contains an a
0fd0: 75 74 68 6f 72 69 74 79 2c 20 74 68 65 6e 20 69  uthority, then i
0fe0: 74 0a 23 20 6d 75 73 74 20 62 65 20 65 69 74 68  t.# must be eith
0ff0: 65 72 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  er an empty stri
1000: 6e 67 20 6f 72 20 74 68 65 20 73 74 72 69 6e 67  ng or the string
1010: 20 22 6c 6f 63 61 6c 68 6f 73 74 22 2e 0a 23 0a   "localhost"..#.
1020: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
1030: 2d 31 37 34 38 32 2d 30 30 33 39 38 20 49 66 20  -17482-00398 If 
1040: 74 68 65 20 61 75 74 68 6f 72 69 74 79 20 69 73  the authority is
1050: 20 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73 74   not an empty st
1060: 72 69 6e 67 20 6f 72 0a 23 20 22 6c 6f 63 61 6c  ring or.# "local
1070: 68 6f 73 74 22 2c 20 61 6e 20 65 72 72 6f 72 20  host", an error 
1080: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1090: 68 65 20 63 61 6c 6c 65 72 2e 0a 23 0a 69 66 20  he caller..#.if 
10a0: 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70  {$tcl_platform(p
10b0: 6c 61 74 66 6f 72 6d 29 20 3d 3d 20 22 75 6e 69  latform) == "uni
10c0: 78 22 7d 20 7b 0a 20 20 73 65 74 20 66 6c 61 67  x"} {.  set flag
10d0: 73 20 5b 6c 69 73 74 20 53 51 4c 49 54 45 5f 4f  s [list SQLITE_O
10e0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 53 51  PEN_READWRITE SQ
10f0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1100: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
1110: 5d 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20  ].  foreach {tn 
1120: 75 72 69 20 65 72 72 6f 72 7d 20 22 0a 20 20 20  uri error} ".   
1130: 20 31 20 20 7b 66 69 6c 65 3a 2f 2f 6c 6f 63 61   1  {file://loca
1140: 6c 68 6f 73 74 5b 74 65 73 74 5f 70 77 64 20 2f  lhost[test_pwd /
1150: 5d 74 65 73 74 2e 64 62 7d 20 20 20 7b 6e 6f 74  ]test.db}   {not
1160: 20 61 6e 20 65 72 72 6f 72 7d 0a 20 20 20 20 32   an error}.    2
1170: 20 20 7b 66 69 6c 65 3a 2f 2f 5b 74 65 73 74 5f    {file://[test_
1180: 70 77 64 20 2f 5d 74 65 73 74 2e 64 62 7d 20 20  pwd /]test.db}  
1190: 20 20 20 20 20 20 20 20 20 20 7b 6e 6f 74 20 61            {not a
11a0: 6e 20 65 72 72 6f 72 7d 0a 20 20 20 20 33 20 20  n error}.    3  
11b0: 7b 66 69 6c 65 3a 2f 2f 78 5b 74 65 73 74 5f 70  {file://x[test_p
11c0: 77 64 20 2f 5d 74 65 73 74 2e 64 62 7d 20 20 20  wd /]test.db}   
11d0: 20 20 20 20 20 20 20 20 7b 69 6e 76 61 6c 69 64          {invalid
11e0: 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
11f0: 78 7d 0a 20 20 20 20 34 20 20 7b 66 69 6c 65 3a  x}.    4  {file:
1200: 2f 2f 69 6e 76 61 6c 69 64 5b 74 65 73 74 5f 70  //invalid[test_p
1210: 77 64 20 2f 5d 74 65 73 74 2e 64 62 7d 20 20 20  wd /]test.db}   
1220: 20 20 7b 69 6e 76 61 6c 69 64 20 75 72 69 20 61    {invalid uri a
1230: 75 74 68 6f 72 69 74 79 3a 20 69 6e 76 61 6c 69  uthority: invali
1240: 64 7d 0a 20 20 22 20 7b 0a 20 20 20 20 64 6f 5f  d}.  " {.    do_
1250: 74 65 73 74 20 32 2e 24 74 6e 20 7b 0a 20 20 20  test 2.$tn {.   
1260: 20 20 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74     set DB [sqlit
1270: 65 33 5f 6f 70 65 6e 5f 76 32 20 24 75 72 69 20  e3_open_v2 $uri 
1280: 24 66 6c 61 67 73 20 22 22 5d 0a 20 20 20 20 20  $flags ""].     
1290: 20 73 65 74 20 65 20 5b 73 71 6c 69 74 65 33 5f   set e [sqlite3_
12a0: 65 72 72 6d 73 67 20 24 44 42 5d 0a 20 20 20 20  errmsg $DB].    
12b0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20    sqlite3_close 
12c0: 24 44 42 0a 20 20 20 20 20 20 73 65 74 20 65 0a  $DB.      set e.
12d0: 20 20 20 20 7d 20 24 65 72 72 6f 72 0a 20 20 7d      } $error.  }
12e0: 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
12f0: 46 3a 20 52 2d 34 35 39 38 31 2d 32 35 35 32 38  F: R-45981-25528
1300: 20 54 68 65 20 66 72 61 67 6d 65 6e 74 20 63 6f   The fragment co
1310: 6d 70 6f 6e 65 6e 74 20 6f 66 20 61 20 55 52 49  mponent of a URI
1320: 2c 20 69 66 0a 23 20 70 72 65 73 65 6e 74 2c 20  , if.# present, 
1330: 69 73 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 23 20  is ignored..#.# 
1340: 20 20 49 74 20 69 73 20 64 69 66 66 69 63 75 6c    It is difficul
1350: 74 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 73  t to test that s
1360: 6f 6d 65 74 68 69 6e 67 20 69 73 20 69 67 6e 6f  omething is igno
1370: 72 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 53  red correctly. S
1380: 6f 20 74 68 65 73 65 20 74 65 73 74 73 0a 23 20  o these tests.# 
1390: 20 20 6a 75 73 74 20 73 68 6f 77 20 74 68 61 74    just show that
13a0: 20 61 64 64 69 6e 67 20 61 20 66 72 61 67 6d 65   adding a fragme
13b0: 6e 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 74 65  nt does not inte
13c0: 72 66 65 72 65 20 77 69 74 68 20 74 68 65 20 70  rfere with the p
13d0: 61 74 68 6e 61 6d 65 20 6f 72 0a 23 20 20 20 70  athname or.#   p
13e0: 61 72 61 6d 65 74 65 72 73 20 70 61 73 73 65 64  arameters passed
13f0: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
1400: 56 46 53 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  VFS xOpen() meth
1410: 6f 64 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ods..#.foreach {
1420: 74 6e 20 75 72 69 20 70 61 72 73 65 7d 20 22 0a  tn uri parse} ".
1430: 20 20 31 20 20 20 20 7b 66 69 6c 65 3a 74 65 73    1    {file:tes
1440: 74 2e 64 62 23 61 62 63 7d 20 20 20 20 20 20 7b  t.db#abc}      {
1450: 5b 74 65 73 74 5f 70 77 64 20 2f 20 7b 7d 5d 74  [test_pwd / {}]t
1460: 65 73 74 2e 64 62 20 7b 7d 7d 0a 20 20 32 20 20  est.db {}}.  2  
1470: 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f    {file:test.db?
1480: 61 3d 62 23 61 62 63 7d 20 20 7b 5b 74 65 73 74  a=b#abc}  {[test
1490: 5f 70 77 64 20 2f 20 7b 7d 5d 74 65 73 74 2e 64  _pwd / {}]test.d
14a0: 62 20 7b 61 20 62 7d 7d 0a 20 20 33 20 20 20 20  b {a b}}.  3    
14b0: 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 61 3d  {file:test.db?a=
14c0: 62 23 3f 63 3d 64 7d 20 7b 5b 74 65 73 74 5f 70  b#?c=d} {[test_p
14d0: 77 64 20 2f 20 7b 7d 5d 74 65 73 74 2e 64 62 20  wd / {}]test.db 
14e0: 7b 61 20 62 7d 7d 0a 22 20 7b 0a 20 20 64 6f 5f  {a b}}." {.  do_
14f0: 66 69 6c 65 70 61 74 68 5f 74 65 73 74 20 33 2e  filepath_test 3.
1500: 24 74 6e 20 7b 20 70 61 72 73 65 5f 75 72 69 20  $tn { parse_uri 
1510: 24 75 72 69 20 7d 20 24 70 61 72 73 65 0a 7d 0a  $uri } $parse.}.
1520: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
1530: 52 2d 36 32 35 35 37 2d 30 39 33 39 30 20 53 51  R-62557-09390 SQ
1540: 4c 69 74 65 20 75 73 65 73 20 74 68 65 20 70 61  Lite uses the pa
1550: 74 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  th component of 
1560: 74 68 65 20 55 52 49 0a 23 20 61 73 20 74 68 65  the URI.# as the
1570: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 73   name of the dis
1580: 6b 20 66 69 6c 65 20 77 68 69 63 68 20 63 6f 6e  k file which con
1590: 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
15a0: 73 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  se..#.# EVIDENCE
15b0: 2d 4f 46 3a 20 52 2d 32 38 36 35 39 2d 31 31 30  -OF: R-28659-110
15c0: 33 35 20 49 66 20 74 68 65 20 70 61 74 68 20 62  35 If the path b
15d0: 65 67 69 6e 73 20 77 69 74 68 20 61 20 27 2f 27  egins with a '/'
15e0: 20 63 68 61 72 61 63 74 65 72 2c 0a 23 20 74 68   character,.# th
15f0: 65 6e 20 69 74 20 69 73 20 69 6e 74 65 72 70 72  en it is interpr
1600: 65 74 65 64 20 61 73 20 61 6e 20 61 62 73 6f 6c  eted as an absol
1610: 75 74 65 20 70 61 74 68 2e 0a 23 0a 23 20 45 56  ute path..#.# EV
1620: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 36 32  IDENCE-OF: R-462
1630: 33 34 2d 36 31 33 32 33 20 49 66 20 74 68 65 20  34-61323 If the 
1640: 70 61 74 68 20 64 6f 65 73 20 6e 6f 74 20 62 65  path does not be
1650: 67 69 6e 20 77 69 74 68 20 61 20 27 2f 27 0a 23  gin with a '/'.#
1660: 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74   (meaning that t
1670: 68 65 20 61 75 74 68 6f 72 69 74 79 20 73 65 63  he authority sec
1680: 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64 20  tion is omitted 
1690: 66 72 6f 6d 20 74 68 65 20 55 52 49 29 20 74 68  from the URI) th
16a0: 65 6e 20 74 68 65 0a 23 20 70 61 74 68 20 69 73  en the.# path is
16b0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
16c0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2e  a relative path.
16d0: 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 75  .#.foreach {tn u
16e0: 72 69 20 70 61 72 73 65 7d 20 22 0a 20 20 31 20  ri parse} ".  1 
16f0: 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62     {file:test.db
1700: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 5b  }             {[
1710: 74 65 73 74 5f 70 77 64 20 2f 20 7b 7d 5d 74 65  test_pwd / {}]te
1720: 73 74 2e 64 62 20 7b 7d 7d 0a 20 20 32 20 20 20  st.db {}}.  2   
1730: 20 7b 66 69 6c 65 3a 2f 74 65 73 74 2e 64 62 7d   {file:/test.db}
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7b 2f 74 65              {/te
1750: 73 74 2e 64 62 20 7b 7d 7d 0a 20 20 33 20 20 20  st.db {}}.  3   
1760: 20 7b 66 69 6c 65 3a 2f 2f 2f 74 65 73 74 2e 64   {file:///test.d
1770: 62 7d 20 20 20 20 20 20 20 20 20 20 7b 2f 74 65  b}          {/te
1780: 73 74 2e 64 62 20 7b 7d 7d 0a 20 20 34 20 20 20  st.db {}}.  4   
1790: 20 7b 66 69 6c 65 3a 2f 2f 6c 6f 63 61 6c 68 6f   {file://localho
17a0: 73 74 2f 74 65 73 74 2e 64 62 7d 20 7b 2f 74 65  st/test.db} {/te
17b0: 73 74 2e 64 62 20 7b 7d 7d 0a 20 20 35 20 20 20  st.db {}}.  5   
17c0: 20 7b 66 69 6c 65 3a 2f 61 2f 62 2f 63 2f 74 65   {file:/a/b/c/te
17d0: 73 74 2e 64 62 7d 20 20 20 20 20 20 7b 2f 61 2f  st.db}      {/a/
17e0: 62 2f 63 2f 74 65 73 74 2e 64 62 20 7b 7d 7d 0a  b/c/test.db {}}.
17f0: 22 20 7b 0a 20 20 64 6f 5f 66 69 6c 65 70 61 74  " {.  do_filepat
1800: 68 5f 74 65 73 74 20 34 2e 24 74 6e 20 7b 20 70  h_test 4.$tn { p
1810: 61 72 73 65 5f 75 72 69 20 24 75 72 69 20 7d 20  arse_uri $uri } 
1820: 24 70 61 72 73 65 0a 7d 0a 0a 23 20 45 56 49 44  $parse.}..# EVID
1830: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 36 31 32  ENCE-OF: R-01612
1840: 2d 33 30 38 37 37 20 54 68 65 20 22 76 66 73 22  -30877 The "vfs"
1850: 20 70 61 72 61 6d 65 74 65 72 20 6d 61 79 20 62   parameter may b
1860: 65 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  e used to specif
1870: 79 0a 23 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  y.# the name of 
1880: 61 20 56 46 53 20 6f 62 6a 65 63 74 20 74 68 61  a VFS object tha
1890: 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 6f  t provides the o
18a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
18b0: 69 6e 74 65 72 66 61 63 65 0a 23 20 74 68 61 74  interface.# that
18c0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
18d0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
18e0: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
18f0: 69 73 6b 2e 0a 23 0a 23 20 20 20 54 68 65 20 61  isk..#.#   The a
1900: 62 6f 76 65 20 69 73 20 74 65 73 74 65 64 20 62  bove is tested b
1910: 79 20 63 61 73 65 73 20 31 2e 2a 20 62 65 6c 6f  y cases 1.* belo
1920: 77 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  w..#.# EVIDENCE-
1930: 4f 46 3a 20 52 2d 35 32 32 39 33 2d 35 38 34 39  OF: R-52293-5849
1940: 37 20 49 66 20 74 68 69 73 20 6f 70 74 69 6f 6e  7 If this option
1950: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 65 6d   is set to an em
1960: 70 74 79 20 73 74 72 69 6e 67 0a 23 20 74 68 65  pty string.# the
1970: 20 64 65 66 61 75 6c 74 20 56 46 53 20 6f 62 6a   default VFS obj
1980: 65 63 74 20 69 73 20 75 73 65 64 2e 0a 23 0a 23  ect is used..#.#
1990: 20 20 20 54 68 65 20 61 62 6f 76 65 20 69 73 20     The above is 
19a0: 74 65 73 74 65 64 20 62 79 20 63 61 73 65 73 20  tested by cases 
19b0: 32 2e 2a 20 62 65 6c 6f 77 2e 0a 23 0a 23 20 45  2.* below..#.# E
19c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
19d0: 38 35 35 2d 31 38 36 36 35 20 49 66 20 73 71 6c  855-18665 If sql
19e0: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 69  ite3_open_v2() i
19f0: 73 20 75 73 65 64 20 61 6e 64 20 74 68 65 20 76  s used and the v
1a00: 66 73 0a 23 20 6f 70 74 69 6f 6e 20 69 73 20 70  fs.# option is p
1a10: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
1a20: 20 56 46 53 20 73 70 65 63 69 66 69 65 64 20 62   VFS specified b
1a30: 79 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 61 6b  y the option tak
1a40: 65 73 0a 23 20 70 72 65 63 65 64 65 6e 63 65 20  es.# precedence 
1a50: 6f 76 65 72 20 74 68 65 20 76 61 6c 75 65 20 70  over the value p
1a60: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 6f 75  assed as the fou
1a70: 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rth parameter to
1a80: 0a 23 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  .# sqlite3_open_
1a90: 76 32 28 29 2e 0a 23 0a 23 20 20 20 54 68 65 20  v2()..#.#   The 
1aa0: 61 62 6f 76 65 20 69 73 20 74 65 73 74 65 64 20  above is tested 
1ab0: 62 79 20 63 61 73 65 73 20 33 2e 2a 20 62 65 6c  by cases 3.* bel
1ac0: 6f 77 2e 0a 23 0a 70 72 6f 63 20 76 66 73 5f 6f  ow..#.proc vfs_o
1ad0: 70 65 6e 5f 63 62 20 7b 6e 61 6d 65 20 61 72 67  pen_cb {name arg
1ae0: 73 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 76 66 73  s} {.  set ::vfs
1af0: 20 24 6e 61 6d 65 0a 7d 0a 66 6f 72 65 61 63 68   $name.}.foreach
1b00: 20 7b 6e 61 6d 65 20 64 65 66 61 75 6c 74 7d 20   {name default} 
1b10: 7b 76 66 73 31 20 30 20 76 66 73 32 20 30 20 76  {vfs1 0 vfs2 0 v
1b20: 66 73 33 20 31 7d 20 7b 0a 20 20 74 65 73 74 76  fs3 1} {.  testv
1b30: 66 73 20 24 6e 61 6d 65 20 2d 64 65 66 61 75 6c  fs $name -defaul
1b40: 74 20 24 64 65 66 61 75 6c 74 0a 20 20 24 6e 61  t $default.  $na
1b50: 6d 65 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a  me filter xOpen.
1b60: 20 20 24 6e 61 6d 65 20 73 63 72 69 70 74 20 5b    $name script [
1b70: 6c 69 73 74 20 76 66 73 5f 6f 70 65 6e 5f 63 62  list vfs_open_cb
1b80: 20 24 6e 61 6d 65 5d 0a 7d 0a 66 6f 72 65 61 63   $name].}.foreac
1b90: 68 20 7b 74 6e 20 75 72 69 20 64 65 66 76 66 73  h {tn uri defvfs
1ba0: 20 76 66 73 7d 20 7b 0a 20 20 31 2e 31 20 20 20   vfs} {.  1.1   
1bb0: 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 76   "file:test.db?v
1bc0: 66 73 3d 76 66 73 31 22 20 20 20 20 22 22 20 20  fs=vfs1"    ""  
1bd0: 20 20 76 66 73 31 0a 20 20 31 2e 32 20 20 20 20    vfs1.  1.2    
1be0: 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 76 66  "file:test.db?vf
1bf0: 73 3d 76 66 73 32 22 20 20 20 20 22 22 20 20 20  s=vfs2"    ""   
1c00: 20 76 66 73 32 0a 0a 20 20 32 2e 31 20 20 20 20   vfs2..  2.1    
1c10: 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 22 20 20  "file:test.db"  
1c20: 20 20 20 20 20 20 20 20 20 20 20 76 66 73 31 20             vfs1 
1c30: 20 76 66 73 31 0a 20 20 32 2e 32 20 20 20 20 22   vfs1.  2.2    "
1c40: 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 76 66 73  file:test.db?vfs
1c50: 3d 22 20 20 20 20 20 20 20 20 76 66 73 31 20 20  ="        vfs1  
1c60: 76 66 73 33 0a 0a 20 20 33 2e 31 20 20 20 20 22  vfs3..  3.1    "
1c70: 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 76 66 73  file:test.db?vfs
1c80: 3d 76 66 73 31 22 20 20 20 20 76 66 73 32 20 20  =vfs1"    vfs2  
1c90: 76 66 73 31 0a 20 20 33 2e 32 20 20 20 20 22 66  vfs1.  3.2    "f
1ca0: 69 6c 65 3a 74 65 73 74 2e 64 62 3f 76 66 73 3d  ile:test.db?vfs=
1cb0: 76 66 73 32 22 20 20 20 20 76 66 73 31 20 20 76  vfs2"    vfs1  v
1cc0: 66 73 32 0a 20 20 33 2e 33 20 20 20 20 22 66 69  fs2.  3.3    "fi
1cd0: 6c 65 3a 74 65 73 74 2e 64 62 3f 78 76 66 73 3d  le:test.db?xvfs=
1ce0: 76 66 73 31 22 20 20 20 76 66 73 32 20 20 76 66  vfs1"   vfs2  vf
1cf0: 73 32 0a 20 20 33 2e 34 20 20 20 20 22 66 69 6c  s2.  3.4    "fil
1d00: 65 3a 74 65 73 74 2e 64 62 3f 78 76 66 73 3d 76  e:test.db?xvfs=v
1d10: 66 73 32 22 20 20 20 76 66 73 31 20 20 76 66 73  fs2"   vfs1  vfs
1d20: 31 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  1.} {.  do_test 
1d30: 35 2e 24 74 6e 20 7b 0a 20 20 20 20 73 65 74 20  5.$tn {.    set 
1d40: 66 6c 61 67 73 20 5b 6c 69 73 74 20 53 51 4c 49  flags [list SQLI
1d50: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1d60: 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E SQLITE_OPEN_CR
1d70: 45 41 54 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e  EATE SQLITE_OPEN
1d80: 5f 55 52 49 5d 0a 20 20 20 20 73 71 6c 69 74 65  _URI].    sqlite
1d90: 33 5f 63 6c 6f 73 65 20 5b 0a 20 20 20 20 20 20  3_close [.      
1da0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20  sqlite3_open_v2 
1db0: 24 75 72 69 20 24 66 6c 61 67 73 20 24 64 65 66  $uri $flags $def
1dc0: 76 66 73 0a 20 20 20 20 5d 0a 20 20 20 20 73 65  vfs.    ].    se
1dd0: 74 20 3a 3a 76 66 73 0a 20 20 7d 20 24 76 66 73  t ::vfs.  } $vfs
1de0: 0a 7d 0a 76 66 73 31 20 64 65 6c 65 74 65 0a 76  .}.vfs1 delete.v
1df0: 66 73 32 20 64 65 6c 65 74 65 0a 76 66 73 33 20  fs2 delete.vfs3 
1e00: 64 65 6c 65 74 65 0a 0a 23 20 45 56 49 44 45 4e  delete..# EVIDEN
1e10: 43 45 2d 4f 46 3a 20 52 2d 34 38 33 36 35 2d 33  CE-OF: R-48365-3
1e20: 36 33 30 38 20 53 70 65 63 69 66 79 69 6e 67 20  6308 Specifying 
1e30: 61 6e 20 75 6e 6b 6e 6f 77 6e 20 56 46 53 20 69  an unknown VFS i
1e40: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 73 65  s an error..#.se
1e50: 74 20 66 6c 61 67 73 20 5b 6c 69 73 74 20 53 51  t flags [list SQ
1e60: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1e70: 49 54 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE SQLITE_OPEN_
1e80: 43 52 45 41 54 45 20 53 51 4c 49 54 45 5f 4f 50  CREATE SQLITE_OP
1e90: 45 4e 5f 55 52 49 5d 0a 64 6f 5f 74 65 73 74 20  EN_URI].do_test 
1ea0: 36 2e 31 20 7b 0a 20 20 73 65 74 20 44 42 20 5b  6.1 {.  set DB [
1eb0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20  sqlite3_open_v2 
1ec0: 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 76 66 73  file:test.db?vfs
1ed0: 3d 6e 6f 73 75 63 68 76 66 73 20 24 66 6c 61 67  =nosuchvfs $flag
1ee0: 73 20 22 22 5d 0a 20 20 73 65 74 20 65 72 72 6d  s ""].  set errm
1ef0: 73 67 20 5b 73 71 6c 69 74 65 33 5f 65 72 72 6d  sg [sqlite3_errm
1f00: 73 67 20 24 44 42 5d 0a 20 20 73 71 6c 69 74 65  sg $DB].  sqlite
1f10: 33 5f 63 6c 6f 73 65 20 24 44 42 0a 20 20 73 65  3_close $DB.  se
1f20: 74 20 65 72 72 6d 73 67 0a 7d 20 7b 6e 6f 20 73  t errmsg.} {no s
1f30: 75 63 68 20 76 66 73 3a 20 6e 6f 73 75 63 68 76  uch vfs: nosuchv
1f40: 66 73 7d 0a 0a 0a 23 20 45 56 49 44 45 4e 43 45  fs}...# EVIDENCE
1f50: 2d 4f 46 3a 20 52 2d 34 34 30 31 33 2d 31 33 31  -OF: R-44013-131
1f60: 30 32 20 54 68 65 20 6d 6f 64 65 20 70 61 72 61  02 The mode para
1f70: 6d 65 74 65 72 20 6d 61 79 20 62 65 20 73 65 74  meter may be set
1f80: 20 74 6f 20 65 69 74 68 65 72 0a 23 20 22 72 6f   to either.# "ro
1f90: 22 2c 20 22 72 77 22 2c 20 22 72 77 63 22 2c 20  ", "rw", "rwc", 
1fa0: 6f 72 20 22 6d 65 6d 6f 72 79 22 2e 20 41 74 74  or "memory". Att
1fb0: 65 6d 70 74 69 6e 67 20 74 6f 20 73 65 74 20 69  empting to set i
1fc0: 74 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 0a 23  t to any other.#
1fd0: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72   value is an err
1fe0: 6f 72 0a 23 0a 73 71 6c 69 74 65 33 20 64 62 20  or.#.sqlite3 db 
1ff0: 74 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f 73 65  test.db.db close
2000: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 75 72 69  .foreach {tn uri
2010: 20 65 72 72 6f 72 7d 20 22 0a 20 20 31 20 20 20   error} ".  1   
2020: 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d   {file:test.db?m
2030: 6f 64 65 3d 72 6f 7d 20 20 20 20 7b 6e 6f 74 20  ode=ro}    {not 
2040: 61 6e 20 65 72 72 6f 72 7d 0a 20 20 32 20 20 20  an error}.  2   
2050: 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d   {file:test.db?m
2060: 6f 64 65 3d 72 77 7d 20 20 20 20 7b 6e 6f 74 20  ode=rw}    {not 
2070: 61 6e 20 65 72 72 6f 72 7d 0a 20 20 33 20 20 20  an error}.  3   
2080: 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d   {file:test.db?m
2090: 6f 64 65 3d 72 77 63 7d 20 20 20 7b 6e 6f 74 20  ode=rwc}   {not 
20a0: 61 6e 20 65 72 72 6f 72 7d 0a 20 20 34 20 20 20  an error}.  4   
20b0: 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d   {file:test.db?m
20c0: 6f 64 65 3d 52 6f 7d 20 20 20 20 7b 6e 6f 20 73  ode=Ro}    {no s
20d0: 75 63 68 20 61 63 63 65 73 73 20 6d 6f 64 65 3a  uch access mode:
20e0: 20 52 6f 7d 0a 20 20 35 20 20 20 20 7b 66 69 6c   Ro}.  5    {fil
20f0: 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d 52  e:test.db?mode=R
2100: 77 7d 20 20 20 20 7b 6e 6f 20 73 75 63 68 20 61  w}    {no such a
2110: 63 63 65 73 73 20 6d 6f 64 65 3a 20 52 77 7d 0a  ccess mode: Rw}.
2120: 20 20 36 20 20 20 20 7b 66 69 6c 65 3a 74 65 73    6    {file:tes
2130: 74 2e 64 62 3f 6d 6f 64 65 3d 52 77 63 7d 20 20  t.db?mode=Rwc}  
2140: 20 7b 6e 6f 20 73 75 63 68 20 61 63 63 65 73 73   {no such access
2150: 20 6d 6f 64 65 3a 20 52 77 63 7d 0a 20 20 37 20   mode: Rwc}.  7 
2160: 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62     {file:test.db
2170: 3f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 7d 20 7b 6e  ?mode=memory} {n
2180: 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a 20 20 38  ot an error}.  8
2190: 20 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64      {file:test.d
21a0: 62 3f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 7d 20 7b  b?mode=MEMORY} {
21b0: 6e 6f 20 73 75 63 68 20 61 63 63 65 73 73 20 6d  no such access m
21c0: 6f 64 65 3a 20 4d 45 4d 4f 52 59 7d 0a 22 20 7b  ode: MEMORY}." {
21d0: 0a 20 20 64 6f 5f 74 65 73 74 20 37 2e 24 74 6e  .  do_test 7.$tn
21e0: 20 7b 20 6f 70 65 6e 5f 75 72 69 5f 65 72 72 6f   { open_uri_erro
21f0: 72 20 24 75 72 69 20 7d 20 24 65 72 72 6f 72 0a  r $uri } $error.
2200: 7d 0a 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  }...# EVIDENCE-O
2210: 46 3a 20 52 2d 34 33 30 33 36 2d 34 36 37 35 36  F: R-43036-46756
2220: 20 49 66 20 22 72 6f 22 20 69 73 20 73 70 65 63   If "ro" is spec
2230: 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ified, then the 
2240: 64 61 74 61 62 61 73 65 20 69 73 0a 23 20 6f 70  database is.# op
2250: 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2d 6f 6e  ened for read-on
2260: 6c 79 20 61 63 63 65 73 73 2c 20 6a 75 73 74 20  ly access, just 
2270: 61 73 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  as if the SQLITE
2280: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 66  _OPEN_READONLY f
2290: 6c 61 67 0a 23 20 68 61 64 20 62 65 65 6e 20 73  lag.# had been s
22a0: 65 74 20 69 6e 20 74 68 65 20 74 68 69 72 64 20  et in the third 
22b0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
22c0: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e 0a 23  te3_open_v2()..#
22d0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
22e0: 52 2d 34 30 31 33 37 2d 32 36 30 35 30 20 49 66  R-40137-26050 If
22f0: 20 74 68 65 20 6d 6f 64 65 20 6f 70 74 69 6f 6e   the mode option
2300: 20 69 73 20 73 65 74 20 74 6f 20 22 72 77 22 2c   is set to "rw",
2310: 20 74 68 65 6e 20 74 68 65 0a 23 20 64 61 74 61   then the.# data
2320: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66  base is opened f
2330: 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 28 62  or read-write (b
2340: 75 74 20 6e 6f 74 20 63 72 65 61 74 65 29 20 61  ut not create) a
2350: 63 63 65 73 73 2c 20 61 73 20 69 66 0a 23 20 53  ccess, as if.# S
2360: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2370: 52 49 54 45 20 28 62 75 74 20 6e 6f 74 20 53 51  RITE (but not SQ
2380: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2390: 29 20 68 61 64 20 62 65 65 6e 20 73 65 74 2e 0a  ) had been set..
23a0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
23b0: 20 52 2d 32 36 38 34 35 2d 33 32 39 37 36 20 56   R-26845-32976 V
23c0: 61 6c 75 65 20 22 72 77 63 22 20 69 73 20 65 71  alue "rwc" is eq
23d0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 73 65 74 74  uivalent to sett
23e0: 69 6e 67 20 62 6f 74 68 0a 23 20 53 51 4c 49 54  ing both.# SQLIT
23f0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2400: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e   and SQLITE_OPEN
2410: 5f 43 52 45 41 54 45 2e 0a 23 0a 66 6f 72 65 61  _CREATE..#.forea
2420: 63 68 20 7b 74 6e 20 75 72 69 20 72 65 61 64 20  ch {tn uri read 
2430: 77 72 69 74 65 20 63 72 65 61 74 65 7d 20 7b 0a  write create} {.
2440: 20 20 31 20 20 20 20 7b 66 69 6c 65 3a 74 65 73    1    {file:tes
2450: 74 2e 64 62 3f 6d 6f 64 65 3d 72 6f 7d 20 20 20  t.db?mode=ro}   
2460: 20 20 31 20 30 20 30 0a 20 20 32 20 20 20 20 7b    1 0 0.  2    {
2470: 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64  file:test.db?mod
2480: 65 3d 72 77 7d 20 20 20 20 20 31 20 31 20 30 0a  e=rw}     1 1 0.
2490: 20 20 33 20 20 20 20 7b 66 69 6c 65 3a 74 65 73    3    {file:tes
24a0: 74 2e 64 62 3f 6d 6f 64 65 3d 72 77 63 7d 20 20  t.db?mode=rwc}  
24b0: 20 20 31 20 31 20 31 0a 7d 20 7b 0a 20 20 73 65    1 1 1.} {.  se
24c0: 74 20 52 45 53 28 63 2c 30 29 20 7b 31 20 7b 75  t RES(c,0) {1 {u
24d0: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
24e0: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
24f0: 73 65 74 20 52 45 53 28 63 2c 31 29 20 7b 30 20  set RES(c,1) {0 
2500: 7b 7d 7d 0a 20 20 73 65 74 20 52 45 53 28 77 2c  {}}.  set RES(w,
2510: 30 29 20 7b 31 20 7b 61 74 74 65 6d 70 74 20 74  0) {1 {attempt t
2520: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
2530: 6c 79 20 64 61 74 61 62 61 73 65 7d 7d 0a 20 20  ly database}}.  
2540: 73 65 74 20 52 45 53 28 77 2c 31 29 20 7b 30 20  set RES(w,1) {0 
2550: 7b 7d 7d 0a 20 20 73 65 74 20 52 45 53 28 72 2c  {}}.  set RES(r,
2560: 30 29 20 7b 31 20 7b 74 68 69 73 20 6e 65 76 65  0) {1 {this neve
2570: 72 20 68 61 70 70 65 6e 73 7d 7d 0a 20 20 73 65  r happens}}.  se
2580: 74 20 52 45 53 28 72 2c 31 29 20 7b 30 20 7b 61  t RES(r,1) {0 {a
2590: 20 62 7d 7d 0a 0a 20 20 23 20 54 65 73 74 20 43   b}}..  # Test C
25a0: 52 45 41 54 45 20 61 63 63 65 73 73 3a 0a 20 20  REATE access:.  
25b0: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
25c0: 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 38 2e  .db.  do_test 8.
25d0: 24 74 6e 2e 63 20 7b 20 6c 69 73 74 20 5b 63 61  $tn.c { list [ca
25e0: 74 63 68 20 7b 20 73 71 6c 69 74 65 33 20 64 62  tch { sqlite3 db
25f0: 20 24 75 72 69 20 7d 20 6d 73 67 5d 20 24 6d 73   $uri } msg] $ms
2600: 67 20 7d 20 24 52 45 53 28 63 2c 24 63 72 65 61  g } $RES(c,$crea
2610: 74 65 29 0a 20 20 63 61 74 63 68 20 7b 20 64 62  te).  catch { db
2620: 20 63 6c 6f 73 65 20 7d 0a 0a 20 20 73 71 6c 69   close }..  sqli
2630: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
2640: 20 64 62 20 65 76 61 6c 20 7b 20 43 52 45 41 54   db eval { CREAT
2650: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
2660: 20 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   ; INSERT INTO t
2670: 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  1 VALUES('a', 'b
2680: 27 29 20 3b 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ') ;}.  db close
2690: 0a 20 20 0a 20 20 23 20 54 65 73 74 20 52 45 41  .  .  # Test REA
26a0: 44 20 61 63 63 65 73 73 3a 0a 20 20 64 6f 5f 74  D access:.  do_t
26b0: 65 73 74 20 38 2e 24 74 6e 2e 72 20 7b 20 0a 20  est 8.$tn.r { . 
26c0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 24 75     sqlite3 db $u
26d0: 72 69 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  ri.    catchsql 
26e0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
26f0: 74 31 20 7d 0a 20 20 7d 20 24 52 45 53 28 72 2c  t1 }.  } $RES(r,
2700: 24 72 65 61 64 29 0a 20 20 0a 20 20 23 20 54 65  $read).  .  # Te
2710: 73 74 20 57 52 49 54 45 20 61 63 63 65 73 73 3a  st WRITE access:
2720: 0a 20 20 64 6f 5f 74 65 73 74 20 38 2e 24 74 6e  .  do_test 8.$tn
2730: 2e 77 20 7b 20 0a 20 20 20 20 73 71 6c 69 74 65  .w { .    sqlite
2740: 33 20 64 62 20 24 75 72 69 0a 20 20 20 20 63 61  3 db $uri.    ca
2750: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
2760: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
2770: 2c 20 32 29 20 7d 0a 20 20 7d 20 24 52 45 53 28  , 2) }.  } $RES(
2780: 77 2c 24 77 72 69 74 65 29 0a 0a 20 20 63 61 74  w,$write)..  cat
2790: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 7d 0a  ch {db close}.}.
27a0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
27b0: 52 2d 32 30 35 39 30 2d 30 38 37 32 36 20 49 74  R-20590-08726 It
27c0: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   is an error to 
27d0: 73 70 65 63 69 66 79 20 61 20 76 61 6c 75 65 20  specify a value 
27e0: 66 6f 72 20 74 68 65 0a 23 20 6d 6f 64 65 20 70  for the.# mode p
27f0: 61 72 61 6d 65 74 65 72 20 74 68 61 74 20 69 73  arameter that is
2800: 20 6c 65 73 73 20 72 65 73 74 72 69 63 74 69 76   less restrictiv
2810: 65 20 74 68 61 6e 20 74 68 61 74 20 73 70 65 63  e than that spec
2820: 69 66 69 65 64 20 62 79 20 74 68 65 0a 23 20 66  ified by the.# f
2830: 6c 61 67 73 20 70 61 73 73 65 64 20 69 6e 20 74  lags passed in t
2840: 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74  he third paramet
2850: 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 6f 70  er to sqlite3_op
2860: 65 6e 5f 76 32 28 29 2e 0a 23 0a 66 6f 72 63 65  en_v2()..#.force
2870: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73  delete test.db.s
2880: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
2890: 62 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 65 61  b.db close.forea
28a0: 63 68 20 7b 74 6e 20 75 72 69 20 66 6c 61 67 73  ch {tn uri flags
28b0: 20 65 72 72 6f 72 7d 20 7b 0a 20 20 31 20 20 20   error} {.  1   
28c0: 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f  {file:test.db?mo
28d0: 64 65 3d 72 6f 7d 20 20 20 72 6f 20 20 20 20 7b  de=ro}   ro    {
28e0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a 20 20  not an error}.  
28f0: 32 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64  2   {file:test.d
2900: 62 3f 6d 6f 64 65 3d 72 6f 7d 20 20 20 72 77 20  b?mode=ro}   rw 
2910: 20 20 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72     {not an error
2920: 7d 0a 20 20 33 20 20 20 7b 66 69 6c 65 3a 74 65  }.  3   {file:te
2930: 73 74 2e 64 62 3f 6d 6f 64 65 3d 72 6f 7d 20 20  st.db?mode=ro}  
2940: 20 72 77 63 20 20 20 7b 6e 6f 74 20 61 6e 20 65   rwc   {not an e
2950: 72 72 6f 72 7d 0a 0a 20 20 34 20 20 20 7b 66 69  rror}..  4   {fi
2960: 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d  le:test.db?mode=
2970: 72 77 7d 20 20 20 72 6f 20 20 20 20 7b 61 63 63  rw}   ro    {acc
2980: 65 73 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c  ess mode not all
2990: 6f 77 65 64 3a 20 72 77 7d 0a 20 20 35 20 20 20  owed: rw}.  5   
29a0: 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f  {file:test.db?mo
29b0: 64 65 3d 72 77 7d 20 20 20 72 77 20 20 20 20 7b  de=rw}   rw    {
29c0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a 20 20  not an error}.  
29d0: 36 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64  6   {file:test.d
29e0: 62 3f 6d 6f 64 65 3d 72 77 7d 20 20 20 72 77 63  b?mode=rw}   rwc
29f0: 20 20 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72     {not an error
2a00: 7d 0a 0a 20 20 37 20 20 20 7b 66 69 6c 65 3a 74  }..  7   {file:t
2a10: 65 73 74 2e 64 62 3f 6d 6f 64 65 3d 72 77 63 7d  est.db?mode=rwc}
2a20: 20 20 72 6f 20 20 20 20 7b 61 63 63 65 73 73 20    ro    {access 
2a30: 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  mode not allowed
2a40: 3a 20 72 77 63 7d 0a 20 20 38 20 20 20 7b 66 69  : rwc}.  8   {fi
2a50: 6c 65 3a 74 65 73 74 2e 64 62 3f 6d 6f 64 65 3d  le:test.db?mode=
2a60: 72 77 63 7d 20 20 72 77 20 20 20 20 7b 61 63 63  rwc}  rw    {acc
2a70: 65 73 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c  ess mode not all
2a80: 6f 77 65 64 3a 20 72 77 63 7d 0a 20 20 39 20 20  owed: rwc}.  9  
2a90: 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 6d   {file:test.db?m
2aa0: 6f 64 65 3d 72 77 63 7d 20 20 72 77 63 20 20 20  ode=rwc}  rwc   
2ab0: 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a 7d  {not an error}.}
2ac0: 20 7b 0a 20 20 73 65 74 20 66 28 72 6f 29 20 20   {.  set f(ro)  
2ad0: 5b 6c 69 73 74 20 53 51 4c 49 54 45 5f 4f 50 45  [list SQLITE_OPE
2ae0: 4e 5f 52 45 41 44 4f 4e 4c 59 20 53 51 4c 49 54  N_READONLY SQLIT
2af0: 45 5f 4f 50 45 4e 5f 55 52 49 5d 0a 20 20 73 65  E_OPEN_URI].  se
2b00: 74 20 66 28 72 77 29 20 20 5b 6c 69 73 74 20 53  t f(rw)  [list S
2b10: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2b20: 52 49 54 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE SQLITE_OPEN
2b30: 5f 55 52 49 5d 0a 20 20 73 65 74 20 66 28 72 77  _URI].  set f(rw
2b40: 63 29 20 5b 6c 69 73 74 20 53 51 4c 49 54 45 5f  c) [list SQLITE_
2b50: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 53  OPEN_READWRITE S
2b60: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2b70: 45 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  E SQLITE_OPEN_UR
2b80: 49 5d 0a 0a 20 20 73 65 74 20 44 42 20 5b 73 71  I]..  set DB [sq
2b90: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 24 75  lite3_open_v2 $u
2ba0: 72 69 20 24 66 28 24 66 6c 61 67 73 29 20 22 22  ri $f($flags) ""
2bb0: 5d 0a 20 20 73 65 74 20 65 20 5b 73 71 6c 69 74  ].  set e [sqlit
2bc0: 65 33 5f 65 72 72 6d 73 67 20 24 44 42 5d 0a 20  e3_errmsg $DB]. 
2bd0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 24   sqlite3_close $
2be0: 44 42 0a 0a 20 20 64 6f 5f 74 65 73 74 20 39 2e  DB..  do_test 9.
2bf0: 24 74 6e 20 7b 20 73 65 74 20 65 20 7d 20 24 65  $tn { set e } $e
2c00: 72 72 6f 72 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  rror.}..# EVIDEN
2c10: 43 45 2d 4f 46 3a 20 52 2d 32 33 31 38 32 2d 35  CE-OF: R-23182-5
2c20: 34 32 39 35 20 54 68 65 20 63 61 63 68 65 20 70  4295 The cache p
2c30: 61 72 61 6d 65 74 65 72 20 6d 61 79 20 62 65 20  arameter may be 
2c40: 73 65 74 20 74 6f 20 65 69 74 68 65 72 0a 23 20  set to either.# 
2c50: 22 73 68 61 72 65 64 22 20 6f 72 20 22 70 72 69  "shared" or "pri
2c60: 76 61 74 65 22 2e 0a 73 71 6c 69 74 65 33 20 64  vate"..sqlite3 d
2c70: 62 20 74 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f  b test.db.db clo
2c80: 73 65 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 75  se.foreach {tn u
2c90: 72 69 20 65 72 72 6f 72 7d 20 22 0a 20 20 31 20  ri error} ".  1 
2ca0: 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62     {file:test.db
2cb0: 3f 63 61 63 68 65 3d 70 72 69 76 61 74 65 7d 20  ?cache=private} 
2cc0: 20 20 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72     {not an error
2cd0: 7d 0a 20 20 32 20 20 20 20 7b 66 69 6c 65 3a 74  }.  2    {file:t
2ce0: 65 73 74 2e 64 62 3f 63 61 63 68 65 3d 73 68 61  est.db?cache=sha
2cf0: 72 65 64 7d 20 20 20 20 20 7b 6e 6f 74 20 61 6e  red}     {not an
2d00: 20 65 72 72 6f 72 7d 0a 20 20 33 20 20 20 20 7b   error}.  3    {
2d10: 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 63 61 63  file:test.db?cac
2d20: 68 65 3d 79 65 73 7d 20 20 20 20 20 20 20 20 7b  he=yes}        {
2d30: 6e 6f 20 73 75 63 68 20 63 61 63 68 65 20 6d 6f  no such cache mo
2d40: 64 65 3a 20 79 65 73 7d 0a 20 20 34 20 20 20 20  de: yes}.  4    
2d50: 7b 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 63 61  {file:test.db?ca
2d60: 63 68 65 3d 7d 20 20 20 20 20 20 20 20 20 20 20  che=}           
2d70: 7b 6e 6f 20 73 75 63 68 20 63 61 63 68 65 20 6d  {no such cache m
2d80: 6f 64 65 3a 20 7d 0a 22 20 7b 0a 20 20 64 6f 5f  ode: }." {.  do_
2d90: 74 65 73 74 20 31 30 2e 24 74 6e 20 7b 20 6f 70  test 10.$tn { op
2da0: 65 6e 5f 75 72 69 5f 65 72 72 6f 72 20 24 75 72  en_uri_error $ur
2db0: 69 20 7d 20 24 65 72 72 6f 72 0a 7d 0a 0a 23 20  i } $error.}..# 
2dc0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
2dd0: 33 30 32 37 2d 30 33 35 31 35 20 53 65 74 74 69  3027-03515 Setti
2de0: 6e 67 20 69 74 20 74 6f 20 22 73 68 61 72 65 64  ng it to "shared
2df0: 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
2e00: 74 6f 0a 23 20 73 65 74 74 69 6e 67 20 74 68 65  to.# setting the
2e10: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
2e20: 52 45 44 43 41 43 48 45 20 62 69 74 20 69 6e 20  REDCACHE bit in 
2e30: 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
2e40: 6e 74 20 70 61 73 73 65 64 0a 23 20 74 6f 20 73  nt passed.# to s
2e50: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
2e60: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
2e70: 46 3a 20 52 2d 34 39 37 39 33 2d 32 38 35 32 35  F: R-49793-28525
2e80: 20 53 65 74 74 69 6e 67 20 74 68 65 20 63 61 63   Setting the cac
2e90: 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  he parameter to 
2ea0: 22 70 72 69 76 61 74 65 22 20 69 73 0a 23 20 65  "private" is.# e
2eb0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 73 65 74  quivalent to set
2ec0: 74 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ting the SQLITE_
2ed0: 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
2ee0: 45 20 62 69 74 2e 0a 23 0a 23 20 45 56 49 44 45  E bit..#.# EVIDE
2ef0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 37 37 33 2d  NCE-OF: R-31773-
2f00: 34 31 37 39 33 20 49 66 20 73 71 6c 69 74 65 33  41793 If sqlite3
2f10: 5f 6f 70 65 6e 5f 76 32 28 29 20 69 73 20 75 73  _open_v2() is us
2f20: 65 64 20 61 6e 64 20 74 68 65 0a 23 20 22 63 61  ed and the.# "ca
2f30: 63 68 65 22 20 70 61 72 61 6d 65 74 65 72 20 69  che" parameter i
2f40: 73 20 70 72 65 73 65 6e 74 20 69 6e 20 61 20 55  s present in a U
2f50: 52 49 20 66 69 6c 65 6e 61 6d 65 2c 20 69 74 73  RI filename, its
2f60: 20 76 61 6c 75 65 20 6f 76 65 72 72 69 64 65 73   value overrides
2f70: 0a 23 20 61 6e 79 20 62 65 68 61 76 69 6f 72 20  .# any behavior 
2f80: 72 65 71 75 65 73 74 65 64 20 62 79 20 73 65 74  requested by set
2f90: 74 69 6e 67 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ting SQLITE_OPEN
2fa0: 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 6f 72  _PRIVATECACHE or
2fb0: 0a 23 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  .# SQLITE_OPEN_S
2fc0: 48 41 52 45 44 43 41 43 48 45 20 66 6c 61 67 2e  HAREDCACHE flag.
2fd0: 0a 23 0a 73 65 74 20 6f 72 69 67 20 5b 73 71 6c  .#.set orig [sql
2fe0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
2ff0: 65 64 5f 63 61 63 68 65 5d 0a 66 6f 72 65 61 63  ed_cache].foreac
3000: 68 20 7b 74 6e 20 75 72 69 20 66 6c 61 67 73 20  h {tn uri flags 
3010: 73 68 61 72 65 64 5f 64 65 66 61 75 6c 74 20 69  shared_default i
3020: 73 73 68 61 72 65 64 7d 20 7b 0a 20 20 31 2e 31  sshared} {.  1.1
3030: 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62     "file:test.db
3040: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
3050: 20 20 20 22 22 20 20 20 20 20 20 20 20 20 30 20     ""         0 
3060: 20 20 20 30 0a 20 20 31 2e 32 20 20 20 22 66 69     0.  1.2   "fi
3070: 6c 65 3a 74 65 73 74 2e 64 62 22 20 20 20 20 20  le:test.db"     
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 22 20               "" 
3090: 20 20 20 20 20 20 20 20 31 20 20 20 20 31 0a 20          1    1. 
30a0: 20 31 2e 33 20 20 20 22 66 69 6c 65 3a 74 65 73   1.3   "file:tes
30b0: 74 2e 64 62 22 20 20 20 20 20 20 20 20 20 20 20  t.db"           
30c0: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 20         private  
30d0: 20 20 30 20 20 20 20 30 0a 20 20 31 2e 34 20 20    0    0.  1.4  
30e0: 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 22 20   "file:test.db" 
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 70 72 69 76 61 74 65 20 20 20 20 31 20 20 20   private    1   
3110: 20 30 0a 20 20 31 2e 35 20 20 20 22 66 69 6c 65   0.  1.5   "file
3120: 3a 74 65 73 74 2e 64 62 22 20 20 20 20 20 20 20  :test.db"       
3130: 20 20 20 20 20 20 20 20 20 20 20 73 68 61 72 65             share
3140: 64 20 20 20 20 20 30 20 20 20 20 31 0a 20 20 31  d     0    1.  1
3150: 2e 36 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e  .6   "file:test.
3160: 64 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20  db"             
3170: 20 20 20 20 20 73 68 61 72 65 64 20 20 20 20 20       shared     
3180: 31 20 20 20 20 31 0a 0a 20 20 32 2e 31 20 20 20  1    1..  2.1   
3190: 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 63 61  "file:test.db?ca
31a0: 63 68 65 3d 70 72 69 76 61 74 65 22 20 20 20 20  che=private"    
31b0: 22 22 20 20 20 20 20 20 20 20 20 30 20 20 20 20  ""         0    
31c0: 30 0a 20 20 32 2e 32 20 20 20 22 66 69 6c 65 3a  0.  2.2   "file:
31d0: 74 65 73 74 2e 64 62 3f 63 61 63 68 65 3d 70 72  test.db?cache=pr
31e0: 69 76 61 74 65 22 20 20 20 20 22 22 20 20 20 20  ivate"    ""    
31f0: 20 20 20 20 20 31 20 20 20 20 30 0a 20 20 32 2e       1    0.  2.
3200: 33 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e 64  3   "file:test.d
3210: 62 3f 63 61 63 68 65 3d 70 72 69 76 61 74 65 22  b?cache=private"
3220: 20 20 20 20 70 72 69 76 61 74 65 20 20 20 20 30      private    0
3230: 20 20 20 20 30 0a 20 20 32 2e 34 20 20 20 22 66      0.  2.4   "f
3240: 69 6c 65 3a 74 65 73 74 2e 64 62 3f 63 61 63 68  ile:test.db?cach
3250: 65 3d 70 72 69 76 61 74 65 22 20 20 20 20 70 72  e=private"    pr
3260: 69 76 61 74 65 20 20 20 20 31 20 20 20 20 30 0a  ivate    1    0.
3270: 20 20 32 2e 35 20 20 20 22 66 69 6c 65 3a 74 65    2.5   "file:te
3280: 73 74 2e 64 62 3f 63 61 63 68 65 3d 70 72 69 76  st.db?cache=priv
3290: 61 74 65 22 20 20 20 20 73 68 61 72 65 64 20 20  ate"    shared  
32a0: 20 20 20 30 20 20 20 20 30 0a 20 20 32 2e 36 20     0    0.  2.6 
32b0: 20 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f    "file:test.db?
32c0: 63 61 63 68 65 3d 70 72 69 76 61 74 65 22 20 20  cache=private"  
32d0: 20 20 73 68 61 72 65 64 20 20 20 20 20 31 20 20    shared     1  
32e0: 20 20 30 0a 0a 20 20 33 2e 31 20 20 20 22 66 69    0..  3.1   "fi
32f0: 6c 65 3a 74 65 73 74 2e 64 62 3f 63 61 63 68 65  le:test.db?cache
3300: 3d 73 68 61 72 65 64 22 20 20 20 20 20 22 22 20  =shared"     "" 
3310: 20 20 20 20 20 20 20 20 30 20 20 20 20 31 0a 20          0    1. 
3320: 20 33 2e 32 20 20 20 22 66 69 6c 65 3a 74 65 73   3.2   "file:tes
3330: 74 2e 64 62 3f 63 61 63 68 65 3d 73 68 61 72 65  t.db?cache=share
3340: 64 22 20 20 20 20 20 22 22 20 20 20 20 20 20 20  d"     ""       
3350: 20 20 31 20 20 20 20 31 0a 20 20 33 2e 33 20 20    1    1.  3.3  
3360: 20 22 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 63   "file:test.db?c
3370: 61 63 68 65 3d 73 68 61 72 65 64 22 20 20 20 20  ache=shared"    
3380: 20 70 72 69 76 61 74 65 20 20 20 20 30 20 20 20   private    0   
3390: 20 31 0a 20 20 33 2e 34 20 20 20 22 66 69 6c 65   1.  3.4   "file
33a0: 3a 74 65 73 74 2e 64 62 3f 63 61 63 68 65 3d 73  :test.db?cache=s
33b0: 68 61 72 65 64 22 20 20 20 20 20 70 72 69 76 61  hared"     priva
33c0: 74 65 20 20 20 20 31 20 20 20 20 31 0a 20 20 33  te    1    1.  3
33d0: 2e 35 20 20 20 22 66 69 6c 65 3a 74 65 73 74 2e  .5   "file:test.
33e0: 64 62 3f 63 61 63 68 65 3d 73 68 61 72 65 64 22  db?cache=shared"
33f0: 20 20 20 20 20 73 68 61 72 65 64 20 20 20 20 20       shared     
3400: 30 20 20 20 20 31 0a 20 20 33 2e 36 20 20 20 22  0    1.  3.6   "
3410: 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 63 61 63  file:test.db?cac
3420: 68 65 3d 73 68 61 72 65 64 22 20 20 20 20 20 73  he=shared"     s
3430: 68 61 72 65 64 20 20 20 20 20 31 20 20 20 20 31  hared     1    1
3440: 0a 7d 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65  .} {.  forcedele
3450: 74 65 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c  te test.db.  sql
3460: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
3470: 65 64 5f 63 61 63 68 65 20 31 0a 20 20 73 71 6c  ed_cache 1.  sql
3480: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
3490: 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
34a0: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 30 0a  _shared_cache 0.
34b0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
34c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
34d0: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
34e0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
34f0: 6f 6b 27 29 3b 0a 20 20 7d 0a 0a 20 20 75 6e 73  ok');.  }..  uns
3500: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 66  et -nocomplain f
3510: 0a 20 20 73 65 74 20 66 28 29 20 20 20 20 20 20  .  set f()      
3520: 20 20 7b 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52    {SQLITE_OPEN_R
3530: 45 41 44 57 52 49 54 45 20 53 51 4c 49 54 45 5f  EADWRITE SQLITE_
3540: 4f 50 45 4e 5f 43 52 45 41 54 45 20 53 51 4c 49  OPEN_CREATE SQLI
3550: 54 45 5f 4f 50 45 4e 5f 55 52 49 7d 0a 20 20 73  TE_OPEN_URI}.  s
3560: 65 74 20 66 28 73 68 61 72 65 64 29 20 20 5b 63  et f(shared)  [c
3570: 6f 6e 63 61 74 20 24 66 28 29 20 53 51 4c 49 54  oncat $f() SQLIT
3580: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
3590: 48 45 5d 0a 20 20 73 65 74 20 66 28 70 72 69 76  HE].  set f(priv
35a0: 61 74 65 29 20 5b 63 6f 6e 63 61 74 20 24 66 28  ate) [concat $f(
35b0: 29 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  ) SQLITE_OPEN_PR
35c0: 49 56 41 54 45 43 41 43 48 45 5d 0a 0a 20 20 73  IVATECACHE]..  s
35d0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
35e0: 61 72 65 64 5f 63 61 63 68 65 20 24 73 68 61 72  ared_cache $shar
35f0: 65 64 5f 64 65 66 61 75 6c 74 0a 20 20 73 65 74  ed_default.  set
3600: 20 44 42 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65   DB [sqlite3_ope
3610: 6e 5f 76 32 20 24 75 72 69 20 24 66 28 24 66 6c  n_v2 $uri $f($fl
3620: 61 67 73 29 20 22 22 5d 0a 0a 20 20 73 65 74 20  ags) ""]..  set 
3630: 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f 70 72  STMT [sqlite3_pr
3640: 65 70 61 72 65 20 24 44 42 20 22 53 45 4c 45 43  epare $DB "SELEC
3650: 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 2d 31 20  T * FROM t1" -1 
3660: 64 75 6d 6d 79 5d 0a 0a 20 20 64 62 20 65 76 61  dummy]..  db eva
3670: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
3680: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3690: 20 74 31 20 56 41 4c 55 45 53 28 27 6b 6f 27 29   t1 VALUES('ko')
36a0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
36b0: 5f 73 74 65 70 20 24 53 54 4d 54 0a 20 20 73 71  _step $STMT.  sq
36c0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
36d0: 53 54 4d 54 0a 0a 20 20 73 65 74 20 52 45 53 28  STMT..  set RES(
36e0: 30 29 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72  0) {not an error
36f0: 7d 0a 20 20 73 65 74 20 52 45 53 28 31 29 20 7b  }.  set RES(1) {
3700: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
3710: 73 20 6c 6f 63 6b 65 64 3a 20 74 31 7d 0a 0a 20  s locked: t1}.. 
3720: 20 64 6f 5f 74 65 73 74 20 31 31 2e 24 74 6e 20   do_test 11.$tn 
3730: 7b 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  { sqlite3_errmsg
3740: 20 24 44 42 20 7d 20 24 52 45 53 28 24 69 73 73   $DB } $RES($iss
3750: 68 61 72 65 64 29 0a 0a 20 20 73 71 6c 69 74 65  hared)..  sqlite
3760: 33 5f 63 6c 6f 73 65 20 24 44 42 0a 20 20 64 62  3_close $DB.  db
3770: 20 63 6c 6f 73 65 0a 7d 0a 73 71 6c 69 74 65 33   close.}.sqlite3
3780: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
3790: 61 63 68 65 20 24 6f 72 69 67 0a 0a 23 20 45 56  ache $orig..# EV
37a0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 34  IDENCE-OF: R-634
37b0: 37 32 2d 34 36 37 36 39 20 53 70 65 63 69 66 79  72-46769 Specify
37c0: 69 6e 67 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 70  ing an unknown p
37d0: 61 72 61 6d 65 74 65 72 20 69 6e 20 74 68 65 0a  arameter in the.
37e0: 23 20 71 75 65 72 79 20 63 6f 6d 70 6f 6e 65 6e  # query componen
37f0: 74 20 6f 66 20 61 20 55 52 49 20 69 73 20 6e 6f  t of a URI is no
3800: 74 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 64 6f  t an error..#.do
3810: 5f 66 69 6c 65 70 61 74 68 5f 74 65 73 74 20 31  _filepath_test 1
3820: 32 2e 31 20 7b 0a 20 20 70 61 72 73 65 5f 75 72  2.1 {.  parse_ur
3830: 69 20 66 69 6c 65 3a 2f 2f 6c 6f 63 61 6c 68 6f  i file://localho
3840: 73 74 2f 74 65 73 74 2e 64 62 3f 61 6e 3d 75 6e  st/test.db?an=un
3850: 6b 6e 6f 77 6e 26 70 61 72 61 6d 65 74 65 72 3d  known&parameter=
3860: 69 73 26 6f 6b 3d 0a 7d 20 7b 2f 74 65 73 74 2e  is&ok=.} {/test.
3870: 64 62 20 7b 61 6e 20 75 6e 6b 6e 6f 77 6e 20 70  db {an unknown p
3880: 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6b 20 7b  arameter is ok {
3890: 7d 7d 7d 0a 64 6f 5f 66 69 6c 65 70 61 74 68 5f  }}}.do_filepath_
38a0: 74 65 73 74 20 31 32 2e 32 20 7b 0a 20 20 70 61  test 12.2 {.  pa
38b0: 72 73 65 5f 75 72 69 20 66 69 6c 65 3a 2f 2f 6c  rse_uri file://l
38c0: 6f 63 61 6c 68 6f 73 74 2f 74 65 73 74 2e 64 62  ocalhost/test.db
38d0: 3f 61 6e 26 75 6e 6b 6e 6f 77 6e 26 70 61 72 61  ?an&unknown&para
38e0: 6d 65 74 65 72 26 69 73 26 6f 6b 0a 7d 20 7b 2f  meter&is&ok.} {/
38f0: 74 65 73 74 2e 64 62 20 7b 61 6e 20 7b 7d 20 75  test.db {an {} u
3900: 6e 6b 6e 6f 77 6e 20 7b 7d 20 70 61 72 61 6d 65  nknown {} parame
3910: 74 65 72 20 7b 7d 20 69 73 20 7b 7d 20 6f 6b 20  ter {} is {} ok 
3920: 7b 7d 7d 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  {}}}..# EVIDENCE
3930: 2d 4f 46 3a 20 52 2d 32 37 34 35 38 2d 30 34 30  -OF: R-27458-040
3940: 34 33 20 55 52 49 20 68 65 78 61 64 65 63 69 6d  43 URI hexadecim
3950: 61 6c 20 65 73 63 61 70 65 20 73 65 71 75 65 6e  al escape sequen
3960: 63 65 73 20 28 25 48 48 29 20 61 72 65 0a 23 20  ces (%HH) are.# 
3970: 73 75 70 70 6f 72 74 65 64 20 77 69 74 68 69 6e  supported within
3980: 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 71 75   the path and qu
3990: 65 72 79 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f  ery components o
39a0: 66 20 61 20 55 52 49 2e 0a 23 0a 23 20 45 56 49  f a URI..#.# EVI
39b0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 36  DENCE-OF: R-5276
39c0: 35 2d 35 30 33 36 38 20 42 65 66 6f 72 65 20 74  5-50368 Before t
39d0: 68 65 20 70 61 74 68 20 6f 72 20 71 75 65 72 79  he path or query
39e0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61   components of a
39f0: 0a 23 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20  .# URI filename 
3a00: 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 2c  are interpreted,
3a10: 20 74 68 65 79 20 61 72 65 20 65 6e 63 6f 64 65   they are encode
3a20: 64 20 75 73 69 6e 67 20 55 54 46 2d 38 20 61 6e  d using UTF-8 an
3a30: 64 20 61 6c 6c 0a 23 20 68 65 78 61 64 65 63 69  d all.# hexadeci
3a40: 6d 61 6c 20 65 73 63 61 70 65 20 73 65 71 75 65  mal escape seque
3a50: 6e 63 65 73 20 72 65 70 6c 61 63 65 64 20 62 79  nces replaced by
3a60: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
3a70: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 23 20  ontaining the.# 
3a80: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 63  corresponding oc
3a90: 74 65 74 2e 0a 23 0a 23 20 20 20 54 68 65 20 73  tet..#.#   The s
3aa0: 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 74 77 6f  econd of the two
3ab0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f 76   statements abov
3ac0: 65 20 69 73 20 74 65 73 74 65 64 20 62 79 20 63  e is tested by c
3ad0: 72 65 61 74 69 6e 67 20 61 0a 23 20 20 20 6d 75  reating a.#   mu
3ae0: 6c 74 69 2d 62 79 74 65 20 75 74 66 2d 38 20 63  lti-byte utf-8 c
3af0: 68 61 72 61 63 74 65 72 20 75 73 69 6e 67 20 61  haracter using a
3b00: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 25 48 48   sequence of %HH
3b10: 20 65 73 63 61 70 65 73 2e 0a 23 0a 66 6f 72 65   escapes..#.fore
3b20: 61 63 68 20 7b 74 6e 20 75 72 69 20 70 61 72 73  ach {tn uri pars
3b30: 65 7d 20 22 0a 20 20 31 20 20 7b 66 69 6c 65 3a  e} ".  1  {file:
3b40: 2f 74 65 73 74 2e 25 36 34 25 36 32 7d 20 20 20  /test.%64%62}   
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 20 20 7b 2f 74 65 73 74            {/test
3b70: 2e 64 62 20 7b 7d 7d 0a 20 20 32 20 20 7b 66 69  .db {}}.  2  {fi
3b80: 6c 65 3a 2f 74 65 73 74 2e 64 62 3f 25 36 38 25  le:/test.db?%68%
3b90: 36 35 25 36 63 25 36 63 25 36 66 3d 25 37 37 25  65%6c%6c%6f=%77%
3ba0: 36 66 25 37 32 25 36 63 25 36 34 7d 20 7b 2f 74  6f%72%6c%64} {/t
3bb0: 65 73 74 2e 64 62 20 7b 68 65 6c 6c 6f 20 77 6f  est.db {hello wo
3bc0: 72 6c 64 7d 7d 0a 20 20 33 20 20 7b 66 69 6c 65  rld}}.  3  {file
3bd0: 3a 2f 25 43 33 25 42 46 2e 64 62 7d 20 20 20 20  :/%C3%BF.db}    
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bf0: 20 20 20 20 20 20 20 20 20 20 20 7b 2f 5c 78 46             {/\xF
3c00: 46 2e 64 62 20 7b 7d 7d 0a 22 20 7b 0a 20 20 64  F.db {}}." {.  d
3c10: 6f 5f 66 69 6c 65 70 61 74 68 5f 74 65 73 74 20  o_filepath_test 
3c20: 31 33 2e 24 74 6e 20 7b 20 70 61 72 73 65 5f 75  13.$tn { parse_u
3c30: 72 69 20 24 75 72 69 20 7d 20 24 70 61 72 73 65  ri $uri } $parse
3c40: 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  .}..finish_test.