From: dan Date: Tue, 6 Sep 2022 19:38:06 +0000 (+0000) Subject: Tests and a fix for the SQLITE_RECOVER_ROWIDS option. X-Git-Tag: version-3.40.0~91^2~38 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=497b3e6a1152e58be842fa17dee247360aaf8888;p=thirdparty%2Fsqlite.git Tests and a fix for the SQLITE_RECOVER_ROWIDS option. FossilOrigin-Name: 1d5000f5718004110776ff58284d824854a93fe1cd1f6d8a4e8b8b0c2b2c3076 --- diff --git a/ext/recover/recoverrowid.test b/ext/recover/recoverrowid.test new file mode 100644 index 0000000000..3dfafbcc7f --- /dev/null +++ b/ext/recover/recoverrowid.test @@ -0,0 +1,58 @@ +# 2022 September 07 +# +# 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 SQLITE_RECOVER_ROWIDS option. +# + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source [file join [file dirname [info script]] recover_common.tcl] +source $testdir/tester.tcl +set testprefix recoverrowid + +ifcapable !vtab { + finish_test; return +} + +proc recover {db bRowids output} { + forcedelete $output + + set R [sqlite3_recover_init db main test.db2] + $R config rowids $bRowids + $R step + $R finish +} + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 1), (2, 2), (3, 3), (4, 4); + DELETE FROM t1 WHERE a IN (1, 3); +} + +do_test 1.1 { + recover db 0 test.db2 + sqlite3 db2 test.db2 + execsql { SELECT rowid, a, b FROM t1 ORDER BY rowid} db2 +} {1 2 2 2 4 4} + +do_test 1.2 { + db2 close + recover db 1 test.db2 + sqlite3 db2 test.db2 + execsql { SELECT rowid, a, b FROM t1 ORDER BY rowid} db2 +} {2 2 2 4 4 4} +db2 close + + + + +finish_test diff --git a/ext/recover/sqlite3recover.c b/ext/recover/sqlite3recover.c index f4bf5c0e4f..df6ab36b98 100644 --- a/ext/recover/sqlite3recover.c +++ b/ext/recover/sqlite3recover.c @@ -403,14 +403,22 @@ static int recoverOpenOutput(sqlite3_recover *p){ sqlite3_free(zSql); } - + /* Truncate the output database. This is done by opening a new, empty, + ** temp db, then using the backup API to clobber any existing output db + ** with a copy of it. */ if( rc==SQLITE_OK ){ - sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db, "recovery"); - if( pBackup ){ - while( sqlite3_backup_step(pBackup, 1000)==SQLITE_OK ); - rc = sqlite3_backup_finish(pBackup); + sqlite3 *db2 = 0; + rc = sqlite3_open("", &db2); + if( rc==SQLITE_OK ){ + sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db2, "main"); + if( pBackup ){ + while( sqlite3_backup_step(pBackup, 1000)==SQLITE_OK ); + rc = sqlite3_backup_finish(pBackup); + } } + sqlite3_close(db2); } + if( rc==SQLITE_OK ){ rc = sqlite3_exec(db, RECOVERY_SCHEMA, 0, 0, 0); } diff --git a/manifest b/manifest index d0030bd28b..a19ce57ac1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sscript\smode\sand\slost-and-found\stables. -D 2022-09-05T21:22:35.859 +C Tests\sand\sa\sfix\sfor\sthe\sSQLITE_RECOVER_ROWIDS\soption. +D 2022-09-06T19:38:06.927 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -390,7 +390,8 @@ F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f5974282 F ext/recover/recover1.test ae8ce9828210aa6c466bf88e23b0933849d5bb43091abe48cf2e56d636e51e93 F ext/recover/recover_common.tcl 6679af7dffc858e345053a91c9b0a897595b4a13007aceffafca75304ccb137c F ext/recover/recoverold.test f368a6ae2db12b6017257b332a19ab5df527f4061e43f12f5c85d8e2b236f074 -F ext/recover/sqlite3recover.c 5dca1b3904cb028bef7348a5e0726a253c48f7fcd5da5ec687a44e4e665a24bf +F ext/recover/recoverrowid.test ec4436cd69e6cdacb48dd2963ff6dd9dbd5fe648376de5e7c0c2f4f6cbacb417 +F ext/recover/sqlite3recover.c 297fdef9da8523ef7fa3f88adb31356340826dac56c1fb13db2dd3e167806efe F ext/recover/sqlite3recover.h 32f89b66f0235c0d94dfee0f1c3e9ed1ad726b3c4f3716ef0262b31cc33e8301 F ext/recover/test_recover.c be0d74f0eba44fe7964e22d287dba0f3fa2baf197f630d51f0f9066af9b5eb2a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -2005,8 +2006,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 73058416e7da6581000898b7988a7010e2ce6632246f4c12b4398700c7744b83 -R 9dcaa53e272447eefaba97715f5d61ae +P 09ec588d2fe24dd321e88318fe90a9ae912cbc73c8a2d59a10c821625dd12d9d +R 2900e793f9b609ad9d5a7b230af64f99 U dan -Z 82e767f579594364114308f585b07fed +Z a6081cceac978cdb593b5cd251ae6a63 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8ad6e97f6b..c0fbb47278 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -09ec588d2fe24dd321e88318fe90a9ae912cbc73c8a2d59a10c821625dd12d9d \ No newline at end of file +1d5000f5718004110776ff58284d824854a93fe1cd1f6d8a4e8b8b0c2b2c3076 \ No newline at end of file