aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordan <Dan Kennedy>2021-06-22 18:06:23 +0000
committerdan <Dan Kennedy>2021-06-22 18:06:23 +0000
commit020c4f38308398795f4906b2f2669f6abb3d9137 (patch)
treedde9407f67a66f9c58a685c7e455b17b899b6ae3
parentb9f8a187deaece6a99f97de63a8a87812570d120 (diff)
downloadsqlite-020c4f38308398795f4906b2f2669f6abb3d9137.tar.gz
sqlite-020c4f38308398795f4906b2f2669f6abb3d9137.zip
Fix a problem causing sqlite3_changes() to return an incorrect value following a "DELETE FROM tbl" command on an intkey table (because internal b+tree cells were being included in the count).
FossilOrigin-Name: f662ff4746aaa43e63e20710b8cbfeeceab3183e953ac1685c41846d2e9d124c
-rw-r--r--manifest15
-rw-r--r--manifest.uuid2
-rw-r--r--src/btree.c1
-rw-r--r--test/changes.test84
-rw-r--r--test/delete.test2
5 files changed, 95 insertions, 9 deletions
diff --git a/manifest b/manifest
index 9a78c1732..6b799dd40 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Ensure\sthat\sthe\scell\sarray\sused\sin\sbalance_nonroot()\sis\salways\slarge\senough,\seven\sif\sthe\spages\sbeing\sbalanced\sare\scorrupt.
-D 2021-06-22T14:59:34.354
+C Fix\sa\sproblem\scausing\ssqlite3_changes()\sto\sreturn\san\sincorrect\svalue\sfollowing\sa\s"DELETE\sFROM\stbl"\scommand\son\san\sintkey\stable\s(because\sinternal\sb+tree\scells\swere\sbeing\sincluded\sin\sthe\scount).
+D 2021-06-22T18:06:23.070
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -485,7 +485,7 @@ F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853
F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d
F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
-F src/btree.c 195bb34aecc258cdf4093497f4e586914df0dbf84e3f4e69eb88243810886ec8
+F src/btree.c 34f14b261a0de31a2c195c88a698e940e93e112c137845c620a7149fde493300
F src/btree.h ace9c1c243612bb95c32d848e3f9e159340c2caefcb68412b441569f56328f65
F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0
F src/build.c ea28944f65b04f771e7aa5d614d406faa1bde5fe4ce882e2ead73049f03ed568
@@ -756,6 +756,7 @@ F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe
F test/carray01.test 3f2658bbddd75a013735a296ae2178ff441aca3f00ba623cfbae00b732ede792
F test/cast.test 336fa21989b5170ebcaf90c24266be22dd97b3e23d1fad5ecf6ad4efb04c4423
F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef
+F test/changes.test 5d39e302b1d8047897961fdd682b4ce74a8abae6a7ba921a949d12ad0c4a9673
F test/check.test 4a2a91ed67eee84a6be16057c48d5198b6fb24849cd6da6cd855981de3fbb416
F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014
F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760
@@ -836,7 +837,7 @@ F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed
F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef
F test/decimal.test fcf403fd5585f47342234e153c4a4338cd737b8e0884ac66fc484df47dbcf1a7
F test/default.test 9687cfb16717e4b8238c191697c98be88c0b16e568dd5368cd9284154097ef50
-F test/delete.test 438c14fdf2f2a520b63f892ea645896acf8832e2a2308578593d8e05274314b1
+F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0
F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa
F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab
F test/delete4.test 51fafebe9503a40796d1aae1565c60524cada720e50eecac01b7fd0419d9ea0b
@@ -1918,7 +1919,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P a766bba0eead47e9ff24b6afd152a7fbd331261e04dd76feb9510585a08c5786
-R 9b0dfa599c959c734c474e105e6aca28
+P 53f64e83b39cb56ac7211ffc80d06da13318e1da9dbca7b9123954f5be229a0d
+R b8b931728b78e63830e81de935919c1c
U dan
-Z f84f280f537453851309b8a740cc4fce
+Z 0889b85b76d9b21be2f69e6657d9c993
diff --git a/manifest.uuid b/manifest.uuid
index 2f50fd913..698f3426e 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-53f64e83b39cb56ac7211ffc80d06da13318e1da9dbca7b9123954f5be229a0d \ No newline at end of file
+f662ff4746aaa43e63e20710b8cbfeeceab3183e953ac1685c41846d2e9d124c \ No newline at end of file
diff --git a/src/btree.c b/src/btree.c
index b764e3de6..f6e6ec545 100644
--- a/src/btree.c
+++ b/src/btree.c
@@ -9576,6 +9576,7 @@ static int clearDatabasePage(
if( !pPage->leaf ){
rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange);
if( rc ) goto cleardatabasepage_out;
+ if( pPage->intKey ) pnChange = 0;
}
if( pnChange ){
testcase( !pPage->intKey );
diff --git a/test/changes.test b/test/changes.test
new file mode 100644
index 000000000..3b31c50c0
--- /dev/null
+++ b/test/changes.test
@@ -0,0 +1,84 @@
+# 2021 June 22
+#
+# 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.
+#
+#***********************************************************************
+#
+# Tests for the sqlite3_changes() and sqlite3_total_changes() APIs.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix changes
+
+
+foreach {tn nRow wor} {
+ 1 50 ""
+ 2 50 "WITHOUT ROWID"
+
+ 3 5000 ""
+ 4 5000 "WITHOUT ROWID"
+
+ 5 50000 ""
+ 6 50000 "WITHOUT ROWID"
+} {
+ reset_db
+ set nBig [expr $nRow]
+
+ do_execsql_test 1.$tn.0 "
+ PRAGMA journal_mode = off;
+ CREATE TABLE t1(x INTEGER PRIMARY KEY) $wor;
+ " {off}
+
+ do_execsql_test 1.$tn.1 {
+ WITH s(i) AS (
+ SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i < $nBig
+ )
+ INSERT INTO t1 SELECT i FROM s;
+ }
+
+ do_test 1.$tn.2 {
+ db changes
+ } [expr $nBig]
+
+ do_test 1.$tn.3 {
+ db total_changes
+ } [expr $nBig]
+
+ do_execsql_test 1.$tn.4 {
+ INSERT INTO t1 VALUES(-1)
+ }
+
+ do_test 1.$tn.5 {
+ db changes
+ } [expr 1]
+
+ do_test 1.$tn.6 {
+ db total_changes
+ } [expr {$nBig+1}]
+
+ do_execsql_test 1.$tn.7a {
+ SELECT count(*) FROM t1
+ } [expr {$nBig+1}]
+
+ do_execsql_test 1.$tn.7 {
+ DELETE FROM t1
+ }
+
+ do_test 1.$tn.8 {
+ db changes
+ } [expr {$nBig+1}]
+
+ do_test 1.$tn.9 {
+ db total_changes
+ } [expr {2*($nBig+1)}]
+}
+
+finish_test
+
+
diff --git a/test/delete.test b/test/delete.test
index c15ac53c6..a448e52dd 100644
--- a/test/delete.test
+++ b/test/delete.test
@@ -100,7 +100,7 @@ do_test delete-5.2.1 {
} {200}
do_test delete-5.2.2 {
execsql {DELETE FROM table1}
-} {202}
+} {200}
do_test delete-5.2.3 {
execsql {BEGIN TRANSACTION}
for {set i 1} {$i<=200} {incr i} {