]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix further problems with the feature on this branch.
authordan <dan@noemail.net>
Sat, 17 Nov 2018 18:11:09 +0000 (18:11 +0000)
committerdan <dan@noemail.net>
Sat, 17 Nov 2018 18:11:09 +0000 (18:11 +0000)
FossilOrigin-Name: 6d7a7e5faf1c0ff19e4b0681bc25abb909ed60998e635aea03ece5ba51a5ac52

15 files changed:
manifest
manifest.uuid
src/btmutex.c
src/build.c
src/delete.c
src/expr.c
src/fkey.c
src/insert.c
src/resolve.c
src/select.c
src/sqliteInt.h
src/trigger.c
src/update.c
src/vdbeblob.c
test/reuse1.test

index c9efaa586a985cbf5c7d61d3a0a70f898d1f28f9..cc9484d5501eb452983e7d27e08223fbe1e0da19 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sfurther\sREUSE_SCHEMA\sissues.
-D 2018-11-16T17:04:58.793
+C Fix\sfurther\sproblems\swith\sthe\sfeature\son\sthis\sbranch.
+D 2018-11-17T18:11:09.696
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in edbb6e20bb1decf65f6c64c9e61004a69bdf8afb39cdce5337c916b03dfcd1e3
@@ -444,28 +444,28 @@ F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a
 F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df
 F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab
 F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
-F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
+F src/btmutex.c aeee7f0458949b8d4a33ffc1a5c4f4a28dd7d5d754385096cb9494655afba02b
 F src/btree.c 3ef104ecae8b1b5f0458be1f5fa7c1ecf25fdc322a9d63bb8151f89eb32d381e
 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2
 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96
-F src/build.c 82e919819295b32600e2c544bb2170c6fa2e237ec3c5f7a16e69f107391c110c
+F src/build.c f7487a0538b5e57b4aecc5b697cbf2609f35e19ac23423e84933207d80556b01
 F src/callback.c e5031c28f6e8eb2f290298e262eb1eb5f201ef2ae25db54b396882ae2059e944
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b
 F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
 F src/dbpage.c ada9bc6964bb68e4c128df70cb0938faaa214e1a0e1d730ea6b13c5e1fde9a45
 F src/dbstat.c e042b0e7833fdacf2d5ea92c6b536962fea6aeed8b7287ca87ddfa3412bd9564
-F src/delete.c b807916831c59ca377a59c7ac1574b66f7fac0f11cf056296e29b8a74df20287
-F src/expr.c 9aacc0b72348ba90010b672dcbbbe2fa56e1182043bc917a3a147b2bc57a5497
+F src/delete.c b6dba4487440088f44ac668000cc95125696130d8dd3d9b928ea56aa12b6502c
+F src/expr.c ddbc6be9e14869cce303f7a9ceed281e018b08762be9603c07eb1152ad85a8c5
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
-F src/fkey.c 029a6f10f740b366303a572796f6f21a878ecda9f8cb1614bb4c344d5df6e9aa
+F src/fkey.c 2c112c00667b3c4668023a000489261d5b72441c67f969b526a1af831d297d96
 F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f
 F src/global.c 9bf034fd560bdd514715170ed8460bb7f823cec113f0569ef3f18a20c7ccd128
 F src/hash.c 931ec82d7e070654a8facb42549bbb3a25720171d73ba94c3d3160580d01ef1f
 F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4
 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da
 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
-F src/insert.c 7a0d37e69bc2eb4665469ffcb908fd6bbb15d31d050f52e8614194686673f393
+F src/insert.c bf2717516bc3fb395f488cd42975a2c3a5badbca8c84425f9c2c32c7b85f0a4e
 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
 F src/loadext.c 448eab53ecdb566a1259ee2d45ebff9c0bc4a2cf393774488775c33e4fbe89bf
 F src/main.c 2bbab4122a28c10ff98e5497a15fdfde1d7a075a659739448a61ef0c09a30d19
@@ -502,14 +502,14 @@ F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13
 F src/prepare.c b64a19ee9b0ba1f3a67c4f5d1be308e9f67f8fb07fe90725982dfa9b616d211f
 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
