]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
A better fix for the issue with RETURNING triggers on eponymous virtual tables and...
authordan <Dan Kennedy>
Thu, 13 Nov 2025 20:37:09 +0000 (20:37 +0000)
committerdan <Dan Kennedy>
Thu, 13 Nov 2025 20:37:09 +0000 (20:37 +0000)
FossilOrigin-Name: bf399992cb98e5d5f002a90b521328d5c2f113ebab8601653452d78222077bde

manifest
manifest.uuid
src/callback.c
src/hash.c
src/hash.h
src/test_bestindex.c
src/vtab.c

index bdccf18a6497a146e5741095d87074be2369fc0b..06eb89e79adb7ba8e93b47afe7618693127b7c20 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\san\sOOM\stest\scase\sfor\sthe\sissue\swith\sdropping\sRETURNING\striggers\swhen\sthe\sschema\sis\sreset\swhile\spreparing\sa\sstatement\sthat\suses\san\seponymous\svtab.
-D 2025-11-13T18:02:22.344
+C A\sbetter\sfix\sfor\sthe\sissue\swith\sRETURNING\striggers\son\seponymous\svirtual\stables\sand\sSQLITE_SCHEMA\serrors\sfirst\saddressed\sby\s[45d820ca22].
+D 2025-11-13T20:37:09.401
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -675,7 +675,7 @@ F src/btree.c 0ad524883ec4ccac3221c97bdc2c5d5f6e149504e14cf269bbed31362c3f4393
 F src/btree.h e823c46d87f63d904d735a24b76146d19f51f04445ea561f71cc3382fd1307f0
 F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886
 F src/build.c 611e07299d72ff04bbcb9e7109183467e30925d203c3e121ef9bb3cf6876289b
-F src/callback.c afa59adfaa483f668260ce69f740c8273dee3e6fee9106846e0499ebdd1ac076
+F src/callback.c 3605bbf02bd7ed46c79cd48346db4a32fc51d67624400539c0532f4eead804ad
 F src/carray.c ff6081a31878fc34df8fa1052a9cbf17ddc22652544dcb3e2326886ed1053b55
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/date.c e19e0cfff9a41bfdd884c655755f6f00bca4c1a22272b56e0dd6667b7ea893a2
@@ -687,8 +687,8 @@ F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
 F src/func.c 0b802107498048d3dcac0b757720bcb8506507ce02159e213ab8161458eb293b
 F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b
-F src/hash.c dff10fa89d4a8280b764df9599b29342ea98cba2b868dccb5dfb3c419841a3f0
-F src/hash.h c5f4a02aaf1dca835a68b51c8b906af265c6ca3d8d53d255e0453f0abce561be
+F src/hash.c 03c8c0f4be9e8bcb6de65aa26d34a61d48a9430747084a69f9469fbb00ea52ca
+F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf
 F src/hwtime.h d4d1b98c1afdc56986a5c0eba882786ef017e2180a320da25b4231b8e7e463e8
 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
 F src/insert.c dfd311b0ac2d4f6359e62013db67799757f4d2cc56cca5c10f4888acfbbfa3fd
@@ -752,7 +752,7 @@ F src/test8.c 206d8f3cc73950d252906656e2646b5de0d580b07187b635fcb3edd8c2c5fbc0
 F src/test9.c df9ddc7db6ef1b8cf745866ee229090779728bcbe660c7f297d3127ab21d92af
 F src/test_autoext.c 14d4bbd3d0bd1eec0f6d16b29e28cf1e2d0b020d454835f0721a5f68121ac10f
 F src/test_backup.c a2bfd90d2ff2511b8635507bdb30fa9b605ade19c16b533066cae3077f5bdb72
-F src/test_bestindex.c 6ce12494177116a85ad11a0d6df7eef815e57176239b9e53df4258b3e86f68eb
+F src/test_bestindex.c a9428931bec06de830b2630f57a7b1f2711761269f04df62b7aa1affcbce15bb
 F src/test_blob.c 77b994e17f2c87055f44fd96c9a206c5a7155bae2cda2769af60c2f3582f962c
 F src/test_btree.c 28283787d32b8fa953eb77412ad0de2c9895260e4e5bd5a94b3c7411664f90d5
 F src/test_config.c 18aa596d37de1d5968c439fd58ebf38bc4d9c9d1db63621504e241fde375cecd
@@ -808,7 +808,7 @@ F src/vdbemem.c 48e562ff27e6386eb8613207ac27d3d98c1f67fdc4775a1ab13759d2c2a1c021
 F src/vdbesort.c b69220f4ea9ffea5fdef34d968c60305444eea909252a81933b54c296d9cca70
 F src/vdbetrace.c 49e689f751505839742f4a243a1a566e57d5c9eaf0d33bbaa26e2de3febf7b41
 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
-F src/vtab.c 828221bdbeaaa6d62126ee6d07fd4ec0d09dcaea846f87ad01944d8b7e548859
+F src/vtab.c 5437ce986db2f70e639ce8a3fe68dcdfe64b0f1abb14eaebecdabd5e0766cc68
 F src/vxworks.h 9d18819c5235b49c2340a8a4d48195ec5d5afb637b152406de95a9436beeaeab
 F src/wal.c 505a98fbc599a971d92cb90371cf54546c404cd61e04fd093e7b0c8ff978f9b6
 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
