From: dan Date: Thu, 8 Aug 2019 15:47:32 +0000 (+0000) Subject: Fix spurious "no such table: x1" errors in shared-schema mode that could occur X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=73debcccd169ef99b3e80088d8c238065060170a;p=thirdparty%2Fsqlite.git Fix spurious "no such table: x1" errors in shared-schema mode that could occur when a query that is a join across two or more databases needs to call the xConnect() methods of a virtual table. FossilOrigin-Name: edf45cd7c6c1122db961ae66c21c7e974115e6048f1f5014015a5f693f1844bf --- diff --git a/manifest b/manifest index 126817a62b..9105bf5505 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\scausing\s"no\ssuch\stable"\sand\sother\ssimilar\ssqlite3_prepare*()\serrors\sto\sreturn\sSQLITE_SCHEMA\sinstead\sof\sSQLITE_ERROR\sin\sshared-schema\smode\swhen\sthere\sis\san\sattached\sdatabase\sfor\swhich\sthe\sschema\shas\snever\sbeen\sloaded. -D 2019-08-08T11:44:57.781 +C Fix\sspurious\s"no\ssuch\stable:\sx1"\serrors\sin\sshared-schema\smode\sthat\scould\soccur\nwhen\sa\squery\sthat\sis\sa\sjoin\sacross\stwo\sor\smore\sdatabases\sneeds\sto\scall\sthe\sxConnect()\smethods\sof\sa\svirtual\stable. +D 2019-08-08T15:47:32.871 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -529,7 +529,7 @@ F src/shell.c.in 8b51039f1eb9629595e1755ed4c6847571b97539cdf5074ef4f2be3db4e9c5f F src/sqlite.h.in e7bdb21e7c59cd6db0eeaabee1478db3dc348270dfb3ce1987541ba133bf531a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 170fa79c877f9e45d9219f7825b7b77126d3f2dfe71afa84d776fc0884ee8bb4 +F src/sqliteInt.h 41365fb249e30f3c96608edee107df9bade2b71d9e3689ad9ffabf48eb5f1447 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c d9f7d66ae8bee9ffbe4cf7ae72a8d3d429a269336dee1e705ecb3dbea27fa5e2 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -589,7 +589,7 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e +F src/tokenize.c 3e08eadda7a23a58dd45976c68c600ca2b61a6015c2e61849b1e0cb62f9a9169 F src/treeview.c cf03f9f6efb93288c7b9f17374ea48e4ce9111b0bc7e428d6850c3eee532b461 F src/trigger.c b6a3541d07a6a174f19f617405a96abff3e96365f97ff2edca1e1e7d31393e10 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 @@ -602,7 +602,7 @@ F src/vdbe.h 323218c4bfd64c719ba85d05fbc87cdd126991cadb39e73ccac7b59f30c3d53e F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da F src/vdbeaux.c aa9950d1a49274aabaf80581c19080591a998ec745b15016480b2a3f7dc18df8 -F src/vdbeblob.c ffe8720d6c00f2bb253b4e00b161940eb2513100d7e9b1459cf980decd1fe1f9 +F src/vdbeblob.c 40028e015fe557a945c99edb6cbf844ea96d853c3e8ac4eb5c1e49bff59f154e F src/vdbemem.c f6f277d17d50972571d1394535d4c3d156fdea871d8f327f5b9479984054015a F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 @@ -1255,6 +1255,7 @@ F test/reuse2.test 5dd9c98579358f0d5a90d25e36dd6e678a03e23446b6c7f2630a8da22ae7c F test/reuse3.test ab116714c9dfbdf975716e9dee8409e045e4172dcd0a685275a37b96f370b3bb F test/reuse4.test adaad66253aea6cc748674328abe69b650c5c78b8676ed1162d3de09742519f9 F test/reuse5.test bbe6cf7384ef90f134392edd93d626385ef0bf6f40eefc3d993535cd0861d83b +F test/reuse6.test 3c7de2cd3c9246e848b33c644feff642e4da291dc3f21b268db2d4a1be9825b0 F test/reusefault.test ef646a0fb51d50ddfb4b7cd872f88e7d36eaba64bde7797b3418c3774e1c8d14 F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 @@ -1847,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 62557fab0d21d47893e69d504ae2b4405c1837ccd6300a5a6743cb756eb28ad3 -R 7685a58cd0424b4f663be4b37d288774 +P 111e2c73cf430ae61e3f4cc34a1bee8ac7025b8a960fc3f3b7f493009b759ad7 +R e3122eb8e2ce7a95e67a718a488eda82 U dan -Z 1465b53bc3abab19ee3f0a331df543d1 +Z 300a034276e5262df11e18b77c4c7a70 diff --git a/manifest.uuid b/manifest.uuid index 27ebf0e685..1e815a6325 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -111e2c73cf430ae61e3f4cc34a1bee8ac7025b8a960fc3f3b7f493009b759ad7 \ No newline at end of file +edf45cd7c6c1122db961ae66c21c7e974115e6048f1f5014015a5f693f1844bf \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index fdae4b275f..94ec937655 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3139,7 +3139,6 @@ struct Parse { AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ Parse *pToplevel; /* Parse structure for main program (or NULL) */ Table *pTriggerTab; /* Table triggers are being coded for */ - Parse *pParentParse; /* Parent parser if this parser is nested */ int addrCrTab; /* Address of OP_CreateBtree opcode on CREATE TABLE */ u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u32 oldmask; /* Mask of old.* columns referenced */ diff --git a/src/tokenize.c b/src/tokenize.c index 40f7b4aad9..b06312ed01 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -560,6 +560,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ int lastTokenParsed = -1; /* type of the previous token */ sqlite3 *db = pParse->db; /* The database connection */ int mxSqlLen; /* Max length of an SQL string */ + Parse *pParentParse = db->pParse; #ifdef sqlite3Parser_ENGINEALWAYSONSTACK yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif @@ -595,7 +596,6 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ assert( pParse->pNewTrigger==0 ); assert( pParse->nVar==0 ); assert( pParse->pVList==0 ); - pParse->pParentParse = db->pParse; db->pParse = pParse; while( 1 ){ n = sqlite3GetToken((u8*)zSql, &tokenType); @@ -722,8 +722,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ pParse->pZombieTab = p->pNextZombie; sqlite3DeleteTable(db, p); } - db->pParse = pParse->pParentParse; - pParse->pParentParse = 0; + db->pParse = pParentParse; assert( nErr==0 || pParse->rc!=SQLITE_OK ); return nErr; } diff --git a/src/vdbeblob.c b/src/vdbeblob.c index 78fd2faf7f..4172650b6d 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -131,6 +131,7 @@ int sqlite3_blob_open( char *zErr = 0; Table *pTab; Incrblob *pBlob = 0; + Parse *pParentParse = db->pParse; Parse sParse; int bUnlock; /* True to unlock reusable schemas before returning */ @@ -148,7 +149,6 @@ int sqlite3_blob_open( wrFlag = !!wrFlag; /* wrFlag = (wrFlag ? 1 : 0); */ sqlite3_mutex_enter(db->mutex); - assert( db->pParse==0 ); bUnlock = sqlite3LockReusableSchema(db); pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob)); @@ -335,7 +335,7 @@ int sqlite3_blob_open( } while( (++nAttempt)pParse = 0; + db->pParse = pParentParse; sqlite3UnlockReusableSchema(db, bUnlock); if( rc==SQLITE_OK && db->mallocFailed==0 ){ *ppBlob = (sqlite3_blob *)pBlob; diff --git a/test/reuse6.test b/test/reuse6.test new file mode 100644 index 0000000000..b62c5a6e3d --- /dev/null +++ b/test/reuse6.test @@ -0,0 +1,123 @@ +# 2019 February 26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix reuse6 + +ifcapable !sharedschema { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE t1(x, y); + CREATE TABLE t2(a, b, c); + CREATE INDEX t1x ON t1(x); + CREATE INDEX t1y ON t1(y); + CREATE VIEW v1 AS SELECT * FROM t2; + + INSERT INTO t1 VALUES(1, 2), (3, 4), (5, 6); + INSERT INTO t2 VALUES('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i'); + + ATTACH 'test.db2' AS aux; + CREATE TABLE t3(i, ii); + INSERT INTO t3 VALUES(10, 20); +} + +sqlite3 db1 test.db -shared-schema 1 +sqlite3 db2 test.db -shared-schema 1 + +do_execsql_test -db db1 1.1 { + ATTACH 'test.db2' AS aux; +} + +do_test 1.2 { + execsql {SELECT * FROM t3} db1 +} {10 20} + +do_execsql_test -db db2 1.3 { + ATTACH 'test.db2' AS aux; +} + +do_test 1.3 { + execsql {SELECT * FROM t3} db1 +} {10 20} + +do_execsql_test -db db2 1.5 { + SELECT * FROM t3; +} {10 20} + +do_test 1.6 { + execsql {SELECT * FROM t3} db1 +} {10 20} + +db1 close +db2 close + +#------------------------------------------------------------------------- +reset_db +forcedelete test.db2 +forcedelete test.db3 +do_execsql_test 2.0 { + CREATE TABLE t1(x, y); + ATTACH 'test.db2' AS aux2; + CREATE TABLE aux2.t2(x, y); + ATTACH 'test.db3' AS aux3; + CREATE TABLE aux3.t3(x, y); +} + +sqlite3 db1 test.db -shared-schema 1 +do_execsql_test -db db1 2.1 { + ATTACH 'test.db2' AS aux2; + ATTACH 'test.db3' AS aux3; +} + +do_test 2.2.1 { + catchsql { SELECT * FROM aux2.nosuchtable } db1 +} {1 {no such table: aux2.nosuchtable}} +do_test 2.2.2 { + sqlite3_errcode db1 +} {SQLITE_ERROR} +db1 close + +#------------------------------------------------------------------------- +reset_db +forcedelete test.db2 +ifcapable fts5 { + do_execsql_test 3.0 { + CREATE VIRTUAL TABLE ft USING fts5(a, b); + ATTACH 'test.db2' AS aux; + CREATE TABLE aux.t1(x, y, z); + } + + sqlite3 db1 test.db -shared-schema 1 + do_execsql_test -db db1 3.1 { + ATTACH 'test.db2' AS aux; + } + +breakpoint + do_execsql_test -db db1 3.2 { + SELECT * FROM main.ft, aux.t1; + } +} + + + + + + + + +finish_test +