From: dan Date: Wed, 14 Sep 2022 18:57:46 +0000 (+0000) Subject: Extra tests and fixes. X-Git-Tag: version-3.40.0~91^2~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3c24342841614c8f31d0ae27cad111a950959c3e;p=thirdparty%2Fsqlite.git Extra tests and fixes. FossilOrigin-Name: deed5336931b23bb507c064d08e9899b33f04e4f7eee03beb8d7147eb4caa030 --- diff --git a/ext/recover/recover1.test b/ext/recover/recover1.test index 358015a591..79258b7e8f 100644 --- a/ext/recover/recover1.test +++ b/ext/recover/recover1.test @@ -195,7 +195,19 @@ do_execsql_test 11.1 { do_recover_test 11 - +do_test 12.1 { + set R [sqlite3_recover_init db "" test.db2] + $R config lostandfound "" + $R config invalid xyz +} {12} +do_test 12.2 { + $R run + $R run +} {21} + +do_test 12.3 { + $R finish +} {} finish_test diff --git a/ext/recover/recovercorrupt2.test b/ext/recover/recovercorrupt2.test new file mode 100644 index 0000000000..58dee54815 --- /dev/null +++ b/ext/recover/recovercorrupt2.test @@ -0,0 +1,76 @@ +# 2022 August 28 +# +# 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. +# +#*********************************************************************** +# + +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 recovercorrupt2 + +do_execsql_test 1.0 { + PRAGMA page_size = 512; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); + INSERT INTO t1 VALUES(1, 2, 3); + INSERT INTO t1 VALUES(2, hex(randomblob(100)), randomblob(200)); + CREATE INDEX i1 ON t1(b, c); + CREATE TABLE t2(a PRIMARY KEY, b, c) WITHOUT ROWID; + INSERT INTO t2 VALUES(1, 2, 3); + INSERT INTO t2 VALUES(2, hex(randomblob(100)), randomblob(200)); + ANALYZE; + PRAGMA writable_schema = 1; + UPDATE sqlite_schema SET sql = 'CREATE INDEX i1 ON o(world)' WHERE name='i1'; +} + +do_test 1.1 { + set R [sqlite3_recover_init db main test.db2] + $R run + $R finish +} {} + +sqlite3 db2 test.db2 +do_execsql_test -db db2 1.2 { + SELECT sql FROM sqlite_schema +} { + {CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c)} + {CREATE TABLE t2(a PRIMARY KEY, b, c) WITHOUT ROWID} + {CREATE TABLE sqlite_stat1(tbl,idx,stat)} + {CREATE TABLE sqlite_stat4(tbl,idx,neq,nlt,ndlt,sample)} +} +db2 close + +do_execsql_test 1.3 { + PRAGMA writable_schema = 1; + UPDATE sqlite_schema SET sql = 'CREATE TABLE t2 syntax error!' WHERE name='t2'; +} + +do_test 1.4 { + set R [sqlite3_recover_init db main test.db2] + $R run + $R finish +} {} + +sqlite3 db2 test.db2 +do_execsql_test -db db2 1.5 { + SELECT sql FROM sqlite_schema +} { + {CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c)} + {CREATE TABLE sqlite_stat1(tbl,idx,stat)} + {CREATE TABLE sqlite_stat4(tbl,idx,neq,nlt,ndlt,sample)} +} +db2 close + + + +finish_test + diff --git a/ext/recover/recoverfault.test b/ext/recover/recoverfault.test index e6d8392a44..2ea87860b3 100644 --- a/ext/recover/recoverfault.test +++ b/ext/recover/recoverfault.test @@ -72,6 +72,7 @@ do_execsql_test 2.0 { PRAGMA writable_schema = 1; DELETE FROM sqlite_schema WHERE name='t2'; } +faultsim_save_and_close do_faultsim_test 2 -faults oom* -prep { faultsim_restore_and_reopen diff --git a/ext/recover/sqlite3recover.c b/ext/recover/sqlite3recover.c index c67d9b3d49..6c52d99855 100644 --- a/ext/recover/sqlite3recover.c +++ b/ext/recover/sqlite3recover.c @@ -768,7 +768,7 @@ static int recoverOpenOutput(sqlite3_recover *p){ if( rc==SQLITE_OK ){ sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db2, "main"); if( pBackup ){ - while( sqlite3_backup_step(pBackup, 1000)==SQLITE_OK ); + sqlite3_backup_step(pBackup, -1); p->errCode = sqlite3_backup_finish(pBackup); }else{ recoverDbError(p, db); @@ -1042,10 +1042,10 @@ static int recoverWriteSchema2(sqlite3_recover *p){ i64 iRoot = sqlite3_column_int64(pSelect, 0); const char *zSql = (const char*)sqlite3_column_text(pSelect, 1); int rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0); - if( rc!=SQLITE_OK && rc!=SQLITE_ERROR ){ - recoverDbError(p, p->dbOut); - }else if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK ){ recoverSqlCallback(p, zSql); + }else if( rc!=SQLITE_ERROR ){ + recoverDbError(p, p->dbOut); } } } @@ -1316,9 +1316,7 @@ static void recoverLostAndFoundPopulate( int iCell = sqlite3_column_int64(pStmt, 2); int iField = sqlite3_column_int64(pStmt, 3); - if( iPrevRoot>0 && ( - iPrevRoot!=iRoot || iPrevPage!=iPage || iPrevCell!=iCell - )){ + if( iPrevRoot>0 && (iPrevPage!=iPage || iPrevCell!=iCell) ){ /* Insert the new row */ sqlite3_bind_int64(pInsert, 1, iPrevRoot); /* rootpgno */ sqlite3_bind_int64(pInsert, 2, iPrevPage); /* pgno */ @@ -1329,7 +1327,7 @@ static void recoverLostAndFoundPopulate( for(ii=0; iixSql ){ + if( sqlite3_step(pInsert)==SQLITE_ROW ){ recoverSqlCallback(p, sqlite3_column_text(pInsert, 0)); } recoverReset(p, pInsert); @@ -1586,7 +1584,7 @@ static int recoverWriteData(sqlite3_recover *p){ sqlite3_bind_int64(pInsert, pTab->iRowidBind, iRowid); } - if( SQLITE_ROW==sqlite3_step(pInsert) && p->xSql ){ + if( SQLITE_ROW==sqlite3_step(pInsert) ){ const char *z = (const char*)sqlite3_column_text(pInsert, 0); recoverSqlCallback(p, z); } diff --git a/ext/recover/test_recover.c b/ext/recover/test_recover.c index 7ab440fa37..d660a5345e 100644 --- a/ext/recover/test_recover.c +++ b/ext/recover/test_recover.c @@ -84,7 +84,7 @@ static int testRecoverCmd( int nArg; const char *zMsg; } aSub[] = { - { "config", 2, "REBASE-BLOB" }, /* 0 */ + { "config", 2, "ARG" }, /* 0 */ { "run", 0, "" }, /* 1 */ { "errmsg", 0, "" }, /* 2 */ { "errcode", 0, "" }, /* 3 */ @@ -115,6 +115,7 @@ static int testRecoverCmd( "lostandfound", /* 1 */ "freelistcorrupt", /* 2 */ "rowids", /* 3 */ + "invalid", /* 4 */ 0 }; int iOp = 0; @@ -128,11 +129,13 @@ static int testRecoverCmd( 789, (void*)Tcl_GetString(objv[3]) /* MAGIC NUMBER! */ ); break; - case 1: + case 1: { + const char *zStr = Tcl_GetString(objv[3]); res = sqlite3_recover_config(pTest->p, - SQLITE_RECOVER_LOST_AND_FOUND, (void*)Tcl_GetString(objv[3]) + SQLITE_RECOVER_LOST_AND_FOUND, (void*)(zStr[0] ? zStr : 0) ); break; + } case 2: { int iVal = 0; if( Tcl_GetBooleanFromObj(interp, objv[3], &iVal) ) return TCL_ERROR; @@ -149,6 +152,10 @@ static int testRecoverCmd( ); break; } + case 4: { + res = sqlite3_recover_config(pTest->p, 12345, 0); + break; + } } Tcl_SetObjResult(interp, Tcl_NewIntObj(res)); break; @@ -210,6 +217,7 @@ static int test_sqlite3_recover_init( } if( getDbPointer(interp, objv[1], &db) ) return TCL_ERROR; zDb = Tcl_GetString(objv[2]); + if( zDb[0]=='\0' ) zDb = 0; pNew = ckalloc(sizeof(TestRecover)); if( bSql==0 ){ diff --git a/manifest b/manifest index b17390fa0e..cc05de1c51 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\srecovery\sof\sutf-16\sdatabases. -D 2022-09-14T16:37:59.285 +C Extra\stests\sand\sfixes. +D 2022-09-14T18:57:46.380 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -387,18 +387,19 @@ F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2 F ext/rbu/sqlite3rbu.c 8737cabdfbee84bb25a7851ecef8b1312be332761238da9be6ddb10c62ad4291 F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a -F ext/recover/recover1.test 167ad4b267f6db5c06963a72196527cb42369c7cd77de2b4273d9fdc8bd7a254 +F ext/recover/recover1.test 3f26db7692ed98c0de4fc9511f3d3a2f2c91a137b7e6666f3b85b593438b5d09 F ext/recover/recover_common.tcl 6679af7dffc858e345053a91c9b0a897595b4a13007aceffafca75304ccb137c F ext/recover/recoverclobber.test 294dcc894124ab4ca3a7b35766630742a3d25810fceac22220beb64f70a33a60 F ext/recover/recovercorrupt.test e3f3cbe0162ba681518aac9ea0ae8119f32ac93fb0900b5f09b6318966108e54 -F ext/recover/recoverfault.test f3587c218c448545a082b99d59294dff5ec0b7daa15b0556cf926f6c350f221e +F ext/recover/recovercorrupt2.test 7a1e3fe43231e7571aff4a09f359dcc0c98ef8f74d507c17953d35f2ad9f4c1f +F ext/recover/recoverfault.test 3a0a32b9fc216592b97775d69220695b0926980c0f7424b7a59144e47d7cb568 F ext/recover/recoverfault2.test 321036336af23e778a87f148c4cc4407f88fbdab1fd72ddb661669be9020d36b F ext/recover/recoverold.test 46e9d99b595fac583d4c67f74d7d89c20a435c752ef6eeb3e918b599940c88e0 F ext/recover/recoverrowid.test 1694a1a5526d825f71279f3d02ab02a1ee4c5265de18858bf54cb8ec54487ac8 F ext/recover/recoversql.test f9872ff2114e13ffd8ee31e1de06919f62b9b48bc080191b5bd076d10becb60f -F ext/recover/sqlite3recover.c 1afcac2bbfcf5ef67a3391f59678dc866348ac88745067e683052ede02c425fb +F ext/recover/sqlite3recover.c 29cb0ef3ff22e4a813d741930be123b7a44d59ba4c93868e74c4b0ebbee90a62 F ext/recover/sqlite3recover.h 81108efb8c4618d3d9c6da4df785212b0e4501aa0d25edfc463405fe839a6640 -F ext/recover/test_recover.c 6a6f86ea61d728c67382047d574c62df83e6a28db23c329e93a177093689cd20 +F ext/recover/test_recover.c 72a765616a3fa9dae2ed537d79b00f365d9f639d347858341b71bda7a3a45f56 F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 F ext/repair/checkfreelist.c e21f06995ff4efdc1622dcceaea4dcba2caa83ca2f31a1607b98a8509168a996 F ext/repair/checkindex.c 4383e4469c21e5b9ae321d0d63cec53e981af9d7a6564be6374f0eeb93dfc890 @@ -2011,8 +2012,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 9b6b4c7162439a889144edb561356afc66436db921a867c20871f0c556716502 -R 7d7577824671621531c65dae0de3846f +P 5b05be0861f35804270fbd184ad4b89c23e98cc2fbd56b9e4fe6197daef5fe49 +R 7d672439d169025c8f5a2255e79dee5d U dan -Z b3ef1682460d7df284b8cd64863e6715 +Z 7e26bca497bd6fe58832c34f4ec41a30 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 05a5c951ed..9efa9051fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b05be0861f35804270fbd184ad4b89c23e98cc2fbd56b9e4fe6197daef5fe49 \ No newline at end of file +deed5336931b23bb507c064d08e9899b33f04e4f7eee03beb8d7147eb4caa030 \ No newline at end of file