0
0
mirror of https://github.com/sqlite/sqlite.git synced 2024-11-29 00:12:23 +01:00

Avoid zeroing the value returned by sqlite3_changes() when a DML statement is automatically reprepared in sqlite3_step().

FossilOrigin-Name: 09c8f9f1970cd5b369d98a2b38f0b04d44ed095cb0bda80f7968bb6be4e0263b
This commit is contained in:
dan 2022-06-08 18:20:36 +00:00
parent 8a5469b6f5
commit 0a841a2b85
4 changed files with 109 additions and 8 deletions

View File

@ -1,5 +1,5 @@
C Improved\scomments\son\sthe\snew\squery\sflattener\srestriction\sof\sthe\sprevious\ncheck-in.\s\sAlso\sa\sNEVER()\smacro\son\san\sunreachable\sbranch.
D 2022-06-08T17:48:14.597
C Avoid\szeroing\sthe\svalue\sreturned\sby\ssqlite3_changes()\swhen\sa\sDML\sstatement\sis\sautomatically\sreprepared\sin\ssqlite3_step().
D 2022-06-08T18:20:36.188
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@ -642,7 +642,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23
F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8
F src/vdbe.c a6a20956fa128c0b8d3c5592a9a3db890a46cf626f46ffee0cab2ac5bf8d04b2
F src/vdbe.c d4c46579b471421bda8403fb0f1c7e7eaa6522653e4f06b2591a33c0ac8f77ac
F src/vdbe.h 07641758ca8b4f4c6d81ea667ea167c541e6ece21f5574da11e3d21ec37e2662
F src/vdbeInt.h ef43f7fdc5fde29fc3fd29c506c12830f366178fdb4edbbf0cbc3dfbd1278b5f
F src/vdbeapi.c 354c893f1500cf524cc45c32879b9c68893a28b77e3442c24668d6afe4236217
@ -789,6 +789,7 @@ F test/carray01.test d55d57bf66b1af1c7ac55fae66ff4910884a8f5d21a90a18797ce386212
F test/cast.test 336fa21989b5170ebcaf90c24266be22dd97b3e23d1fad5ecf6ad4efb04c4423
F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef
F test/changes.test 9dd8e597d84072122fc8a4fcdea837f4a54a461e6e536053ea984303e8ca937b
F test/changes2.test d222c0cbf5ab0ac4d7c180594e486c1bf20b2098d33e56ce33b8e12eba6823b9
F test/check.test 56e4ed457e9f8683b9fc56f5b964f461f6e8a8dd5a13f3d495408215d66419ed
F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014
F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760
@ -1975,8 +1976,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P f6c4fb48b65c2e8659aa0a1119c330e8bad5e42b2db2030850bfc9c04afef5c8
R d6732d7044bb94bfd44624855b8af4bb
U drh
Z 2d265fa1e51f92fef83d41bcbe60e67a
P 8c9e2d6315fde014bd6e25a7fa58ba054f5328c8a56e9d3d1c2d069c025a1b03
R b726c2868f8c5f923ae86ae3d88b5b1f
U dan
Z c862125e8b609e98c2c1bde6546f878f
# Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
8c9e2d6315fde014bd6e25a7fa58ba054f5328c8a56e9d3d1c2d069c025a1b03
09c8f9f1970cd5b369d98a2b38f0b04d44ed095cb0bda80f7968bb6be4e0263b

View File

@ -3880,6 +3880,11 @@ case OP_Transaction: {
}
p->expired = 1;
rc = SQLITE_SCHEMA;
/* Set changeCntOn to 0 to prevent the value returned by sqlite3_changes()
** from being modified in sqlite3VdbeHalt(). If this statement is
** reprepared, changeCntOn will be set again. */
p->changeCntOn = 0;
}
if( rc ) goto abort_due_to_error;
break;

95
test/changes2.test Normal file
View File

@ -0,0 +1,95 @@
# 2022 June 6
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix changes2
do_execsql_test 1.0 {
CREATE TABLE some_table (
id INTEGER NOT NULL, value VARCHAR(40) NOT NULL, PRIMARY KEY (id)
);
INSERT INTO some_table (id, value) VALUES (1, 'v1');
} {}
set ::stmt [sqlite3_prepare_v2 db {
UPDATE some_table SET value='v2' WHERE id=1 RETURNING id
} -1 dummy]
do_test 1.1 {
list [sqlite3_step $::stmt] [db changes]
} {SQLITE_ROW 1}
do_test 1.2 {
list [sqlite3_step $::stmt] [db changes]
} {SQLITE_DONE 1}
sqlite3_reset $::stmt
do_execsql_test 1.2 {
DROP TABLE some_table;
CREATE TABLE some_table (
id INTEGER NOT NULL, value VARCHAR(40) NOT NULL, PRIMARY KEY (id)
);
INSERT INTO some_table (id, value) VALUES (1, 'v1');
} {}
do_test 1.3 {
list [sqlite3_step $::stmt] [db changes]
} {SQLITE_ROW 1}
do_test 1.4 {
list [sqlite3_step $::stmt] [db changes]
} {SQLITE_DONE 1}
sqlite3_finalize $::stmt
#-------------------------------------------------------------------------
reset_db
do_execsql_test 2.0 {
CREATE TABLE t1(a, b);
CREATE TABLE log(t);
} {}
set ::stmt [sqlite3_prepare_v2 db {
INSERT INTO log VALUES(changes() || ' changes')
} -1 dummy]
do_execsql_test 2.1 {
INSERT INTO t1 VALUES (1, 'v1'), (2, 'v2');
} {}
do_test 2.2 {
list [sqlite3_step $::stmt] [sqlite3_reset $::stmt]
} {SQLITE_DONE SQLITE_OK}
do_execsql_test 2.3 {
CREATE TABLE t3(x);
}
do_execsql_test 2.2 {
INSERT INTO t1 VALUES (3, 'v1'), (4, 'v2');
} {}
do_test 2.3 {
list [sqlite3_step $::stmt] [sqlite3_reset $::stmt]
} {SQLITE_DONE SQLITE_OK}
sqlite3_finalize $::stmt
do_execsql_test 2.4 {
SELECT * FROM log;
} {{2 changes} {2 changes}}
finish_test