diff --git a/manifest b/manifest index 6e4aed7923..10b586bb52 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Prevent\sthe\sexpression\sgenerated\sby\sthe\scount-of-view\soptimization\sfrom\ngetting\stoo\sdeep\sand\scausing\sa\sCPU\sstack\soverflow.\n[bugs:/info/2026-10-04T05:34:47Z|Bug\s2026-10-04T05:34:47Z] -D 2026-10-05T12:18:23.826 +C Correctly\srollback\s"OR\sREPLACE"\schanges\sfollowing\sa\s"datatype\smismatch"\serror.\n[bugs:/info/2026-10-05T07:15:40Z|Bug\s2026-10-05T07:15:40Z]. +D 2026-10-05T13:27:07.501 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -760,7 +760,7 @@ F src/hash.c 03c8c0f4be9e8bcb6de65aa26d34a61d48a9430747084a69f9469fbb00ea52ca F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf F src/hwtime.h 5cb15147c8583d0fc4748e1c12ea6f38c9deaeefa147a4d8d379fd9bc81fee9a F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 68b898cb17607b36fa751b8985da06531932c502d77186f82842817286c7fd03 +F src/insert.c 482d853c980f4765f045bbea3ab095067a52cd57f47e357f9f17aa7c7fff793f F src/json.c 98b654f8316e76bdff4eaf915ba6b95335a8b77e0bcd650a107c7ac86fb16080 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 5cd4cd7ec6e1a46416806899086363fbf95eecd3bfb9a388b436c9a77243c902 @@ -800,7 +800,7 @@ F src/printf.c 4bd228ed9e9346d558362be562757ee5eef6f9bf483b7f02751ca42cf95174d3 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 0e0990f60c93db38c735d85e5d1741130e72dd0670aec204b5a39118b53c8044 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 4a3a618a4b800e7805cbb5f66600c3148afb637bb356a585ce4ed7704d9cddfc +F src/select.c 088184992ed43f1bf3cb520fcb16783c449dfa0a15bcde8d0bc98c40afb66f59 F src/shell.c.in 8504577eb02e87b58f9d632bc4458efda074476428774692207ddacc0fe9e1df F src/sqlite.h.in 884996e07cfb7681efc76661b79d56a93f9edaea7f6fc4a3c82636dc84783486 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 @@ -862,7 +862,7 @@ F src/threads.c 85d8b9f05f78211c61e3739ab5db761d7118766d1916ae7f2764735106bc4e13 F src/tokenize.c e9d52d9f7374d82dadcd11726bea8a597d43709d6672704f3f0375bf1d726912 F src/treeview.c feaa59f14db4f7b5aacca9c5ad5aeb562c1f98262c1ffd74371f4186ade91fc5 F src/trigger.c d6d8991ca346eb6f56e50a3c5df486176b67a9179336798a75bb05e622c72cac -F src/update.c 8cd088a0ce9536b9c81b300a18d0d6dc40025150efc42641edeecb409693023c +F src/update.c 2c5ea3803c19e5726960df9416a50759322d750b820db7d2b623b4f122e25bf9 F src/upsert.c dd9f0fcccbfb4f20e1026a21a7254ba3f2c08e9cfa92affaff5b5ec3b00ea549 F src/utf.c c5bec56770b71fe75e12f1f7b0a512032e1fd3d1f83c50c4ab4474ced20347a4 F src/util.c 4437408e09cef6dbb63a8b8ba28be53bdc098ec890e5e64ad7ae1fc83448962e @@ -871,7 +871,7 @@ F src/vdbe.c 134147162547f7d02e96aad416c7922185a47e4568327cbf773cc7de313c4310 F src/vdbe.h b6ffb28da04363fd5d439b8204118fd3f2e751abe4f8e3edb089155fb90d4607 F src/vdbeInt.h 68e5ab63f184f2871780c83ce78b425d0360869611baea4c65575f91f76ac1d3 F src/vdbeapi.c 8015628172d959885d5df592b9ddc07c66a803f61f86f1197cc17929c095b2ca -F src/vdbeaux.c 1d8190de670cfa4df06f5e57a2c5b54d018c1ffb13c722fb7507ec52a80cc849 +F src/vdbeaux.c 2d8fbc71164f99e4d15dab08b9c7d76b8d1ff12d595cdd6bca1f9e9af455d031 F src/vdbeblob.c b3f0640db9642fbdc88bd6ebcc83d6009514cafc98f062f675f2c8d505d82692 F src/vdbemem.c b2113c949e2ed918294e16a5ebaacdaca6be4f820f670517e3362e94c7019432 F src/vdbesort.c a72ad2a629df2901fde4aa588e38590d0aa27b7d5bc3b2a416e5f295de839cc1 @@ -1051,7 +1051,7 @@ F test/collateB.test 9c840e21f9aead6fc533cea310f0bd202d5c11511088811b7e93ae7b47f F test/colmeta.test 248a644cec4c7c371cf1e107fd8fdba708dc290866c572672b6260e3466cce79 F test/colname.test 30f7fff482c141bf5baecfbbba4e22686ac4c581fae53a511908be8439fe48a7 F test/columncount.test 6fe99c2f35738b0129357a1cf3fa483f76140f4cd8a89014c88c33c876d2638f -F test/conflict.test 3307ffdf988e04b01c4e942d8aa369a977f085bf629f43a627c9a77f39d65926 +F test/conflict.test 348aa477f658217b8d3dd55ddfeffc500b5e76a1dfb8a432e29a0cefbf2930f3 F test/conflict2.test 5557909ce683b1073982f5d1b61dfb1d41e369533bfdaf003180c5bc87282dd1 F test/conflict3.test 45b32ba8b7a61c3aa48f6a070aeda7963b99fd4d8ac295ab752bf8c0399d931d F test/conflict4.test ac0d4274d63dc3531707c78d112b1f2411a03a71b9801a237fb325d2ff76f0a1 @@ -2278,8 +2278,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 9f7490065e24fc69a5fc13371aeb40214d617209bb0cd9a3e23f76486d4704c0 -R 932fb3569b3e3e840240d24b9e4a4ce9 +P ab621a3e11ee4accce14bf6c90a7cc273d9c25a7c3d9dd2466f2bdc2bbbf8084 +R 37d3c9c63bc981c184a1fc0804555bf0 U drh -Z aec6e6d5a2f843fd5690eceafb628e31 +Z 563cfdd58a0d9f9b8f6b13202e58bd27 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1a9eb5d237..3789443d03 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ab621a3e11ee4accce14bf6c90a7cc273d9c25a7c3d9dd2466f2bdc2bbbf8084 +028f3f96a0af9fc71f1c191bbd44e0b7c3884d0571931b2808e4cdd1bb2f5081 diff --git a/src/insert.c b/src/insert.c index 968738a806..0a63776009 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1458,6 +1458,7 @@ void sqlite3Insert( sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); VdbeCoverage(v); + sqlite3MayAbort(pParse); } /* Copy the new data already generated. */ @@ -1526,6 +1527,7 @@ void sqlite3Insert( sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, addr1+2); VdbeCoverage(v); } sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); VdbeCoverage(v); + sqlite3MayAbort(pParse); } }else if( IsVirtual(pTab) || withoutRowid ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regRowid); diff --git a/src/select.c b/src/select.c index d877f9ad6b..25ed927b5c 100644 --- a/src/select.c +++ b/src/select.c @@ -2613,6 +2613,7 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ sqlite3ExprCode(pParse, pLimit->pLeft, iLimit); sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v); VdbeComment((v, "LIMIT counter")); + sqlite3MayAbort(pParse); sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); VdbeCoverage(v); } if( pLimit->pRight ){ @@ -2620,6 +2621,7 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ pParse->nMem++; /* Allocate an extra register for limit+offset */ sqlite3ExprCode(pParse, pLimit->pRight, iOffset); sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v); + sqlite3MayAbort(pParse); VdbeComment((v, "OFFSET counter")); sqlite3VdbeAddOp3(v, OP_OffsetLimit, iLimit, iOffset+1, iOffset); VdbeComment((v, "LIMIT+OFFSET")); diff --git a/src/update.c b/src/update.c index bde0fa215b..ea17e96c55 100644 --- a/src/update.c +++ b/src/update.c @@ -903,6 +903,7 @@ void sqlite3Update( sqlite3VdbeAddOp3(v, OP_Column, iEph, iRowidExpr, regNewRowid); } sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid); VdbeCoverage(v); + sqlite3MayAbort(pParse); } /* Compute the old pre-UPDATE content of the row being changed, if that diff --git a/src/vdbeaux.c b/src/vdbeaux.c index cecd4b266b..0d22da9c5c 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -793,6 +793,7 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ || opcode==OP_Function || opcode==OP_PureFunc || ((opcode==OP_Halt || opcode==OP_HaltIfNull) && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) + || (opcode==OP_MustBeInt && pOp->p2==0) ){ hasAbort = 1; break; diff --git a/test/conflict.test b/test/conflict.test index 54c01d36de..b8be65a2b8 100644 --- a/test/conflict.test +++ b/test/conflict.test @@ -888,4 +888,35 @@ do_execsql_test conflict-16.5 { SELECT a FROM t1 ORDER BY a; } {4 6} +# Bug 2026-10-05T07:15:40Z +# +do_execsql_test conflict-17.1 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a INTEGER PRIMARY KEY); + BEGIN; +} +do_catchsql_test conflict-17.2 { + INSERT OR REPLACE INTO t1 VALUES (1),('a'); +} {1 {datatype mismatch}} +do_execsql_test conflict-17.3 { + COMMIT; + SELECT count(*) FROM t1; +} 0 + +do_execsql_test conflict-17.4 { + DROP TABLE t1; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + INSERT INTO t1 VALUES (1,'x'),(2,'y'); + BEGIN; +} +do_catchsql_test conflict-17.5 { + UPDATE OR REPLACE t1 SET a = CASE a WHEN 1 THEN 10 ELSE 'z' END; +} {1 {datatype mismatch}} +do_execsql_test conflict-17.6 { + COMMIT; + SELECT * FROM t1; +} {1 x 2 y} + + + finish_test