@@ -2167,8 +2167,8 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 6a9fdde109865b23888f099d066721404e8b853f3dacd55ce08c8bbda2491ec3
-R 293a9ba450ddf977c5efff80a5fbf409
+P dc569288dd63754269e14be7a9937c882531685a3e9caec25f86ec8c01eb9583
+R 3cca0d04126ebc024323ebdc5e2b2c38
 U dan
-Z 137373639e55a850897c0a977a7f6597
+Z 8968c95a49aa85753a4838a6742c155b
 # Remove this line to create a well-formed Fossil manifest.
index a8244b1bc2466bb7832b599cf25fa8d9779fdd38..0014cf199650e9bbb054257dcc3181ec2e4a4e04 100644 (file)
@@ -1 +1 @@
-dc569288dd63754269e14be7a9937c882531685a3e9caec25f86ec8c01eb9583
+bf399992cb98e5d5f002a90b521328d5c2f113ebab8601653452d78222077bde
index 9ea3616b383307a88720140f1d8a3c00f36f19c2..e6418097f67744e261751a04ec4badcd178023d8 100644 (file)
@@ -504,17 +504,10 @@ void sqlite3SchemaClear(void *p){
   temp2 = pSchema->trigHash;
   sqlite3HashInit(&pSchema->trigHash);
   sqlite3HashClear(&pSchema->idxHash);
-  for(pElem=sqliteHashFirst(&temp2); pElem; ){
-    HashElem *pNext = sqliteHashNext(pElem);
-    Trigger *pTrig = (Trigger*)sqliteHashData(pElem);
-    if( pTrig->bReturning ){
-      /* Do not remove RETURNING triggers from the temp-triggers hash */
-      sqlite3HashTransfer(&pSchema->trigHash, &temp2, pElem);
-    }else{
-      sqlite3DeleteTrigger(&xdb, pTrig);
-    }
-    pElem = pNext;
+  for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
+    sqlite3DeleteTrigger(&xdb, (Trigger*)sqliteHashData(pElem));
   }
+
   sqlite3HashClear(&temp2);
   sqlite3HashInit(&pSchema->tblHash);
   for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){
index 670df16d8193f2ab3e24fba58038378eaba7c518..35df65808e8b59a243c318216a69c83d53641fc2 100644 (file)
@@ -271,25 +271,3 @@ void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){
   return 0;
 }
 
-/*
-** Parameter pElem is currently part of hash table pFrom. Add it to hash 
-** table pTo. 
-**
-** This procedure corrupts hash table pFrom. Specifically, it removes element
-** pElem from the list of all elements in the hash table, but may leave
-** a pointer to it in one of the hash buckets of pFrom. This is not a problem
-** because this function is only called if hash table pFrom will be cleared
-** before any further lookups or inserts are attempted.
-*/
-void sqlite3HashTransfer(Hash *pTo, Hash *pFrom, HashElem *pElem){
-  if( pElem->prev ){
-    pElem->prev->next = pElem->next; 
-  }else{
-    assert( pFrom->first==pElem );
-    pFrom->first = pElem->next;
-  }
-  pTo->count++;
-  insertElement(pTo, pTo->ht ? &pTo->ht[pElem->h % pTo->htsize] : 0, pElem);
-}
-
-
index 4cb1fbe47b08d76adafaae12c66057f4c6425ad3..cff65d6e508717c7b6ac63bf92429e1139bbc265 100644 (file)
@@ -70,7 +70,6 @@ void sqlite3HashInit(Hash*);
 void *sqlite3HashInsert(Hash*, const char *pKey, void *pData);
 void *sqlite3HashFind(const Hash*, const char *pKey);
 void sqlite3HashClear(Hash*);
-void sqlite3HashTransfer(Hash*, Hash*, HashElem *pElem);
 
 /*
 ** Macros for looping over all elements of a hash table.  The idiom is
index d2c9d65386f9fcaa9167c6a445a5dcbd8f77144f..f6b5db0fbe7f85289aa350e7b7110171825a7158 100644 (file)
@@ -221,7 +221,11 @@ static int tclConnect(
     rc = Tcl_EvalObjEx(interp, pScript, TCL_EVAL_GLOBAL);
     if( rc!=TCL_OK ){
       *pzErr = sqlite3_mprintf("%s", Tcl_GetStringResult(interp));
-      rc = SQLITE_ERROR;
+      if( sqlite3_stricmp(*pzErr, "database schema has changed")==0 ){
+        rc = SQLITE_SCHEMA;
+      }else{
+        rc = SQLITE_ERROR;
+      }
     }else{
       rc = sqlite3_declare_vtab(db, Tcl_GetStringResult(interp));
       if( rc!=SQLITE_OK ){
index e40f60873a17dc28aecf8dd12d136797ff3651bc..ed4b0afaf40dcca43eb513f71bc9bd3d5445b2d4 100644 (file)
@@ -1279,9 +1279,12 @@ int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){
   addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName));
   addModuleArgument(pParse, pTab, 0);
   addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName));
+  db->nSchemaLock++;
   rc = vtabCallConstructor(db, pTab, pMod, pModule->xConnect, &zErr);
+  db->nSchemaLock--;
   if( rc ){
     sqlite3ErrorMsg(pParse, "%s", zErr);
+    pParse->rc = rc;
     sqlite3DbFree(db, zErr);
     sqlite3VtabEponymousTableClear(db, pMod);
   }