-F src/resolve.c bc8c79e56439b111e7d9415e44940951f7087e9466c3a9d664558ef0faf31073
+F src/resolve.c 9364bbe6945d9e03588563464c5df38204111ba57b9127bc0c2ebe09de94708d
 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
-F src/select.c 08bbb3b8f48a55d900372ba4358fdd0b2a0b5e264fc9aeaedf5a91b3b9546e04
+F src/select.c eabefcb57edafcac6baeaec83289816e9409a23957b5a2d3efe1265f597ce6bd
 F src/shell.c.in 9f517c22e3c9a08ab634330789f74454ec9a7e0596c8faed221c6b43ee980b96
 F src/sqlite.h.in 29a3b2eab328c5a345ef6be09ff77dc6dabbfe1a36e05c19204591d084a73d80
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683
-F src/sqliteInt.h 86c36aec093a8280292e64c0118e491dfe5292098be7df46d501158381f84f71
+F src/sqliteInt.h a64587be4a04b9709c9b27838bdd1c4f829d28a8ba0d000eeb2e0623943279c5
 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
 F src/status.c b651e68af3cb859e4083c79e0e7177e2aeb35ed23e3892d7bbe5b732d38bf2b9
 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@ -569,8 +569,8 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
 F src/tokenize.c 9e781e1ca80eefe7b5d6a9e2cd5c678c847da55fd6f093781fad7950934d4c83
 F src/treeview.c 7b12ac059de54c939b6eb0dbffc9410c29c80d2470cee5cbe07d5ff9ea2d9253
-F src/trigger.c 6e970e8d2d4bb805faed88ccbc3f5cc0552822b4c88d655d79197a29925392c1
-F src/update.c 34d648f44f7d0e1539581c05824fc79a8129e411b47f26714d43111cc319f222
+F src/trigger.c dc20aaa75197d06cef02529cc97bada3d3e830065828b693f66c00754863724a
+F src/update.c 336eec2af108be3203c7ea174ca7cc17d13fd67a3c5b23c0164190b6eaaede3e
 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
@@ -580,7 +580,7 @@ F src/vdbe.h fda06d544a79e684797e7d433e5c410e563f8d3897098826e4c23cdb3be4193e
 F src/vdbeInt.h f7ffb42483f9ab5c5594739b0552dc2185bc0a75de3f19e652c6e66543e63659
 F src/vdbeapi.c ecccfce6f614c33a95952efeec969d163e8349eac314ee2b7b163eda921b5eb0
 F src/vdbeaux.c 5e83d8a9e6513d14f17810c70a87d4876bf9f2b55eb78bec8571fe37a37ade1a
-F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
+F src/vdbeblob.c 377746310196c8c1751049349716630ef3e4df54d1f08f863009b70971f52945
 F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9
 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f
 F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392
@@ -1205,7 +1205,7 @@ F test/reindex.test 44edd3966b474468b823d481eafef0c305022254
 F test/releasetest.tcl c5b474f9880073fc3b69729ee05d5284653a9ee101af572204917d9dcb1d9015 x
 F test/resetdb.test 684a6ffde5a5141bba79f3101981cc38dcfc3403f61e643b7b3aa68bef0b8408
 F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb
-F test/reuse1.test 834fa819c19ab197462c8520405393ac2e70108be200ef12bf7b558b5abfc614
+F test/reuse1.test 85c107d2c45a99e148f639d28e7b839b9981a5aa6856c4ec969072ce5b64eaf4
 F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa
 F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6
 F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a
@@ -1777,7 +1777,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 31b6aee755c81d69aeaf3ae197e510d38e5e3bb83ded44c33379bcd0d4c23300
-R 4487e5748c054c5551f07a85ca239f7f
+P 9780829a77a49b199a55e56d21a51d33fee50321621337afabe5a6f977a65eee
+R e292ca7e98055d1ecb68daa0fd424da3
 U dan
