From 005a5862a5544331fa44bb75d43d5992e8a4049b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 26 Oct 2026 01:20:04 +0000 Subject: [PATCH] Experimental fix to [bugs:/info/2026-10-25T19:26:00Z|Bug 2026-10-25T19:26:00Z] FossilOrigin-Name: efdff276d2c19f77be5b5b600084996126ec2ae3e2a7ed91f2e7d7e1916043ba --- manifest | 19 +++++++++++-------- manifest.tags | 4 ++-- manifest.uuid | 2 +- src/build.c | 10 +++++++--- src/sqliteInt.h | 1 + src/vdbeaux.c | 7 +++++++ 6 files changed, 29 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 505e8d7093..06a78bd93b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sall\srecent\sbranch-3.54\sfixes\sinto\strunk -D 2026-10-25T22:40:37.613 +C Experimental\sfix\sto\s[bugs:/info/2026-10-25T19:26:00Z|Bug\s2026-10-25T19:26:00Z] +D 2026-10-26T01:20:04.940 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -751,7 +751,7 @@ F src/btmutex.c 8a6878fcbb95b37021e4ec20d72efeb197d1b114915af73239f1b1f638b3b844 F src/btree.c a418bd8ad6f334124fb14845aab2df0bdc8d53773fba5c597be87133afa24632 F src/btree.h 2ee0ddfdf4f8530ad1d46afffd7da21a0e243bfab10973011ac6f6b7fb4109a1 F src/btreeInt.h df956bca48cd49d2a38886bc3b02045c039e8a16353f86fccd116c6487f79d82 -F src/build.c 1406d252bc5b2c3f2150edd4426e5981eabf1000944be8db8d470b96eb64ee07 +F src/build.c c30e1f3491edaac19febd957b54bbdaa0c5c192d068dc45314d7c3dccc3ebc2c F src/callback.c 3605bbf02bd7ed46c79cd48346db4a32fc51d67624400539c0532f4eead804ad F src/carray.c 9f4c9d514b4ef4e7c5efb15dbc52e9f0e5812f948977a845674ec17bf23d50f4 F src/complete.c f68f545b9c6c19e2e848672dc0e4da230072fedc335d8980b55242cc4cfa60da @@ -813,7 +813,7 @@ F src/shell.c.in d06bb3d79b22a3aef840c2fe0c1e1e909ce2146343a51029bf3943695aeaff0 F src/sqlite.h.in 5588081b98e60a771c6ee3512a9f5837ee3268130e524d5dc956601eafc737ae F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 F src/sqlite3ext.h 5e113c4c0442f2f1b3345d44cbe4b82fad45f2fc0c35f0ed4eef27fb8f1cb394 -F src/sqliteInt.h 74bdfa5d24b33e2aba9615cb53dbaf3dbbcda8e8ae0b96dc51dd251a5adce040 +F src/sqliteInt.h 2743bba279c94cdb2b1f89d54500620bbc02ab74fd28dbe64bc032141ad12072 F src/sqliteLimit.h a905209cea2a167391382f64ecd42f944863ae44eabd540ef24a70361182f5ae F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -879,7 +879,7 @@ F src/vdbe.c c5d51315f307e6a39b7f81e5d2dd680eb6d6c7435926f32f236bbcc641343268 F src/vdbe.h b6ffb28da04363fd5d439b8204118fd3f2e751abe4f8e3edb089155fb90d4607 F src/vdbeInt.h 1a2c40e1d56b074aacff260591aa30b1e3dede6cb7652b2db63e28d69ca85f29 F src/vdbeapi.c b1501e7184c5286cf2507e80bd437e8ea749997376bacaf199160c8563ef1d16 -F src/vdbeaux.c c5489043d33a689fe9016b3f99c07b27113ac68e2e1f3ef32c3612a1e96647ef +F src/vdbeaux.c c52805902c5ca4a95ceb69118c88d3ca092c6b764c19b6293a5b07a9553f1651 F src/vdbeblob.c b3f0640db9642fbdc88bd6ebcc83d6009514cafc98f062f675f2c8d505d82692 F src/vdbemem.c 29f9bf1f900c85415182e7f97cfcee296742297b3f93113927f3767eeedd8df2 F src/vdbesort.c a72ad2a629df2901fde4aa588e38590d0aa27b7d5bc3b2a416e5f295de839cc1 @@ -2301,8 +2301,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 8b1fa7497fef8e4bd36dc4614dbb33bc78f34b11300de0caff92a7da0d35a63e 53da8bd2c32db0b8d744d9660737eec1a18adec67329e4bcfcfbe1827cc4381d -R f24f1f21439fb23653e636829e56c98d +P 4fee54f1d687c2e2b4a760c59d1d29fceb81623494cf65b72c309f4922dc0a7e +R e2e9cfccfc53e616d7107a449efdcd23 +T *branch * schema-reset-appfunc +T *sym-schema-reset-appfunc * +T -sym-trunk * U drh -Z 47926794dde953eb1da7731247e9eb69 +Z 99b2f18defbfa7fb533fb631b2c331eb # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.tags b/manifest.tags index bec971799f..a2a8295e54 100644 --- a/manifest.tags +++ b/manifest.tags @@ -1,2 +1,2 @@ -branch trunk -tag trunk +branch schema-reset-appfunc +tag schema-reset-appfunc diff --git a/manifest.uuid b/manifest.uuid index e852d90762..258550f0a9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4fee54f1d687c2e2b4a760c59d1d29fceb81623494cf65b72c309f4922dc0a7e +efdff276d2c19f77be5b5b600084996126ec2ae3e2a7ed91f2e7d7e1916043ba diff --git a/src/build.c b/src/build.c index 3a46ec2e62..929901b127 100644 --- a/src/build.c +++ b/src/build.c @@ -621,8 +621,10 @@ void sqlite3CollapseDatabaseArray(sqlite3 *db){ /* ** Reset the schema for the database at index iDb. Also reset the -** TEMP schema. The reset is deferred if db->nSchemaLock is not zero. -** Deferred resets may be run by calling with iDb<0. +** TEMP schema. The reset is deferred if db->nSchemaLock is not zero +** or if there is more than one active VDBE. +** +** Deferred schema resets may be retried by calling with iDb<0. */ void sqlite3ResetOneSchema(sqlite3 *db, int iDb){ int i; @@ -633,15 +635,17 @@ void sqlite3ResetOneSchema(sqlite3 *db, int iDb){ DbSetProperty(db, iDb, DB_ResetWanted); DbSetProperty(db, 1, DB_ResetWanted); db->mDbFlags &= ~DBFLAG_SchemaKnownOk; + db->bPendingSchemaReset = 1; } - if( db->nSchemaLock==0 ){ + if( db->nSchemaLock==0 && db->nVdbeActive<=1 ){ for(i=0; inDb; i++){ if( DbHasProperty(db, i, DB_ResetWanted) ){ sqlite3SchemaClear(db->aDb[i].pSchema); db->mDbFlags &= ~DBFLAG_SchemaKnownOk; } } + db->bPendingSchemaReset = 0; } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 6913637703..6eb04e4f89 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1738,6 +1738,7 @@ struct sqlite3 { u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */ u8 eOpenState; /* Current condition of the connection */ u8 nFpDigit; /* Significant digits to keep on double->text */ + u8 bPendingSchemaReset; /* 1 or more schema resets pending */ int nextPagesize; /* Pagesize after VACUUM if >0 */ i64 nChange; /* Value returned by sqlite3_changes() */ i64 nTotalChange; /* Value returned by sqlite3_total_changes() */ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 24145a03eb..29b4f4eba3 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3527,6 +3527,13 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3ConnectionUnlocked(db); } + /* Do any pending schema resets that were deferred because multiple + ** VDBEs where active at the same time. + */ + if( db->bPendingSchemaReset && db->nVdbeActive==0 ){ + sqlite3ResetOneSchema(db, -1); + } + assert( db->nVdbeActive>0 || db->autoCommit==0 || db->nStatement==0 ); return (p->rc==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK); }