------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
-
-C Modify\sthe\sVFS\sxAccess()\smethod\son\swinNT\sso\sthat\sit\sreturns\sfalse\sfor\nan\sexists\stest\sof\sa\szero-length\sfile.\s\sThis\smakes\sthe\swindows\sVFS\swork\nthe\ssame\sas\sthe\sunix\sVFS.
-D 2010-07-05T21:00:43
+C Ensure\sthe\scorrect\serror\scode\sis\sreturned\sif\san\sattempt\sto\sparse\sa\sdatabase\sschema\smade\sby\san\sATTACH\sstatement\sfails.
+D 2010-07-06T07:36:18
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050
F src/pcache1.c 3a7c28f46a61b43ff0b5c087a7983c154f4b264c
F src/pragma.c 423865323a4074f1e0d4ab02af0be014653e8863
-F src/prepare.c fd1398cb1da54385ba5bd68d93928f10d10a1d9c
+F src/prepare.c 48105b1a6082ac4f47cd6ebebe3678284733e1ea
F src/printf.c 5f5b65a83e63f2096a541a340722a509fa0240a7
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706
F test/nan.test f3a0bcc6ca1acaa370efc5a7571e89507fb5927d
F test/notify1.test 8433bc74bd952fb8a6e3f8d7a4c2b28dfd69e310
F test/notify2.test 195a467e021f74197be2c4fb02d6dee644b8d8db
-F test/notify3.test feb03d697f4a5327c1beb158c3e7e51c5e400703
+F test/notify3.test 7eeba3628c4e707c004b72a2489c48fbdbc5c2ee
F test/notnull.test cc7c78340328e6112a13c3e311a9ab3127114347
F test/null.test a8b09b8ed87852742343b33441a9240022108993
F test/openv2.test af02ed0a9cbc0d2a61b8f35171d4d117e588e4ec
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P a1324d125e2dd7004eaf8680f5f832ef17285087
-R b7b5ca572f0c4cfc846cea3094607313
-U drh
-Z 13fb6b591c3748fd040ab5e5168b969e
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.6 (GNU/Linux)
-
-iD8DBQFMMkf+oxKgR168RlERAmH+AJ4mV5XQd4nFP0MCayWKQVj6n5imSQCffrGL
-fAmeRw3++Xx1yEVjikEuOhY=
-=4bOD
------END PGP SIGNATURE-----
+P ec35f25403744f7441ac5ae1486b84d8ebc13e98
+R 6f882aa18788a523ea19d9f06c59ec5f
+U dan
+Z 4ac3c8c3cdfa6e85afde2c4c5d30b8ea
-ec35f25403744f7441ac5ae1486b84d8ebc13e98
\ No newline at end of file
+c272196115ab3926e56b6f4183ec127e3f98ef9c
\ No newline at end of file
** or executed. All the parser does is build the internal data
** structures that describe the table, index, or view.
*/
+ TESTONLY(int rcp); /* Return code from sqlite3_prepare() */
int rc;
sqlite3_stmt *pStmt;
db->init.iDb = iDb;
db->init.newTnum = atoi(argv[1]);
db->init.orphanTrigger = 0;
- rc = sqlite3_prepare(db, argv[2], -1, &pStmt, 0);
+ TESTONLY(rcp = ) sqlite3_prepare(db, argv[2], -1, &pStmt, 0);
+ rc = db->errCode;
+ assert( (rc&0xFF)==(rcp&0xFF) );
db->init.iDb = 0;
if( SQLITE_OK!=rc ){
if( db->init.orphanTrigger ){
pData->rc = rc;
if( rc==SQLITE_NOMEM ){
db->mallocFailed = 1;
- }else if( rc!=SQLITE_INTERRUPT && rc!=SQLITE_LOCKED ){
+ }else if( rc!=SQLITE_INTERRUPT && (rc&0xFF)!=SQLITE_LOCKED ){
corruptSchema(pData, argv[0], sqlite3_errmsg(db));
}
}
do_test notify3-1.4 {
catchsql { ATTACH 'test.db2' AS aux }
} {0 {}}
+
do_test notify3-1.5 {
catchsql { SELECT * FROM t2 }
} {1 {database schema is locked: aux}}
do_test notify3-1.9 {
catchsql { SELECT * FROM t2 }
} {0 {{t2 A} {t2 B} {t2 C} {t2 D}}}
+db close
+
+
+set err {{1 {unable to open database: test.db2}}}
+set noerr {{0 {}}}
+
+# When a new database is attached, the connection doing the attaching
+# tries to load any unloaded schemas for both the new database and any
+# already attached databases (including the main database). If it is
+# unable to load any such schemas, then the ATTACH statement fails.
+#
+# This block tests that if the loading of schemas as a result of an
+# ATTACH fails due to locks on the schema table held by other shared-cache
+# connections the extended error code is SQLITE_LOCKED_SHAREDCACHE and
+# it is possible to use the unlock-notify mechanism to determine when
+# the ATTACH might succeed.
+#
+foreach {
+ tn
+ db1_loaded
+ db2_loaded
+ enable_extended_errors
+ result
+ error1 error2
+} "
+ 0 0 0 0 $err SQLITE_LOCKED SQLITE_LOCKED_SHAREDCACHE
+ 1 0 0 1 $err SQLITE_LOCKED_SHAREDCACHE SQLITE_LOCKED_SHAREDCACHE
+ 2 0 1 0 $err SQLITE_LOCKED SQLITE_LOCKED_SHAREDCACHE
+ 3 0 1 1 $err SQLITE_LOCKED_SHAREDCACHE SQLITE_LOCKED_SHAREDCACHE
+ 4 1 0 0 $err SQLITE_LOCKED SQLITE_LOCKED_SHAREDCACHE
+ 5 1 0 1 $err SQLITE_LOCKED_SHAREDCACHE SQLITE_LOCKED_SHAREDCACHE
+ 6 1 1 0 $noerr SQLITE_OK SQLITE_OK
+ 7 1 1 1 $noerr SQLITE_OK SQLITE_OK
+" {
+
+ do_test notify3-2.$tn.1 {
+ catch { db1 close }
+ catch { db2 close }
+ sqlite3 db1 test.db
+ sqlite3 db2 test.db2
+
+ sqlite3_extended_result_codes db1 $enable_extended_errors
+ sqlite3_extended_result_codes db2 $enable_extended_errors
+
+ if { $db1_loaded } { db1 eval "SELECT * FROM sqlite_master" }
+ if { $db2_loaded } { db2 eval "SELECT * FROM sqlite_master" }
+
+ db2 eval "BEGIN EXCLUSIVE"
+ catchsql "ATTACH 'test.db2' AS two" db1
+ } $result
+
+ do_test notify3-2.$tn.2 {
+ list [sqlite3_errcode db1] [sqlite3_extended_errcode db1]
+ } [list $error1 $error2]
+
+ do_test notify3-2.$tn.3 {
+ db1 unlock_notify {set invoked 1}
+ set invoked 0
+ db2 eval commit
+ set invoked
+ } [lindex $result 0]
+}
+catch { db1 close }
+catch { db2 close }
+
sqlite3_enable_shared_cache $esc
finish_test