xref: /sqlite-3.40.0/test/e_uri.test (revision 9c5e1e40)
1286ab7c2Sdan# 2011 May 06
2286ab7c2Sdan#
3286ab7c2Sdan# The author disclaims copyright to this source code.  In place of
4286ab7c2Sdan# a legal notice, here is a blessing:
5286ab7c2Sdan#
6286ab7c2Sdan#    May you do good and not evil.
7286ab7c2Sdan#    May you find forgiveness for yourself and forgive others.
8286ab7c2Sdan#    May you share freely, never taking more than you give.
9286ab7c2Sdan#
10286ab7c2Sdan#***********************************************************************
11286ab7c2Sdan#
12286ab7c2Sdan
13286ab7c2Sdanset testdir [file dirname $argv0]
14286ab7c2Sdansource $testdir/tester.tcl
15286ab7c2Sdanset testprefix e_uri
167bd6b49aSdrhdo_not_use_codec
17286ab7c2Sdandb close
18286ab7c2Sdan
19286ab7c2Sdanproc parse_uri {uri} {
20286ab7c2Sdan  testvfs tvfs2
21286ab7c2Sdan  testvfs tvfs
22286ab7c2Sdan  tvfs filter xOpen
23286ab7c2Sdan  tvfs script parse_uri_open_cb
24286ab7c2Sdan
25286ab7c2Sdan  set ::uri_open [list]
26286ab7c2Sdan  set DB [sqlite3_open_v2 $uri {
27286ab7c2Sdan    SQLITE_OPEN_READWRITE SQLITE_OPEN_CREATE SQLITE_OPEN_WAL
2891acf7d3Sdrh    SQLITE_OPEN_EXRESCODE
29286ab7c2Sdan  } tvfs]
30e3b63599Smistachkin  set fileName [sqlite3_db_filename $DB main]
31286ab7c2Sdan  sqlite3_close $DB
32e3b63599Smistachkin  forcedelete $fileName
33286ab7c2Sdan  tvfs delete
34286ab7c2Sdan  tvfs2 delete
35286ab7c2Sdan
36286ab7c2Sdan  set ::uri_open
37286ab7c2Sdan}
38286ab7c2Sdanproc parse_uri_open_cb {method file arglist} {
39286ab7c2Sdan  set ::uri_open [list $file $arglist]
40286ab7c2Sdan}
41286ab7c2Sdan
42286ab7c2Sdanproc open_uri_error {uri} {
43286ab7c2Sdan  set flags {SQLITE_OPEN_READWRITE SQLITE_OPEN_CREATE SQLITE_OPEN_WAL}
44286ab7c2Sdan  set DB [sqlite3_open_v2 $uri $flags ""]
45286ab7c2Sdan  set e [sqlite3_errmsg $DB]
46286ab7c2Sdan  sqlite3_close $DB
47286ab7c2Sdan  set e
48286ab7c2Sdan}
49286ab7c2Sdan
50286ab7c2Sdan# EVIDENCE-OF: R-35840-33204 If URI filename interpretation is enabled,
51286ab7c2Sdan# and the filename argument begins with "file:", then the filename is
52286ab7c2Sdan# interpreted as a URI.
53286ab7c2Sdan#
54c6aa3815Sdrh# EVIDENCE-OF: R-27632-24205 URI filename interpretation is enabled if
55c6aa3815Sdrh# the SQLITE_OPEN_URI flag is set in the third argument to
56286ab7c2Sdan# sqlite3_open_v2(), or if it has been enabled globally using the
57f4b595b9Sdrh# SQLITE_CONFIG_URI option with the sqlite3_config() method or by the
58f4b595b9Sdrh# SQLITE_USE_URI compile-time option.
59286ab7c2Sdan#
60286ab7c2Sdanif {$tcl_platform(platform) == "unix"} {
61286ab7c2Sdan  set flags [list SQLITE_OPEN_READWRITE SQLITE_OPEN_CREATE]
62286ab7c2Sdan
63286ab7c2Sdan  # Tests with SQLITE_CONFIG_URI configured to false. URI intepretation is
64286ab7c2Sdan  # only enabled if the SQLITE_OPEN_URI flag is specified.
65286ab7c2Sdan  sqlite3_shutdown
66286ab7c2Sdan  sqlite3_config_uri 0
67286ab7c2Sdan  do_test 1.1 {
68286ab7c2Sdan    forcedelete file:test.db test.db
69286ab7c2Sdan    set DB [sqlite3_open_v2 file:test.db [concat $flags SQLITE_OPEN_URI] ""]
70286ab7c2Sdan    list [file exists file:test.db] [file exists test.db]
71286ab7c2Sdan  } {0 1}
72286ab7c2Sdan  do_test 1.2 {
738d7a2d3bSdan    forcedelete file:test.db2 test.db2
748d7a2d3bSdan    set STMT [sqlite3_prepare $DB "ATTACH 'file:test.db2' AS aux" -1 dummy]
758d7a2d3bSdan    sqlite3_step $STMT
768d7a2d3bSdan    sqlite3_finalize $STMT
778d7a2d3bSdan    list [file exists file:test.db2] [file exists test.db2]
788d7a2d3bSdan  } {0 1}
798d7a2d3bSdan  sqlite3_close $DB
808d7a2d3bSdan  do_test 1.3 {
81286ab7c2Sdan    forcedelete file:test.db test.db
82286ab7c2Sdan    set DB [sqlite3_open_v2 file:test.db [concat $flags] ""]
83286ab7c2Sdan    list [file exists file:test.db] [file exists test.db]
84286ab7c2Sdan  } {1 0}
858d7a2d3bSdan  do_test 1.4 {
868d7a2d3bSdan    forcedelete file:test.db2 test.db2
878d7a2d3bSdan    set STMT [sqlite3_prepare $DB "ATTACH 'file:test.db2' AS aux" -1 dummy]
888d7a2d3bSdan    sqlite3_step $STMT
898d7a2d3bSdan    sqlite3_finalize $STMT
908d7a2d3bSdan    list [file exists file:test.db2] [file exists test.db2]
918d7a2d3bSdan  } {1 0}
92286ab7c2Sdan  sqlite3_close $DB
93286ab7c2Sdan
94286ab7c2Sdan  # Tests with SQLITE_CONFIG_URI configured to true. URI intepretation is
95286ab7c2Sdan  # enabled with or without SQLITE_OPEN_URI.
968d7a2d3bSdan  #
97286ab7c2Sdan  sqlite3_shutdown
98286ab7c2Sdan  sqlite3_config_uri 1
998d7a2d3bSdan  do_test 1.5 {
100286ab7c2Sdan    forcedelete file:test.db test.db
101286ab7c2Sdan    set DB [sqlite3_open_v2 file:test.db [concat $flags SQLITE_OPEN_URI] ""]
102286ab7c2Sdan    list [file exists file:test.db] [file exists test.db]
103286ab7c2Sdan  } {0 1}
1048d7a2d3bSdan  do_test 1.6 {
1058d7a2d3bSdan    forcedelete file:test.db2 test.db2
1068d7a2d3bSdan    set STMT [sqlite3_prepare $DB "ATTACH 'file:test.db2' AS aux" -1 dummy]
1078d7a2d3bSdan    sqlite3_step $STMT
1088d7a2d3bSdan    sqlite3_finalize $STMT
1098d7a2d3bSdan    list [file exists file:test.db2] [file exists test.db2]
1108d7a2d3bSdan  } {0 1}
111286ab7c2Sdan  sqlite3_close $DB
1128d7a2d3bSdan  do_test 1.7 {
113286ab7c2Sdan    forcedelete file:test.db test.db
114286ab7c2Sdan    set DB [sqlite3_open_v2 file:test.db [concat $flags] ""]
115286ab7c2Sdan    list [file exists file:test.db] [file exists test.db]
116286ab7c2Sdan  } {0 1}
1178d7a2d3bSdan  do_test 1.8 {
1188d7a2d3bSdan    forcedelete file:test.db2 test.db2
1198d7a2d3bSdan    set STMT [sqlite3_prepare $DB "ATTACH 'file:test.db2' AS aux" -1 dummy]
1208d7a2d3bSdan    sqlite3_step $STMT
1218d7a2d3bSdan    sqlite3_finalize $STMT
1228d7a2d3bSdan    list [file exists file:test.db2] [file exists test.db2]
1238d7a2d3bSdan  } {0 1}
124286ab7c2Sdan  sqlite3_close $DB
125286ab7c2Sdan}
126286ab7c2Sdan
1275550517eSshaneh# ensure uri processing enabled for the rest of the tests
1285550517eSshanehsqlite3_shutdown
1295550517eSshanehsqlite3_config_uri 1
1305550517eSshaneh
13100729cbaSdrh# EVIDENCE-OF: R-06842-00595 If the URI contains an authority, then it
13200729cbaSdrh# must be either an empty string or the string "localhost".
13300729cbaSdrh#
134286ab7c2Sdan# EVIDENCE-OF: R-17482-00398 If the authority is not an empty string or
135286ab7c2Sdan# "localhost", an error is returned to the caller.
136286ab7c2Sdan#
137286ab7c2Sdanif {$tcl_platform(platform) == "unix"} {
138286ab7c2Sdan  set flags [list SQLITE_OPEN_READWRITE SQLITE_OPEN_CREATE SQLITE_OPEN_URI]
139286ab7c2Sdan  foreach {tn uri error} "
1404a41f345Smistachkin    1  {file://localhost[test_pwd /]test.db}   {not an error}
1414a41f345Smistachkin    2  {file://[test_pwd /]test.db}            {not an error}
1424a41f345Smistachkin    3  {file://x[test_pwd /]test.db}           {invalid uri authority: x}
1434a41f345Smistachkin    4  {file://invalid[test_pwd /]test.db}     {invalid uri authority: invalid}
144286ab7c2Sdan  " {
145286ab7c2Sdan    do_test 2.$tn {
146286ab7c2Sdan      set DB [sqlite3_open_v2 $uri $flags ""]
147286ab7c2Sdan      set e [sqlite3_errmsg $DB]
148286ab7c2Sdan      sqlite3_close $DB
149286ab7c2Sdan      set e
150286ab7c2Sdan    } $error
151286ab7c2Sdan  }
152286ab7c2Sdan}
153286ab7c2Sdan
154f4b595b9Sdrh# EVIDENCE-OF: R-45981-25528 The fragment component of a URI, if
155f4b595b9Sdrh# present, is ignored.
156286ab7c2Sdan#
1575550517eSshaneh#   It is difficult to test that something is ignored correctly. So these tests
158286ab7c2Sdan#   just show that adding a fragment does not interfere with the pathname or
159286ab7c2Sdan#   parameters passed through to the VFS xOpen() methods.
160286ab7c2Sdan#
161286ab7c2Sdanforeach {tn uri parse} "
1624a41f345Smistachkin  1    {file:test.db#abc}      {[test_pwd / {}]test.db {}}
1634a41f345Smistachkin  2    {file:test.db?a=b#abc}  {[test_pwd / {}]test.db {a b}}
1644a41f345Smistachkin  3    {file:test.db?a=b#?c=d} {[test_pwd / {}]test.db {a b}}
165286ab7c2Sdan" {
1665550517eSshaneh  do_filepath_test 3.$tn { parse_uri $uri } $parse
167286ab7c2Sdan}
168286ab7c2Sdan
169f4b595b9Sdrh# EVIDENCE-OF: R-62557-09390 SQLite uses the path component of the URI
170f4b595b9Sdrh# as the name of the disk file which contains the database.
171286ab7c2Sdan#
172286ab7c2Sdan# EVIDENCE-OF: R-28659-11035 If the path begins with a '/' character,
173286ab7c2Sdan# then it is interpreted as an absolute path.
174286ab7c2Sdan#
175f4b595b9Sdrh# EVIDENCE-OF: R-46234-61323 If the path does not begin with a '/'
176f4b595b9Sdrh# (meaning that the authority section is omitted from the URI) then the
177f4b595b9Sdrh# path is interpreted as a relative path.
178286ab7c2Sdan#
179286ab7c2Sdanforeach {tn uri parse} "
1804a41f345Smistachkin  1    {file:test.db}             {[test_pwd / {}]test.db {}}
181286ab7c2Sdan  2    {file:/test.db}            {/test.db {}}
182286ab7c2Sdan  3    {file:///test.db}          {/test.db {}}
183286ab7c2Sdan  4    {file://localhost/test.db} {/test.db {}}
184286ab7c2Sdan  5    {file:/a/b/c/test.db}      {/a/b/c/test.db {}}
185286ab7c2Sdan" {
1865550517eSshaneh  do_filepath_test 4.$tn { parse_uri $uri } $parse
187286ab7c2Sdan}
188286ab7c2Sdan
189286ab7c2Sdan# EVIDENCE-OF: R-01612-30877 The "vfs" parameter may be used to specify
190286ab7c2Sdan# the name of a VFS object that provides the operating system interface
191286ab7c2Sdan# that should be used to access the database file on disk.
192286ab7c2Sdan#
193286ab7c2Sdan#   The above is tested by cases 1.* below.
194286ab7c2Sdan#
195286ab7c2Sdan# EVIDENCE-OF: R-52293-58497 If this option is set to an empty string
196286ab7c2Sdan# the default VFS object is used.
197286ab7c2Sdan#
198286ab7c2Sdan#   The above is tested by cases 2.* below.
199286ab7c2Sdan#
200286ab7c2Sdan# EVIDENCE-OF: R-31855-18665 If sqlite3_open_v2() is used and the vfs
201286ab7c2Sdan# option is present, then the VFS specified by the option takes
202286ab7c2Sdan# precedence over the value passed as the fourth parameter to
203286ab7c2Sdan# sqlite3_open_v2().
204286ab7c2Sdan#
205286ab7c2Sdan#   The above is tested by cases 3.* below.
206286ab7c2Sdan#
207286ab7c2Sdanproc vfs_open_cb {name args} {
208286ab7c2Sdan  set ::vfs $name
209286ab7c2Sdan}
210286ab7c2Sdanforeach {name default} {vfs1 0 vfs2 0 vfs3 1} {
211286ab7c2Sdan  testvfs $name -default $default
212286ab7c2Sdan  $name filter xOpen
213286ab7c2Sdan  $name script [list vfs_open_cb $name]
214286ab7c2Sdan}
215286ab7c2Sdanforeach {tn uri defvfs vfs} {
216286ab7c2Sdan  1.1    "file:test.db?vfs=vfs1"    ""    vfs1
217286ab7c2Sdan  1.2    "file:test.db?vfs=vfs2"    ""    vfs2
218286ab7c2Sdan
219286ab7c2Sdan  2.1    "file:test.db"             vfs1  vfs1
220286ab7c2Sdan  2.2    "file:test.db?vfs="        vfs1  vfs3
221286ab7c2Sdan
222286ab7c2Sdan  3.1    "file:test.db?vfs=vfs1"    vfs2  vfs1
223286ab7c2Sdan  3.2    "file:test.db?vfs=vfs2"    vfs1  vfs2
224286ab7c2Sdan  3.3    "file:test.db?xvfs=vfs1"   vfs2  vfs2
225286ab7c2Sdan  3.4    "file:test.db?xvfs=vfs2"   vfs1  vfs1
226286ab7c2Sdan} {
227286ab7c2Sdan  do_test 5.$tn {
228286ab7c2Sdan    set flags [list SQLITE_OPEN_READWRITE SQLITE_OPEN_CREATE SQLITE_OPEN_URI]
229286ab7c2Sdan    sqlite3_close [
230286ab7c2Sdan      sqlite3_open_v2 $uri $flags $defvfs
231286ab7c2Sdan    ]
232286ab7c2Sdan    set ::vfs
233286ab7c2Sdan  } $vfs
234286ab7c2Sdan}
235286ab7c2Sdanvfs1 delete
236286ab7c2Sdanvfs2 delete
237286ab7c2Sdanvfs3 delete
238286ab7c2Sdan
239286ab7c2Sdan# EVIDENCE-OF: R-48365-36308 Specifying an unknown VFS is an error.
240286ab7c2Sdan#
241286ab7c2Sdanset flags [list SQLITE_OPEN_READWRITE SQLITE_OPEN_CREATE SQLITE_OPEN_URI]
242286ab7c2Sdando_test 6.1 {
243286ab7c2Sdan  set DB [sqlite3_open_v2 file:test.db?vfs=nosuchvfs $flags ""]
244286ab7c2Sdan  set errmsg [sqlite3_errmsg $DB]
245286ab7c2Sdan  sqlite3_close $DB
246286ab7c2Sdan  set errmsg
247286ab7c2Sdan} {no such vfs: nosuchvfs}
248286ab7c2Sdan
249286ab7c2Sdan
250155812d3Sdrh# EVIDENCE-OF: R-44013-13102 The mode parameter may be set to either
251155812d3Sdrh# "ro", "rw", "rwc", or "memory". Attempting to set it to any other
252155812d3Sdrh# value is an error
253286ab7c2Sdan#
254286ab7c2Sdansqlite3 db test.db
255286ab7c2Sdandb close
256286ab7c2Sdanforeach {tn uri error} "
257286ab7c2Sdan  1    {file:test.db?mode=ro}    {not an error}
258286ab7c2Sdan  2    {file:test.db?mode=rw}    {not an error}
259286ab7c2Sdan  3    {file:test.db?mode=rwc}   {not an error}
260286ab7c2Sdan  4    {file:test.db?mode=Ro}    {no such access mode: Ro}
261286ab7c2Sdan  5    {file:test.db?mode=Rw}    {no such access mode: Rw}
262286ab7c2Sdan  6    {file:test.db?mode=Rwc}   {no such access mode: Rwc}
2639c67b2aaSdrh  7    {file:test.db?mode=memory} {not an error}
2649c67b2aaSdrh  8    {file:test.db?mode=MEMORY} {no such access mode: MEMORY}
265286ab7c2Sdan" {
266286ab7c2Sdan  do_test 7.$tn { open_uri_error $uri } $error
267286ab7c2Sdan}
268286ab7c2Sdan
269286ab7c2Sdan
2706949784cSdrh# EVIDENCE-OF: R-43036-46756 If "ro" is specified, then the database is
271286ab7c2Sdan# opened for read-only access, just as if the SQLITE_OPEN_READONLY flag
2726949784cSdrh# had been set in the third argument to sqlite3_open_v2().
273286ab7c2Sdan#
274286ab7c2Sdan# EVIDENCE-OF: R-40137-26050 If the mode option is set to "rw", then the
275286ab7c2Sdan# database is opened for read-write (but not create) access, as if
276286ab7c2Sdan# SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had been set.
277286ab7c2Sdan#
278286ab7c2Sdan# EVIDENCE-OF: R-26845-32976 Value "rwc" is equivalent to setting both
279286ab7c2Sdan# SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE.
280286ab7c2Sdan#
281286ab7c2Sdanforeach {tn uri read write create} {
282286ab7c2Sdan  1    {file:test.db?mode=ro}     1 0 0
283286ab7c2Sdan  2    {file:test.db?mode=rw}     1 1 0
284286ab7c2Sdan  3    {file:test.db?mode=rwc}    1 1 1
285286ab7c2Sdan} {
286286ab7c2Sdan  set RES(c,0) {1 {unable to open database file}}
287286ab7c2Sdan  set RES(c,1) {0 {}}
288286ab7c2Sdan  set RES(w,0) {1 {attempt to write a readonly database}}
289286ab7c2Sdan  set RES(w,1) {0 {}}
290286ab7c2Sdan  set RES(r,0) {1 {this never happens}}
291286ab7c2Sdan  set RES(r,1) {0 {a b}}
292286ab7c2Sdan
293286ab7c2Sdan  # Test CREATE access:
294286ab7c2Sdan  forcedelete test.db
295286ab7c2Sdan  do_test 8.$tn.c { list [catch { sqlite3 db $uri } msg] $msg } $RES(c,$create)
296286ab7c2Sdan  catch { db close }
297286ab7c2Sdan
298286ab7c2Sdan  sqlite3 db test.db
299286ab7c2Sdan  db eval { CREATE TABLE t1(a, b) ; INSERT INTO t1 VALUES('a', 'b') ;}
300286ab7c2Sdan  db close
301286ab7c2Sdan
302286ab7c2Sdan  # Test READ access:
303286ab7c2Sdan  do_test 8.$tn.r {
304286ab7c2Sdan    sqlite3 db $uri
305286ab7c2Sdan    catchsql { SELECT * FROM t1 }
306286ab7c2Sdan  } $RES(r,$read)
307286ab7c2Sdan
308286ab7c2Sdan  # Test WRITE access:
309286ab7c2Sdan  do_test 8.$tn.w {
310286ab7c2Sdan    sqlite3 db $uri
311286ab7c2Sdan    catchsql { INSERT INTO t1 VALUES(1, 2) }
312286ab7c2Sdan  } $RES(w,$write)
313286ab7c2Sdan
314286ab7c2Sdan  catch {db close}
315286ab7c2Sdan}
316286ab7c2Sdan
317155812d3Sdrh# EVIDENCE-OF: R-20590-08726 It is an error to specify a value for the
318155812d3Sdrh# mode parameter that is less restrictive than that specified by the
319155812d3Sdrh# flags passed in the third parameter to sqlite3_open_v2().
320286ab7c2Sdan#
321286ab7c2Sdanforcedelete test.db
322286ab7c2Sdansqlite3 db test.db
323286ab7c2Sdandb close
324286ab7c2Sdanforeach {tn uri flags error} {
325286ab7c2Sdan  1   {file:test.db?mode=ro}   ro    {not an error}
326286ab7c2Sdan  2   {file:test.db?mode=ro}   rw    {not an error}
327286ab7c2Sdan  3   {file:test.db?mode=ro}   rwc   {not an error}
328286ab7c2Sdan
329eaadd59aSdan  4   {file:test.db?mode=rw}   ro    {access mode not allowed: rw}
330286ab7c2Sdan  5   {file:test.db?mode=rw}   rw    {not an error}
331286ab7c2Sdan  6   {file:test.db?mode=rw}   rwc   {not an error}
332286ab7c2Sdan
333eaadd59aSdan  7   {file:test.db?mode=rwc}  ro    {access mode not allowed: rwc}
334eaadd59aSdan  8   {file:test.db?mode=rwc}  rw    {access mode not allowed: rwc}
335286ab7c2Sdan  9   {file:test.db?mode=rwc}  rwc   {not an error}
336286ab7c2Sdan} {
337286ab7c2Sdan  set f(ro)  [list SQLITE_OPEN_READONLY SQLITE_OPEN_URI]
338286ab7c2Sdan  set f(rw)  [list SQLITE_OPEN_READWRITE SQLITE_OPEN_URI]
339286ab7c2Sdan  set f(rwc) [list SQLITE_OPEN_READWRITE SQLITE_OPEN_CREATE SQLITE_OPEN_URI]
340286ab7c2Sdan
341286ab7c2Sdan  set DB [sqlite3_open_v2 $uri $f($flags) ""]
342286ab7c2Sdan  set e [sqlite3_errmsg $DB]
343286ab7c2Sdan  sqlite3_close $DB
344286ab7c2Sdan
345286ab7c2Sdan  do_test 9.$tn { set e } $error
346286ab7c2Sdan}
347286ab7c2Sdan
348286ab7c2Sdan# EVIDENCE-OF: R-23182-54295 The cache parameter may be set to either
349286ab7c2Sdan# "shared" or "private".
350286ab7c2Sdansqlite3 db test.db
351286ab7c2Sdandb close
352286ab7c2Sdanforeach {tn uri error} "
353286ab7c2Sdan  1    {file:test.db?cache=private}    {not an error}
354286ab7c2Sdan  2    {file:test.db?cache=shared}     {not an error}
355286ab7c2Sdan  3    {file:test.db?cache=yes}        {no such cache mode: yes}
356286ab7c2Sdan  4    {file:test.db?cache=}           {no such cache mode: }
357286ab7c2Sdan" {
358286ab7c2Sdan  do_test 10.$tn { open_uri_error $uri } $error
359286ab7c2Sdan}
360286ab7c2Sdan
361*9c5e1e40Sdrhifcapable shared_cache {
362286ab7c2Sdan# EVIDENCE-OF: R-23027-03515 Setting it to "shared" is equivalent to
363286ab7c2Sdan# setting the SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed
364286ab7c2Sdan# to sqlite3_open_v2().
365286ab7c2Sdan#
366286ab7c2Sdan# EVIDENCE-OF: R-49793-28525 Setting the cache parameter to "private" is
367286ab7c2Sdan# equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit.
368286ab7c2Sdan#
36939759747Sdrh# EVIDENCE-OF: R-31773-41793 If sqlite3_open_v2() is used and the
370286ab7c2Sdan# "cache" parameter is present in a URI filename, its value overrides
37148864df9Smistachkin# any behavior requested by setting SQLITE_OPEN_PRIVATECACHE or
372286ab7c2Sdan# SQLITE_OPEN_SHAREDCACHE flag.
373286ab7c2Sdan#
374286ab7c2Sdanset orig [sqlite3_enable_shared_cache]
375286ab7c2Sdanforeach {tn uri flags shared_default isshared} {
376286ab7c2Sdan  1.1   "file:test.db"                  ""         0    0
377286ab7c2Sdan  1.2   "file:test.db"                  ""         1    1
378286ab7c2Sdan  1.3   "file:test.db"                  private    0    0
379286ab7c2Sdan  1.4   "file:test.db"                  private    1    0
380286ab7c2Sdan  1.5   "file:test.db"                  shared     0    1
381286ab7c2Sdan  1.6   "file:test.db"                  shared     1    1
382286ab7c2Sdan
383286ab7c2Sdan  2.1   "file:test.db?cache=private"    ""         0    0
384286ab7c2Sdan  2.2   "file:test.db?cache=private"    ""         1    0
385286ab7c2Sdan  2.3   "file:test.db?cache=private"    private    0    0
386286ab7c2Sdan  2.4   "file:test.db?cache=private"    private    1    0
387286ab7c2Sdan  2.5   "file:test.db?cache=private"    shared     0    0
388286ab7c2Sdan  2.6   "file:test.db?cache=private"    shared     1    0
389286ab7c2Sdan
390286ab7c2Sdan  3.1   "file:test.db?cache=shared"     ""         0    1
391286ab7c2Sdan  3.2   "file:test.db?cache=shared"     ""         1    1
392286ab7c2Sdan  3.3   "file:test.db?cache=shared"     private    0    1
393286ab7c2Sdan  3.4   "file:test.db?cache=shared"     private    1    1
394286ab7c2Sdan  3.5   "file:test.db?cache=shared"     shared     0    1
395286ab7c2Sdan  3.6   "file:test.db?cache=shared"     shared     1    1
396286ab7c2Sdan} {
397286ab7c2Sdan  forcedelete test.db
398286ab7c2Sdan  sqlite3_enable_shared_cache 1
399286ab7c2Sdan  sqlite3 db test.db
400286ab7c2Sdan  sqlite3_enable_shared_cache 0
401286ab7c2Sdan
402286ab7c2Sdan  db eval {
403286ab7c2Sdan    CREATE TABLE t1(x);
404286ab7c2Sdan    INSERT INTO t1 VALUES('ok');
405286ab7c2Sdan  }
406286ab7c2Sdan
407286ab7c2Sdan  unset -nocomplain f
408286ab7c2Sdan  set f()        {SQLITE_OPEN_READWRITE SQLITE_OPEN_CREATE SQLITE_OPEN_URI}
409286ab7c2Sdan  set f(shared)  [concat $f() SQLITE_OPEN_SHAREDCACHE]
410286ab7c2Sdan  set f(private) [concat $f() SQLITE_OPEN_PRIVATECACHE]
411286ab7c2Sdan
412286ab7c2Sdan  sqlite3_enable_shared_cache $shared_default
413286ab7c2Sdan  set DB [sqlite3_open_v2 $uri $f($flags) ""]
414286ab7c2Sdan
415286ab7c2Sdan  set STMT [sqlite3_prepare $DB "SELECT * FROM t1" -1 dummy]
416286ab7c2Sdan
417286ab7c2Sdan  db eval {
418286ab7c2Sdan    BEGIN;
419286ab7c2Sdan      INSERT INTO t1 VALUES('ko');
420286ab7c2Sdan  }
421286ab7c2Sdan
422286ab7c2Sdan  sqlite3_step $STMT
423286ab7c2Sdan  sqlite3_finalize $STMT
424286ab7c2Sdan
425286ab7c2Sdan  set RES(0) {not an error}
426286ab7c2Sdan  set RES(1) {database table is locked: t1}
427286ab7c2Sdan
428286ab7c2Sdan  do_test 11.$tn { sqlite3_errmsg $DB } $RES($isshared)
429286ab7c2Sdan
430286ab7c2Sdan  sqlite3_close $DB
431286ab7c2Sdan  db close
432286ab7c2Sdan}
433286ab7c2Sdansqlite3_enable_shared_cache $orig
434*9c5e1e40Sdrh}  ;#  End ifcapable shared_chache
435286ab7c2Sdan
436286ab7c2Sdan# EVIDENCE-OF: R-63472-46769 Specifying an unknown parameter in the
437286ab7c2Sdan# query component of a URI is not an error.
438286ab7c2Sdan#
4395550517eSshanehdo_filepath_test 12.1 {
440286ab7c2Sdan  parse_uri file://localhost/test.db?an=unknown&parameter=is&ok=
441286ab7c2Sdan} {/test.db {an unknown parameter is ok {}}}
4425550517eSshanehdo_filepath_test 12.2 {
443286ab7c2Sdan  parse_uri file://localhost/test.db?an&unknown&parameter&is&ok
444286ab7c2Sdan} {/test.db {an {} unknown {} parameter {} is {} ok {}}}
445286ab7c2Sdan
446286ab7c2Sdan# EVIDENCE-OF: R-27458-04043 URI hexadecimal escape sequences (%HH) are
447286ab7c2Sdan# supported within the path and query components of a URI.
448286ab7c2Sdan#
449286ab7c2Sdan# EVIDENCE-OF: R-52765-50368 Before the path or query components of a
450286ab7c2Sdan# URI filename are interpreted, they are encoded using UTF-8 and all
451286ab7c2Sdan# hexadecimal escape sequences replaced by a single byte containing the
452286ab7c2Sdan# corresponding octet.
453286ab7c2Sdan#
454286ab7c2Sdan#   The second of the two statements above is tested by creating a
455286ab7c2Sdan#   multi-byte utf-8 character using a sequence of %HH escapes.
456286ab7c2Sdan#
457286ab7c2Sdanforeach {tn uri parse} "
458286ab7c2Sdan  1  {file:/test.%64%62}                             {/test.db {}}
459286ab7c2Sdan  2  {file:/test.db?%68%65%6c%6c%6f=%77%6f%72%6c%64} {/test.db {hello world}}
460286ab7c2Sdan  3  {file:/%C3%BF.db}                               {/\xFF.db {}}
461286ab7c2Sdan" {
4625550517eSshaneh  do_filepath_test 13.$tn { parse_uri $uri } $parse
463286ab7c2Sdan}
464286ab7c2Sdan
465286ab7c2Sdanfinish_test
466