From 23b355fb6ec3dc2fa2e9e36f6ccd4f93d7c01b6d Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 21 Oct 2026 11:25:55 +0000 Subject: [PATCH] If a reprepare fails in sqlite3_stmt_explain(), do not leave the prepared statement in an invalid state. [Bugs:/info/2026-10-21T09:18:32Z|Bug 2026-10-21T09:18:32Z]. Test cases in TH3. FossilOrigin-Name: 0ffda38c5f7f506cd14c9aedc756f2fc025fe49f0822a4ecf28451a4d2b840e0 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/vdbeapi.c | 7 ++++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e6966ec40e..5c571824c7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\svtab\shandling\sof\sSAVEPOINT. -D 2026-10-21T10:31:35.982 +C If\sa\sreprepare\sfails\sin\ssqlite3_stmt_explain(),\sdo\snot\sleave\sthe\sprepared\nstatement\sin\san\sinvalid\sstate.\n[Bugs:/info/2026-10-21T09:18:32Z|Bug\s2026-10-21T09:18:32Z].\nTest\scases\sin\sTH3. +D 2026-10-21T11:25:55.280 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -877,7 +877,7 @@ F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82 F src/vdbe.c eb3380e12110b1b88dec6327fa95b59d6015ec5649a4e10f2ea8cd1334032db3 F src/vdbe.h b6ffb28da04363fd5d439b8204118fd3f2e751abe4f8e3edb089155fb90d4607 F src/vdbeInt.h 68e5ab63f184f2871780c83ce78b425d0360869611baea4c65575f91f76ac1d3 -F src/vdbeapi.c aac3e0c3d7fc1da567c2b7040e14e9a30a1315c5c912d4d3c2d571d9a44523cb +F src/vdbeapi.c 5795719563b5d8b35a6737c3aecef2c45f6a4103715d64827ebb3174a2238490 F src/vdbeaux.c 7e3975222531284ff14cb1be93b5751f6a3392a56d86d6329fcaa120471f56f3 F src/vdbeblob.c b3f0640db9642fbdc88bd6ebcc83d6009514cafc98f062f675f2c8d505d82692 F src/vdbemem.c 1a4d79ef826159bee246831989df146fd135b5591553d681cdaff8065f504a8e @@ -2295,9 +2295,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P aa36cfe5b0f944752ace7986b2bff5dcb597fc0d456da781ed5b55e47ecb3d3c 2ec6c0ff491454f25103f368a5885a6bcd0177fa1eb0bfb2060cd5a6f8c60a72 -R 6bef2e92840e565434c6eeb23009ac59 -T +closed 2ec6c0ff491454f25103f368a5885a6bcd0177fa1eb0bfb2060cd5a6f8c60a72 +P 1d886c6abf1ed0be934d93cd7fe8d200b626a40b534e493ac15370819211bc72 +R 33e83a36050dc21838dfc500a495da9d U drh -Z 4ee88dedde2fe70f2db5843335804961 +Z b1900a927d98aa5f0d7eabdc22657a96 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f2713cf192..1164fb6198 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1d886c6abf1ed0be934d93cd7fe8d200b626a40b534e493ac15370819211bc72 +0ffda38c5f7f506cd14c9aedc756f2fc025fe49f0822a4ecf28451a4d2b840e0 diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 4cdafa1076..fa636d4dff 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -2170,9 +2170,14 @@ int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode){ v->explain = eMode; rc = SQLITE_OK; }else{ + int savedMode = v->explain; v->explain = eMode; rc = sqlite3Reprepare(v); - v->haveEqpOps = eMode==2; + if( rc ){ + v->explain = savedMode; + }else{ + v->haveEqpOps = eMode==2; + } } if( v->explain ){ v->nResColumn = 12 - 4*v->explain;