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¶meter=is&ok= 441286ab7c2Sdan} {/test.db {an unknown parameter is ok {}}} 4425550517eSshanehdo_filepath_test 12.2 { 443286ab7c2Sdan parse_uri file://localhost/test.db?an&unknown¶meter&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