]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix further REUSE_SCHEMA issues.
authordan <dan@noemail.net>
Fri, 16 Nov 2018 17:04:58 +0000 (17:04 +0000)
committerdan <dan@noemail.net>
Fri, 16 Nov 2018 17:04:58 +0000 (17:04 +0000)
FossilOrigin-Name: 9780829a77a49b199a55e56d21a51d33fee50321621337afabe5a6f977a65eee

manifest
manifest.uuid
src/alter.c
src/analyze.c
src/build.c
src/delete.c
src/insert.c
src/sqliteInt.h
src/update.c
test/reuse1.test

index 0dfcf2a90c74266b429062f0ea65821cc4933dca..c9efaa586a985cbf5c7d61d3a0a70f898d1f28f9 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\ssome\sproblems\swith\sthe\sfeature\son\sthis\sbranch.\sMany\sproblems\sremain.
-D 2018-11-15T21:20:56.480
+C Fix\sfurther\sREUSE_SCHEMA\sissues.
+D 2018-11-16T17:04:58.793
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in edbb6e20bb1decf65f6c64c9e61004a69bdf8afb39cdce5337c916b03dfcd1e3
@@ -438,8 +438,8 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca
 F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
-F src/alter.c 59fa34093fdf62a4049f847c651216f8fc91da494f86cbea35207b115dc4e82c
-F src/analyze.c 44f9189faccf08fbd547b3e232bec559f3669eeec3118751f26512e901698db5
+F src/alter.c 486cfbe8882eddab4906b939163ba1f5ae0cfa84bc472a6e2979dabef4d11111
+F src/analyze.c 09c9684253a328735c63f714e1c50360e977b4020b7b1325d11dd46f2f192123
 F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a
 F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df
 F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab
@@ -448,14 +448,14 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c 3ef104ecae8b1b5f0458be1f5fa7c1ecf25fdc322a9d63bb8151f89eb32d381e
 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2
 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96
-F src/build.c ce75a5834f17a047fb86b561a1f53dc1ac41d1c8c623f69d74511175a48c1284
+F src/build.c 82e919819295b32600e2c544bb2170c6fa2e237ec3c5f7a16e69f107391c110c
 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 70817a92a61ba2621c15f0250064d4c451de747eb2a427cf2bc8736fabf21f9f
+F src/delete.c b807916831c59ca377a59c7ac1574b66f7fac0f11cf056296e29b8a74df20287
 F src/expr.c 9aacc0b72348ba90010b672dcbbbe2fa56e1182043bc917a3a147b2bc57a5497
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 029a6f10f740b366303a572796f6f21a878ecda9f8cb1614bb4c344d5df6e9aa
@@ -465,7 +465,7 @@ 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 e0dbee655b327d21670c143a7abf6a0a4b384633c100cfeb1c6ce3dce34f0216
+F src/insert.c 7a0d37e69bc2eb4665469ffcb908fd6bbb15d31d050f52e8614194686673f393
 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
 F src/loadext.c 448eab53ecdb566a1259ee2d45ebff9c0bc4a2cf393774488775c33e4fbe89bf
 F src/main.c 2bbab4122a28c10ff98e5497a15fdfde1d7a075a659739448a61ef0c09a30d19
@@ -509,7 +509,7 @@ F src/shell.c.in 9f517c22e3c9a08ab634330789f74454ec9a7e0596c8faed221c6b43ee980b9
 F src/sqlite.h.in 29a3b2eab328c5a345ef6be09ff77dc6dabbfe1a36e05c19204591d084a73d80
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683
-F src/sqliteInt.h 47d235a0c1b7a8d210a0a82b27e395c5adba0ddd42fc9f070de18ac17e3023c7
+F src/sqliteInt.h 86c36aec093a8280292e64c0118e491dfe5292098be7df46d501158381f84f71
 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
 F src/status.c b651e68af3cb859e4083c79e0e7177e2aeb35ed23e3892d7bbe5b732d38bf2b9
 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@ -570,7 +570,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
 F src/tokenize.c 9e781e1ca80eefe7b5d6a9e2cd5c678c847da55fd6f093781fad7950934d4c83
 F src/treeview.c 7b12ac059de54c939b6eb0dbffc9410c29c80d2470cee5cbe07d5ff9ea2d9253
 F src/trigger.c 6e970e8d2d4bb805faed88ccbc3f5cc0552822b4c88d655d79197a29925392c1
