mirror of
https://github.com/sqlite/sqlite.git
synced 2026-10-23 21:49:02 +03:00
Correctly rollback "OR REPLACE" changes following a "datatype mismatch" error.
[bugs:/info/2026-10-05T07:15:40Z|Bug 2026-10-05T07:15:40Z]. FossilOrigin-Name: 028f3f96a0af9fc71f1c191bbd44e0b7c3884d0571931b2808e4cdd1bb2f5081
This commit is contained in:
20
manifest
20
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.
|
||||
|
||||
@@ -1 +1 @@
|
||||
ab621a3e11ee4accce14bf6c90a7cc273d9c25a7c3d9dd2466f2bdc2bbbf8084
|
||||
028f3f96a0af9fc71f1c191bbd44e0b7c3884d0571931b2808e4cdd1bb2f5081
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user