-Z 6cd2fe1c8ff96cf32727bfbf3108f16b
+Z 9568de504751207ce4662d461e4b2430
index 272a569bd28b03c22cc75145709a8c276fd0090c..3cfdbccf6fb9d653fa4310244aaa73826120e4a2 100644 (file)
@@ -1 +1 @@
-9780829a77a49b199a55e56d21a51d33fee50321621337afabe5a6f977a65eee
\ No newline at end of file
+6d7a7e5faf1c0ff19e4b0681bc25abb909ed60998e635aea03ece5ba51a5ac52
\ No newline at end of file
index 275a93ff21cf5e9b0c2b4d78c966fff4ab7a6e1c..1b8ca43a67eae8bb26b988f70cb7d9c9fe29aa96 100644 (file)
@@ -252,7 +252,8 @@ int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){
 int sqlite3SchemaMutexHeld(sqlite3 *db, int iDb, Schema *pSchema){
   Btree *p;
   assert( db!=0 );
-  if( pSchema ) iDb = sqlite3SchemaToIndex(db, pSchema);
+  if( pSchema && (db->openFlags & SQLITE_OPEN_REUSE_SCHEMA) ) return 1;
+  if( pSchema ) iDb = sqlite3SchemaToIndex2(db, pSchema, 0);
   assert( iDb>=0 && iDb<db->nDb );
   if( !sqlite3_mutex_held(db->mutex) ) return 0;
   if( iDb==1 ) return 1;
index 519fa94669e6586779954ddf4fc731577ca4c590..f44878bd2167f1bb96a5b1c0c4d37d4eeb6f7b9d 100644 (file)
@@ -404,7 +404,7 @@ Table *sqlite3LocateTableItem(
       p->zDatabase = sqlite3DbStrDup(pParse->db, zDb);
     }
   }else if( p->pSchema ){
-    int iDb = sqlite3SchemaToIndex(pParse->db, p->pSchema);
+    int iDb = sqlite3SchemaToIndex2(pParse->db, p->pSchema, 0);
     zDb = pParse->db->aDb[iDb].zDbSName;
   }else{
     zDb = p->zDatabase;
@@ -1974,7 +1974,7 @@ void sqlite3EndTable(
     }
   }
 
-  iDb = sqlite3SchemaToIndex(db, p->pSchema);
+  iDb = sqlite3SchemaToIndex2(db, p->pSchema, 0);
 
 #ifndef SQLITE_OMIT_CHECK
   /* Resolve names in all CHECK constraint expressions.
@@ -2194,7 +2194,7 @@ void sqlite3CreateView(
   p = pParse->pNewTable;
   if( p==0 || pParse->nErr ) goto create_view_fail;
   sqlite3TwoPartName(pParse, pName1, pName2, &pName);
-  iDb = sqlite3SchemaToIndex(db, p->pSchema);
+  iDb = sqlite3SchemaToIndex2(db, p->pSchema, 0);
   sqlite3FixInit(&sFix, pParse, iDb, "view", pName);
   if( sqlite3FixSelect(&sFix, pSelect) ) goto create_view_fail;
 
@@ -2511,7 +2511,7 @@ static void destroyTable(Parse *pParse, Table *pTab){
     if( iLargest==0 ){
       return;
     }else{
-      int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
+      int iDb = sqlite3SchemaToIndex2(pParse->db, pTab->pSchema, 0);
       assert( iDb>=0 && iDb<pParse->db->nDb );
       destroyRootPage(pParse, iLargest, iDb);
       iDestroyed = iLargest;
@@ -2638,7 +2638,7 @@ void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){
     if( noErr ) sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase);
     goto exit_drop_table;
   }
-  iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+  iDb = sqlite3SchemaToIndex2(db, pTab->pSchema, 0);
   assert( iDb>=0 && iDb<db->nDb );
   sqlite3SchemaWritable(pParse, iDb);
 
@@ -2887,7 +2887,12 @@ void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){
 ** the index already exists and must be cleared before being refilled and
 ** the root page number of the index is taken from pIndex->tnum.
 */
-static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
+static void sqlite3RefillIndex(
+  Parse *pParse, 
+  int iDb,
+  Index *pIndex, 
+  int memRootPage
+){
   Table *pTab = pIndex->pTable;  /* The table that is indexed */
   int iTab = pParse->nTab++;     /* Btree cursor used for pTab */
   int iIdx = pParse->nTab++;     /* Btree cursor used for pIndex */
@@ -2900,7 +2905,6 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
   KeyInfo *pKey;                 /* KeyInfo for index */
   int regRecord;                 /* Register holding assembled index record */
   sqlite3 *db = pParse->db;      /* The database connection */
-  int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
 
 #ifndef SQLITE_OMIT_AUTHORIZATION
   if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0,
@@ -3099,7 +3103,7 @@ void sqlite3CreateIndex(
     assert( pStart==0 );
     pTab = pParse->pNewTable;
     if( !pTab ) goto exit_create_index;
-    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+    iDb = sqlite3SchemaToIndex2(db, pTab->pSchema, 0);
   }
   pDb = &db->aDb[iDb];
 
@@ -3522,7 +3526,7 @@ void sqlite3CreateIndex(
       ** to invalidate all pre-compiled statements.
       */
       if( pTblName ){
-        sqlite3RefillIndex(pParse, pIndex, iMem);
+        sqlite3RefillIndex(pParse, iDb, pIndex, iMem);
         sqlite3ChangeCookie(pParse, iDb);
         sqlite3VdbeAddParseSchemaOp(pParse, iDb,
             sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName));
@@ -3648,7 +3652,7 @@ void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){
       "or PRIMARY KEY constraint cannot be dropped", 0);
     goto exit_drop_index;
   }
-  iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
+  iDb = sqlite3SchemaToIndex2(db, pIndex->pSchema, 0);
   sqlite3SchemaWritable(pParse, iDb);
 #ifndef SQLITE_OMIT_AUTHORIZATION
   {
@@ -4382,14 +4386,18 @@ static int collationMatch(const char *zColl, Index *pIndex){
 ** If pColl==0 then recompute all indices of pTab.
 */
 #ifndef SQLITE_OMIT_REINDEX
-static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){
+static void reindexTable(
+  Parse *pParse, 
+  int iDb, 
+  Table *pTab, 
+  char const *zColl
+){
   Index *pIndex;              /* An index associated with pTab */
 
   for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){
     if( zColl==0 || collationMatch(zColl, pIndex) ){
-      int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
       sqlite3BeginWriteOperation(pParse, 0, iDb);
-      sqlite3RefillIndex(pParse, pIndex, -1);
+      sqlite3RefillIndex(pParse, iDb, pIndex, -1);
     }
   }
 }
@@ -4413,7 +4421,7 @@ static void reindexDatabases(Parse *pParse, char const *zColl){
     assert( pDb!=0 );
     for(k=sqliteHashFirst(&pDb->pSchema->tblHash);  k; k=sqliteHashNext(k)){
       pTab = (Table*)sqliteHashData(k);
-      reindexTable(pParse, pTab, zColl);
+      reindexTable(pParse, iDb, pTab, zColl);
     }
   }
 }
@@ -4472,7 +4480,7 @@ void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){
   zDb = db->aDb[iDb].zDbSName;
   pTab = sqlite3FindTable(db, z, zDb);
   if( pTab ){
-    reindexTable(pParse, pTab, 0);
+    reindexTable(pParse, iDb, pTab, 0);
     sqlite3DbFree(db, z);
     return;
   }
@@ -4480,7 +4488,7 @@ void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){
   sqlite3DbFree(db, z);
   if( pIndex ){
     sqlite3BeginWriteOperation(pParse, 0, iDb);
-    sqlite3RefillIndex(pParse, pIndex, -1);
+    sqlite3RefillIndex(pParse, iDb, pIndex, -1);
     return;
   }
   sqlite3ErrorMsg(pParse, "unable to identify the object to be reindexed");
index 45f200f8dcf78b68562d5d8699b8a0d0b3860a8c..ffd125d866727f523f154981ea78719cdd51d736 100644 (file)
@@ -748,7 +748,7 @@ void sqlite3GenerateRowDelete(
     /* Do FK processing. This call checks that any FK constraints that
     ** refer to this table (i.e. constraints attached to other tables) 
     ** are not violated by deleting this row.  */
-    sqlite3FkCheck(pParse, pTab, iOld, 0, 0, 0);
+    sqlite3FkCheck(pParse, iDb, pTab, iOld, 0, 0, 0);
   }
 
   /* Delete the index and table entries. Skip this step if pTab is really
index d4eb9de62d71777b7a9d2ea795abcd38a43aa857..d473156cfe995c694a48736f3ae9c7774cd60da0 100644 (file)
@@ -2369,7 +2369,7 @@ int sqlite3FindInIndex(
     pTab = p->pSrc->a[0].pTab;
 
     /* Code an OP_Transaction and OP_TableLock for <table>. */
-    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+    iDb = sqlite3SchemaToIndex2(db, pTab->pSchema, p->pSrc->a[0].zDatabase);
     sqlite3CodeVerifySchema(pParse, iDb);
     sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
 
index 62cbbd7899fa0d27059fb5a5e02bf436279878bf..482732e1f3437ed6893663ae8464696064441b04 100644 (file)
@@ -862,6 +862,7 @@ static int isSetNullAction(Parse *pParse, FKey *pFKey){
 */
 void sqlite3FkCheck(
   Parse *pParse,                  /* Parse context */
+  int iDb,                        /* Database containing pTab */
   Table *pTab,                    /* Row is being deleted from this table */ 
   int regOld,                     /* Previous row data is stored here */
   int regNew,                     /* New row data is stored here */
@@ -870,7 +871,6 @@ void sqlite3FkCheck(
 ){
   sqlite3 *db = pParse->db;       /* Database handle */
   FKey *pFKey;                    /* Used to iterate through FKs */
-  int iDb;                        /* Index of database containing pTab */
   const char *zDb;                /* Name of database containing pTab */
   int isIgnoreErrors = pParse->disableTriggers;
 
@@ -879,8 +879,6 @@ void sqlite3FkCheck(
 
   /* If foreign-keys are disabled, this function is a no-op. */
   if( (db->flags&SQLITE_ForeignKeys)==0 ) return;
-
-  iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
   zDb = db->aDb[iDb].zDbSName;
 
   /* Loop through all the foreign key constraints for which pTab is the
index 84c8021594da280a5d16f4a4834e36adebf84ddb..d9901b6aa1cf501c611b27995d4ad55ffa23f165 100644 (file)
@@ -1041,7 +1041,7 @@ void sqlite3Insert(
           iIdxCur, regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 
           0, pUpsert
       );
-      sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0);
+      sqlite3FkCheck(pParse, iDb, pTab, 0, regIns, 0, 0);
 
       /* Set the OPFLAG_USESEEKRESULT flag if either (a) there are no REPLACE
       ** constraints or (b) there are no triggers and this table is not a
@@ -2285,7 +2285,7 @@ static int xferOptimization(
 #ifdef SQLITE_TEST
   sqlite3_xferopt_count++;
 #endif
-  iDbSrc = sqlite3SchemaToIndex(db, pSrc->pSchema);
+  iDbSrc = sqlite3SchemaToIndex2(db, pSrc->pSchema, pItem->zDatabase);
   v = sqlite3GetVdbe(pParse);
   sqlite3CodeVerifySchema(pParse, iDbSrc);
   iSrc = pParse->nTab++;
index 34a051583142b67d191af5cc695b2c27f70359fd..4170df1d257ea651da583b245cb4f96a4b3b7e2d 100644 (file)
@@ -196,6 +196,7 @@ static int lookupName(
   int eNewExprOp = TK_COLUMN;       /* New value for pExpr->op on success */
   Table *pTab = 0;                  /* Table hold the row */
   Column *pCol;                     /* A column of pTab */
+  int iDb = -1;
 
   assert( pNC );     /* the name context cannot be NULL. */
   assert( zCol );    /* The Z in X.Y.Z cannot be NULL */
@@ -223,6 +224,7 @@ static int lookupName(
         assert( db->aDb[i].zDbSName );
         if( sqlite3StrICmp(db->aDb[i].zDbSName,zDb)==0 ){
           pSchema = db->aDb[i].pSchema;
+          iDb = i;
           break;
         }
       }
@@ -254,7 +256,9 @@ static int lookupName(
           }
           if( hit || zTab==0 ) continue;
         }
-        if( zDb && pTab->pSchema!=pSchema ){
+        if( zDb 
+         && iDb!=sqlite3SchemaToIndex2(db, pTab->pSchema, pItem->zDatabase) 
+        ){
           continue;
         }
         if( zTab ){
index 7fec85a43525b77f1c67de337e514e66561a25c7..c02b282274ebc8047a567ee01ebe2a1f11dae3db 100644 (file)
@@ -4992,7 +4992,7 @@ static int selectExpander(Walker *pWalker, Select *p){
             if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){
               continue;
             }
-            iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+            iDb = sqlite3SchemaToIndex2(db, pTab->pSchema, pFrom->zDatabase);
             zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*";
           }
           for(j=0; j<pTab->nCol; j++){
@@ -6483,7 +6483,9 @@ int sqlite3Select(
         ** is better to execute the op on an index, as indexes are almost
         ** always spread across less pages than their corresponding tables.
         */
-        const int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
+        const int iDb = sqlite3SchemaToIndex2(
+            pParse->db, pTab->pSchema, pTabList->a[0].zDatabase 
+        );
         const int iCsr = pParse->nTab++;     /* Cursor to scan b-tree */
         Index *pIdx;                         /* Iterator variable */
         KeyInfo *pKeyInfo = 0;               /* Keyinfo for scanned index */
index 0a9448a71e42573cd8b0e00d61c481b0bd823f10..f3ff8d2291754d6ab6c6c0189a35c52937cc6187 100644 (file)
@@ -4468,7 +4468,7 @@ const char *sqlite3JournalModename(int);
 ** provided (enforcement of FK constraints requires the triggers sub-system).
 */
 #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
-  void sqlite3FkCheck(Parse*, Table*, int, int, int*, int);
+  void sqlite3FkCheck(Parse*, int, Table*, int, int, int*, int);
   void sqlite3FkDropTable(Parse*, SrcList *, Table*);
   void sqlite3FkActions(Parse*, int, Table*, ExprList*, int, int*, int);
   int sqlite3FkRequired(Parse*, Table*, int*, int);
@@ -4476,7 +4476,7 @@ const char *sqlite3JournalModename(int);
   FKey *sqlite3FkReferences(Table *);
 #else
   #define sqlite3FkActions(a,b,c,d,e,f,g)
-  #define sqlite3FkCheck(a,b,c,d,e,f)
+  #define sqlite3FkCheck(a,b,c,d,e,f,g)
   #define sqlite3FkDropTable(a,b,c)
   #define sqlite3FkOldmask(a,b)         0
   #define sqlite3FkRequired(a,b,c,d)    0
index 4d6c71978e221706dd573f8505fc1263b42ff32c..b0f91702b03fb2bf4acc3c624c1129ce1fd96ca0 100644 (file)
@@ -215,7 +215,7 @@ void sqlite3BeginTrigger(
 
 #ifndef SQLITE_OMIT_AUTHORIZATION
   if( !IN_RENAME_OBJECT ){
-    int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+    int iTabDb = sqlite3SchemaToIndex2(db, pTab->pSchema, 0);
     int code = SQLITE_CREATE_TRIGGER;
     const char *zDb = db->aDb[iTabDb].zDbSName;
     const char *zDbTrig = isTemp ? db->aDb[1].zDbSName : zDb;
@@ -291,7 +291,7 @@ void sqlite3FinishTrigger(
   pParse->pNewTrigger = 0;
   if( NEVER(pParse->nErr) || !pTrig ) goto triggerfinish_cleanup;
   zName = pTrig->zName;
-  iDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);
+  iDb = sqlite3SchemaToIndex2(pParse->db, pTrig->pSchema, 0);
   pTrig->step_list = pStepList;
   while( pStepList ){
     pStepList->pTrig = pTrig;
@@ -610,7 +610,7 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){
   sqlite3 *db = pParse->db;
   int iDb;
 
-  iDb = sqlite3SchemaToIndex(pParse->db, pTrigger->pSchema);
+  iDb = sqlite3SchemaToIndex2(pParse->db, pTrigger->pSchema, 0);
   assert( iDb>=0 && iDb<db->nDb );
   sqlite3SchemaWritable(pParse, iDb);
   pTable = tableOfTrigger(pTrigger);
index e3a721b2193f708531ea03dfbb215fe5c331f665..c48066a77da20f4cc9ba9f4e774fc4d299c6d6d4 100644 (file)
@@ -716,7 +716,7 @@ void sqlite3Update(
 
     /* Do FK constraint checks. */
     if( hasFK ){
-      sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey);
+      sqlite3FkCheck(pParse, iDb, pTab, regOldRowid, 0, aXRef, chngKey);
     }
 
     /* Delete the index entries associated with the current record.  */
@@ -762,7 +762,7 @@ void sqlite3Update(
     }
 
     if( hasFK ){
-      sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey);
+      sqlite3FkCheck(pParse, iDb, pTab, 0, regNewRowid, aXRef, chngKey);
     }
   
     /* Insert the new index entries and the new record. */
index 4279792696512552583bd479eb02d6e0f7d9665d..ec72cf9bde981e7bcbc75a8029c5f3e5eaefab17 100644 (file)
@@ -183,7 +183,7 @@ int sqlite3_blob_open(
       goto blob_open_out;
     }
     pBlob->pTab = pTab;
-    pBlob->zDb = db->aDb[sqlite3SchemaToIndex(db, pTab->pSchema)].zDbSName;
+    pBlob->zDb = db->aDb[sqlite3SchemaToIndex2(db,pTab->pSchema,zDb)].zDbSName;
 
     /* Now search pTab for the exact column. */
     for(iCol=0; iCol<pTab->nCol; iCol++) {
@@ -270,7 +270,7 @@ int sqlite3_blob_open(
         {OP_Halt,           0, 0, 0},  /* 5  */
       };
       Vdbe *v = (Vdbe *)pBlob->pStmt;
-      int iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+      int iDb = sqlite3SchemaToIndex2(db, pTab->pSchema, zDb);
       VdbeOp *aOp;
 
       sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, wrFlag, 
index 8a840a7a50afc3b5e369b18a8d7c19b433ee1bdd..20ece4c56cc2d390379a492c1a6f8f2dee88d8cc 100644 (file)
@@ -308,6 +308,79 @@ foreach {tn sql} {
   do_catchsql_test 5.4.$tn $sql {1 {attempt to modify read-only schema}}
 }
 
+#-------------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 6.0 {
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
+  CREATE VIEW v1 AS SELECT * FROM t1;
+}
+db close
+forcecopy test.db test.db2
+sqlite3 db test.db -reuse-schema 1
+execsql { ATTACH 'test.db2' AS aux }
+
+do_execsql_test 6.1 {
+  INSERT INTO main.t1(a) VALUES(1), (2), (3);
+  INSERT INTO aux.t1(a) VALUES(4), (5), (6);
+  CREATE TEMP TABLE t2(i,t);
+  INSERT INTO t2 VALUES(2, 'two'), (5, 'five');
+}
+
+do_execsql_test 6.2 {
+  SELECT t FROM t2 WHERE i IN (SELECT a FROM aux.t1)
+} {five}
+do_execsql_test 6.3 {
+  SELECT t FROM t2 WHERE i IN (SELECT a FROM aux.v1)
+} {five}
+
+#-------------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 7.0 {
+  CREATE TABLE p1(a PRIMARY KEY, b);
+  CREATE TABLE p2(a PRIMARY KEY, b);
+  CREATE TABLE c1(x REFERENCES p1 ON UPDATE CASCADE ON DELETE CASCADE);
+}
+
+db close
+forcecopy test.db test.db2
+sqlite3 db test.db -reuse-schema 1
+execsql { ATTACH 'test.db2' AS aux }
+
+do_execsql_test 7.1 {
+  INSERT INTO aux.p1 VALUES(1, 'one');
+  INSERT INTO aux.p1 VALUES(2, 'two');
+  PRAGMA foreign_keys = on;
+}
+
+do_execsql_test 7.2 {
+  INSERT INTO aux.c1 VALUES(2);
+}
+
+do_execsql_test 7.3.1 {
+  PRAGMA foreign_keys = off;
+  INSERT INTO main.p2 SELECT * FROM aux.p1;
+}
+do_execsql_test 7.3.2 {
+  SELECT * FROM main.p2;
+} {1 one 2 two}
+
+do_execsql_test 7.3.3 {
+  INSERT INTO aux.p2 VALUES(1, 2);
+}
+
+do_execsql_test 7.3.4 {
+  SELECT main.p2.a FROM main.p2, aux.p2;
+} {1 2}
+
+do_execsql_test 7.3.5 {
+  SELECT * FROM main.p2, aux.p2;
+} {1 one 1 2   2 two 1 2}
+
+do_execsql_test 7.4 {
+  SELECT count(*) FROM aux.p2;
+} {1}
 
 
 finish_test