-F src/update.c 9e05b1eb83dbfa778f76ca8666c403b0a45d449546a27303fce86cbc75fa07d8
+F src/update.c 34d648f44f7d0e1539581c05824fc79a8129e411b47f26714d43111cc319f222
 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
@@ -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 319bf426a1b86d9cf732cb2fb8a58f6fcbf03028868057a7d11a20f60b3ce8f2
+F test/reuse1.test 834fa819c19ab197462c8520405393ac2e70108be200ef12bf7b558b5abfc614
 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 ae88f8e1ffc33748e45308c21ba83499228ae05344df81e41dd61e14a1270588
-R 740a0a9e9ba5fc4d27352073aa3c155e
+P 31b6aee755c81d69aeaf3ae197e510d38e5e3bb83ded44c33379bcd0d4c23300
+R 4487e5748c054c5551f07a85ca239f7f
 U dan
-Z 1fe3247f080874c257f8285203414ee8
+Z 6cd2fe1c8ff96cf32727bfbf3108f16b
index 7496447a89e567f235bbba49973d0dc04d58a4f3..272a569bd28b03c22cc75145709a8c276fd0090c 100644 (file)
@@ -1 +1 @@
-31b6aee755c81d69aeaf3ae197e510d38e5e3bb83ded44c33379bcd0d4c23300
\ No newline at end of file
+9780829a77a49b199a55e56d21a51d33fee50321621337afabe5a6f977a65eee
\ No newline at end of file
index 71477a9fb2a603ad221e6bd2b5c4fbbc4f6c92ca..1a1a21f1fb79ee453ff240c64ebee65e0f6bcce6 100644 (file)
@@ -106,7 +106,7 @@ void sqlite3AlterRenameTable(
 
   pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]);
   if( !pTab ) goto exit_rename_table;
-  iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
+  iDb = sqlite3SchemaToIndex2(pParse->db, pTab->pSchema, 0);
   zDb = db->aDb[iDb].zDbSName;
   db->mDbFlags |= DBFLAG_PreferBuiltin;
 
@@ -276,7 +276,7 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
   assert( pNew );
 
   assert( sqlite3BtreeHoldsAllMutexes(db) );
-  iDb = sqlite3SchemaToIndex(db, pNew->pSchema);
+  iDb = sqlite3SchemaToIndex2(db, pNew->pSchema, 0);
   zDb = db->aDb[iDb].zDbSName;
   zTab = &pNew->zName[16];  /* Skip the "sqlite_altertab_" prefix on the name */
   pCol = &pNew->aCol[pNew->nCol-1];
@@ -429,7 +429,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
   }
 
   assert( pTab->addColOffset>0 );
-  iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+  iDb = sqlite3SchemaToIndex2(db, pTab->pSchema, 0);
 
   /* Put a copy of the Table struct in Parse.pNewTable for the
   ** sqlite3AddColumn() function and friends to modify.  But modify
@@ -530,7 +530,7 @@ void sqlite3AlterRenameColumn(
   if( SQLITE_OK!=isRealTable(pParse, pTab) ) goto exit_rename_column;
 
   /* Which schema holds the table to be altered */  
-  iSchema = sqlite3SchemaToIndex(db, pTab->pSchema);
+  iSchema = sqlite3SchemaToIndex2(db, pTab->pSchema, 0);
   assert( iSchema>=0 );
   zDb = db->aDb[iSchema].zDbSName;
 
@@ -1058,7 +1058,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){
   sNC.pParse = pParse;
   assert( pNew->pTabSchema );
   pParse->pTriggerTab = sqlite3FindTable(db, pNew->table, 
-      db->aDb[sqlite3SchemaToIndex(db, pNew->pTabSchema)].zDbSName
+      db->aDb[sqlite3SchemaToIndex2(db, pNew->pTabSchema, 0)].zDbSName
   );
   pParse->eTriggerOp = pNew->op;
   /* ALWAYS() because if the table of the trigger does not exist, the
@@ -1575,7 +1575,7 @@ static void renameTableTest(
           rc = renameResolveTrigger(&sParse, bTemp ? 0 : zDb);
         }
         if( rc==SQLITE_OK ){
-          int i1 = sqlite3SchemaToIndex(db, sParse.pNewTrigger->pTabSchema);
+          int i1 = sqlite3SchemaToIndex2(db, sParse.pNewTrigger->pTabSchema, 0);
           int i2 = sqlite3FindDbName(db, zDb);
           if( i1==i2 ) sqlite3_result_int(context, 1);
         }
index f8d69dc527f51d5e20f16f872b1685b300fb807c..0116138beeb2890ade8aa8cd41f43fa339346eb0 100644 (file)
@@ -979,6 +979,7 @@ static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){
 */
 static void analyzeOneTable(
   Parse *pParse,   /* Parser context */
+  int iDb,         /* Database that contains table pTab */
   Table *pTab,     /* Table whose indices are to be analyzed */
   Index *pOnlyIdx, /* If not NULL, only analyze this one index */
   int iStatCur,    /* Index of VdbeCursor that writes the sqlite_stat1 table */
@@ -992,7 +993,6 @@ static void analyzeOneTable(
   Vdbe *v;                     /* The virtual machine being built up */
   int i;                       /* Loop counter */
   int jZeroRows = -1;          /* Jump from here if number of rows is zero */
-  int iDb;                     /* Index of database containing pTab */
   u8 needTableCnt = 1;         /* True to count the table */
   int regNewRowid = iMem++;    /* Rowid for the inserted record */
   int regStat4 = iMem++;       /* Register to hold Stat4Accum object */
@@ -1023,7 +1023,6 @@ static void analyzeOneTable(
     return;
   }
   assert( sqlite3BtreeHoldsAllMutexes(db) );
-  iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
   assert( iDb>=0 );
   assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
 #ifndef SQLITE_OMIT_AUTHORIZATION
@@ -1118,7 +1117,7 @@ static void analyzeOneTable(
     pParse->nMem = MAX(pParse->nMem, regPrev+nColTest);
 
     /* Open a read-only cursor on the index being analyzed. */
-    assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) );
+    assert( db->aDb[iDb].pSchema==pIdx->pSchema );
     sqlite3VdbeAddOp3(v, OP_OpenRead, iIdxCur, pIdx->tnum, iDb);
     sqlite3VdbeSetP4KeyInfo(pParse, pIdx);
     VdbeComment((v, "%s", pIdx->zName));
@@ -1339,7 +1338,6 @@ static void analyzeDatabase(Parse *pParse, int iDb){
   int iMem;
   int iTab;
 
-  sqlite3SchemaWritable(pParse, iDb);
   sqlite3BeginWriteOperation(pParse, 0, iDb);
   iStatCur = pParse->nTab;
   pParse->nTab += 3;
@@ -1349,7 +1347,7 @@ static void analyzeDatabase(Parse *pParse, int iDb){
   assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
   for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){
     Table *pTab = (Table*)sqliteHashData(k);
-    analyzeOneTable(pParse, pTab, 0, iStatCur, iMem, iTab);
+    analyzeOneTable(pParse, iDb, pTab, 0, iStatCur, iMem, iTab);
   }
   loadAnalysis(pParse, iDb);
 }
@@ -1359,13 +1357,11 @@ static void analyzeDatabase(Parse *pParse, int iDb){
 ** a database.  If pOnlyIdx is not NULL then it is a single index
 ** in pTab that should be analyzed.
 */
-static void analyzeTable(Parse *pParse, Table *pTab, Index *pOnlyIdx){
-  int iDb;
+static void analyzeTable(Parse *pParse, int iDb, Table *pTab, Index *pOnlyIdx){
   int iStatCur;
 
   assert( pTab!=0 );
   assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
-  iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
   sqlite3BeginWriteOperation(pParse, 0, iDb);
   iStatCur = pParse->nTab;
   pParse->nTab += 3;
@@ -1374,7 +1370,9 @@ static void analyzeTable(Parse *pParse, Table *pTab, Index *pOnlyIdx){
   }else{
     openStatTable(pParse, iDb, iStatCur, pTab->zName, "tbl");
   }
-  analyzeOneTable(pParse, pTab, pOnlyIdx, iStatCur,pParse->nMem+1,pParse->nTab);
+  analyzeOneTable(pParse, iDb, pTab, 
+      pOnlyIdx, iStatCur, pParse->nMem+1, pParse->nTab
+  );
   loadAnalysis(pParse, iDb);
 }
 
@@ -1425,9 +1423,9 @@ void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){
       z = sqlite3NameFromToken(db, pTableName);
       if( z ){
         if( (pIdx = sqlite3FindIndex(db, z, zDb))!=0 ){
-          analyzeTable(pParse, pIdx->pTable, pIdx);
+          analyzeTable(pParse, iDb, pIdx->pTable, pIdx);
         }else if( (pTab = sqlite3LocateTable(pParse, 0, z, zDb))!=0 ){
-          analyzeTable(pParse, pTab, 0);
+          analyzeTable(pParse, iDb, pTab, 0);
         }
         sqlite3DbFree(db, z);
       }
index 084a73d4362543b4745f58d20db5ccba823febba..519fa94669e6586779954ddf4fc731577ca4c590 100644 (file)
@@ -266,7 +266,9 @@ void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){
   memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ);
   memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ);
   sqlite3RunParser(pParse, zSql, &zErrMsg);
-  sqlite3DbFree(db, zErrMsg);
+  if( zErrMsg ){
+    sqlite3ErrorMsg(pParse, "%z", zErrMsg);
+  }
   sqlite3DbFree(db, zSql);
   memcpy(PARSE_TAIL(pParse), saveBuf, PARSE_TAIL_SZ);
   pParse->nested--;
@@ -3535,7 +3537,7 @@ void sqlite3CreateIndex(
   ** sure all indices labeled OE_Replace come after all those labeled
   ** OE_Ignore.  This is necessary for the correct constraint check
   ** processing (in sqlite3GenerateConstraintChecks()) as part of
-  ** UPDATE and INSERT statements.  
+  ** UPDATE and INSERT statements.
   */
   if( db->init.busy || pTblName==0 ){
     if( onError!=OE_Replace || pTab->pIndex==0
index c0b94e73a6744f6908554a2bca4a5e02a413f6c4..45f200f8dcf78b68562d5d8699b8a0d0b3860a8c 100644 (file)
@@ -663,7 +663,7 @@ delete_from_cleanup:
 */
 void sqlite3GenerateRowDelete(
   Parse *pParse,     /* Parsing context */
-  int iDb,
+  int iDb,           /* Database containing pTab */
   Table *pTab,       /* Table containing the row to be deleted */
   Trigger *pTrigger, /* List of triggers to (potentially) fire */
   int iDataCur,      /* Cursor from which column data is extracted */
index 5f5ca7afd6ba5b767a4ea0613e46e578ab4c4c05..84c8021594da280a5d16f4a4834e36adebf84ddb 100644 (file)
@@ -1037,8 +1037,9 @@ void sqlite3Insert(
     {
       int isReplace;    /* Set to true if constraints may cause a replace */
       int bUseSeek;     /* True to use OPFLAG_SEEKRESULT */
-      sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur,
-          regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0, pUpsert
+      sqlite3GenerateConstraintChecks(pParse, iDb, pTab, aRegIdx, iDataCur, 
+          iIdxCur, regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 
+          0, pUpsert
       );
       sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0);
 
@@ -1274,6 +1275,7 @@ int sqlite3ExprReferencesUpdatedColumn(
 */
 void sqlite3GenerateConstraintChecks(
   Parse *pParse,       /* The parser context */
+  int iDb,             /* Databse that contains pTab */
   Table *pTab,         /* The table being inserted or updated */
   int *aRegIdx,        /* Use register aRegIdx[i] for index i.  0 for unused */
   int iDataCur,        /* Canonical data cursor (main table or PK index) */
@@ -1557,8 +1559,8 @@ void sqlite3GenerateConstraintChecks(
         }
         if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){
           sqlite3MultiWrite(pParse);
-          sqlite3GenerateRowDelete(pParse, 0, pTab, pTrigger, iDataCur, iIdxCur,
-                                   regNewData, 1, 0, OE_Replace, 1, -1);
+          sqlite3GenerateRowDelete(pParse, iDb, pTab, pTrigger, iDataCur, 
+                                  iIdxCur, regNewData, 1, 0, OE_Replace, 1, -1);
         }else{
 #ifdef SQLITE_ENABLE_PREUPDATE_HOOK
           assert( HasRowid(pTab) );
@@ -1806,7 +1808,7 @@ void sqlite3GenerateConstraintChecks(
         if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){
           sqlite3MultiWrite(pParse);
         }
-        sqlite3GenerateRowDelete(pParse, 0, pTab, pTrigger, iDataCur, iIdxCur,
+        sqlite3GenerateRowDelete(pParse, iDb, pTab, pTrigger, iDataCur, iIdxCur,
             regR, nPkField, 0, OE_Replace,
             (pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur);
         seenReplace = 1;
index 3bddaf75c47ce53106a9e99bf81170adaf43313c..0a9448a71e42573cd8b0e00d61c481b0bd823f10 100644 (file)
@@ -4036,7 +4036,7 @@ void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int);
 int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int);
 void sqlite3ResolvePartIdxLabel(Parse*,int);
 int sqlite3ExprReferencesUpdatedColumn(Expr*,int*,int);
-void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int,
+void sqlite3GenerateConstraintChecks(Parse*,int,Table*,int*,int,int,int,int,
                                      u8,u8,int,int*,int*,Upsert*);
 #ifdef SQLITE_ENABLE_NULL_TRIM
   void sqlite3SetMakeRecordP5(Vdbe*,Table*);
index c482e734b1ad3da8484496adba4d8561b20488cf..e3a721b2193f708531ea03dfbb215fe5c331f665 100644 (file)
@@ -710,9 +710,9 @@ void sqlite3Update(
 
     /* Do constraint checks. */
     assert( regOldRowid>0 );
-    sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur,
-        regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace,
-        aXRef, 0);
+    sqlite3GenerateConstraintChecks(pParse, iDb, pTab, aRegIdx, iDataCur, 
+        iIdxCur, regNewRowid, regOldRowid, chngKey, onError, labelContinue, 
+        &bReplace, aXRef, 0);
 
     /* Do FK constraint checks. */
     if( hasFK ){
index 50f609d7b872e29ffedb949c4adb145718918912..8a840a7a50afc3b5e369b18a8d7c19b433ee1bdd 100644 (file)
@@ -121,6 +121,8 @@ ifcapable fts5 {
   } {1 aux1 2 aux2 3 aux3}
 }
 
+#-------------------------------------------------------------------------
+#
 reset_db
 forcedelete test.db2
 do_execsql_test 3.0 {
@@ -197,6 +199,117 @@ do_execsql_test 3.13.3 {
   SELECT * FROM v1;
 } {1 2 3 x y z}
 
+#-------------------------------------------------------------------------
+#
+reset_db
+forcedelete test.db2
+do_execsql_test 4.0 {
+  CREATE TABLE t1(a PRIMARY KEY, b, c UNIQUE);
+  CREATE TABLE del(a, b, c);
+  CREATE TRIGGER tr1 AFTER DELETE ON t1 BEGIN
+    INSERT INTO del VALUES(old.a, old.b, old.c);
+  END;
+}
+forcecopy test.db test.db2
+
+db close
+sqlite3 db test.db -reuse-schema 1
+execsql { 
+  ATTACH 'test.db2' AS aux;
+  PRAGMA recursive_triggers = 1;
+}
+
+do_execsql_test 4.1 {
+  INSERT INTO main.t1 VALUES(1, 2, 3);
+  INSERT INTO aux.t1 VALUES(4, 5, 6);
+}
+
+do_execsql_test 4.2.1 {
+  INSERT OR REPLACE INTO aux.t1 VALUES('a', 'b', 6);
+  SELECT * FROM aux.t1;
+} {a b 6}
+do_execsql_test 4.2.2 { SELECT * FROM aux.del  } {4 5 6}
+do_execsql_test 4.2.3 { SELECT * FROM main.del } {}
+
+do_execsql_test 4.3.1 {
+  INSERT INTO aux.t1 VALUES('x', 'y', 'z');
+  UPDATE OR REPLACE aux.t1 SET c='z' WHERE a='a';
+} {}
+do_execsql_test 4.3.2 { SELECT * FROM aux.del  } {4 5 6 x y z}
+do_execsql_test 4.3.3 { SELECT * FROM main.del } {}
+
+#-------------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 5.0 {
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
+  CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
+  CREATE INDEX i1 ON t1(b);
+  INSERT INTO t1 VALUES(1, 2, 3), (4, 5, 6);
+  ANALYZE;
+  PRAGMA writable_schema = 1;
+  DELETE FROM sqlite_stat1;
+}
+db close
+forcecopy test.db test.db2
+sqlite3 db test.db -reuse-schema 1
+execsql { ATTACH 'test.db2' AS aux }
+
+foreach {tn sql} {
+  1 { CREATE TABLE t3(x) }
+  2 { DROP TABLE t2 }
+  3 { CREATE INDEX i2 ON t2(b) }
+  4 { DROP INDEX i1 }
+  5 { ALTER TABLE t1 ADD COLUMN d }
+  6 { ALTER TABLE t1 RENAME TO t3 }
+  7 { ALTER TABLE t1 RENAME c TO d }
+} {
+  do_catchsql_test 5.1.$tn $sql {1 {attempt to modify read-only schema}}
+}
+
+do_execsql_test 5.2.1 { ANALYZE aux.t1 } {}
+do_execsql_test 5.2.2 { SELECT * FROM aux.sqlite_stat1  } {t1 i1 {2 1}}
+do_execsql_test 5.2.3 { SELECT * FROM main.sqlite_stat1 } {}
+
+do_test 5.3.0 {
+  sqlite3 db2 test.db2
+  db2 eval { 
+    PRAGMA writable_schema = 1;
+    DELETE FROM sqlite_stat1;
+  }
+} {}
+
+do_execsql_test 5.3.1 { SELECT * FROM aux.sqlite_stat1  } {}
+do_execsql_test 5.3.2 { ANALYZE aux } {}
+do_execsql_test 5.3.3 { SELECT * FROM aux.sqlite_stat1  } {t1 i1 {2 1}}
+do_execsql_test 5.3.4 { SELECT * FROM main.sqlite_stat1 } {}
+
+#-------------------------------------------------------------------------
+# Attempting to run ANALYZE when the required sqlite_statXX functions
+# are missing is an error (because it would modify the database schema).
+#
+reset_db
+do_execsql_test 5.4 {
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
+  CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
+  CREATE INDEX i1 ON t1(b);
+  INSERT INTO t1 VALUES(1, 2, 3), (4, 5, 6);
+}
+db close
+sqlite3 db test.db -reuse-schema 1
+foreach {tn sql} {
+  1 { ANALYZE }
+  2 { ANALYZE t1 }
+  3 { ANALYZE i1 }
+  4 { ANALYZE main }
+  5 { ANALYZE main.t1 }
+  6 { ANALYZE main.i1 }
+} {
+  do_catchsql_test 5.4.$tn $sql {1 {attempt to modify read-only schema}}
+}
+
+
 
 finish_test
 
+