From: drh <> Date: Sat, 18 Jun 2022 20:20:30 +0000 (+0000) Subject: Enable query invariant checking in fuzzcheck by default. There is no way X-Git-Tag: version-3.39.0~20 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=13736999d9f405de3696dedbe4c658ca5116f66f;p=thirdparty%2Fsqlite.git Enable query invariant checking in fuzzcheck by default. There is no way to turn it off. Update the invariant checking logic to be consistant with dbsqlfuzz. FossilOrigin-Name: 66ca729bbbf37cb7ff8eb12f51429e0c0833bd5d3f0ef20a1eaeeb10820713c2 --- diff --git a/manifest b/manifest index fbe59a3eb7..b16e4845e1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Abandon\sa\squery-invariant\scheck\sin\sfuzzcheck\sif\sthe\scall\sto\nsqlite3_bind_value()\sreturns\sanything\sother\sthan\sSQLITE_OK\sor\sSQLITE_RANGE. -D 2022-06-18T14:50:43.710 +C Enable\squery\sinvariant\schecking\sin\sfuzzcheck\sby\sdefault.\s\sThere\sis\sno\sway\nto\sturn\sit\soff.\s\sUpdate\sthe\sinvariant\schecking\slogic\sto\sbe\sconsistant\swith\ndbsqlfuzz. +D 2022-06-18T20:20:30.693 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1085,7 +1085,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 618511e19af06d8d7200a84fc5075837b3d46b000ce1f332f0639c7079761bf8 +F test/fuzzcheck.c 7b501d55631c2d759e0bed02ed329904a35690fc6563d7b6cc69b7788a024f26 F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1097,7 +1097,7 @@ F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfede F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c d02dbf42821ffee6edf0b202e015ae6c25442cb23a58dbf8abb5db227008b934 +F test/fuzzinvariants.c 2b939b78736f2cb340f43e7d2ecbdff48de56bfb2ba7fe0b7e28f5c03ee62daf F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1978,8 +1978,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 eabbee4a51bc1a865bddee890004ff3a1c9cc6b797b21f73e908642e154cef50 -R a250da4d7eb0fc648ee3fc57e9bf8333 +P d31e1cd2ab44c7cce20b8990dff17719c286dd2fb46ba6d4f581a9553cf31891 +R 5b4a10214807c18490f78f54aeff8595 U drh -Z c0f3947dc13c9e02ac56849fd48ded9e +Z d6244a9a07066e08a48f8f82e9118858 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 182b881adb..1f4f0cd9e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d31e1cd2ab44c7cce20b8990dff17719c286dd2fb46ba6d4f581a9553cf31891 \ No newline at end of file +66ca729bbbf37cb7ff8eb12f51429e0c0833bd5d3f0ef20a1eaeeb10820713c2 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index e95b2558d6..fe56262211 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -153,7 +153,6 @@ static struct GlobalVars { int nSql; /* Number of SQL scripts */ Blob *pFirstSql; /* First SQL script */ unsigned int uRandom; /* Seed for the SQLite PRNG */ - unsigned char doInvariantChecks; /* True to run query invariant checks */ unsigned int nInvariant; /* Number of invariant checks run */ char zTestName[100]; /* Name of current test */ } g; @@ -838,6 +837,7 @@ static int progress_handler(void *pClientData) { #define BTS_SELECT 0x000001 #define BTS_NONSELECT 0x000002 #define BTS_BADFUNC 0x000004 +#define BTS_BADPRAGMA 0x000008 /* Sticky for rest of the script */ /* ** Disallow debugging pragmas such as "PRAGMA vdbe_debug" and @@ -854,7 +854,8 @@ static int block_troublesome_sql( const char *zArg3, const char *zArg4 ){ - unsigned int *pFlags = (unsigned int*)pClientData; + unsigned int *pBtsFlags = (unsigned int*)pClientData; + (void)zArg3; (void)zArg4; switch( eCode ){ @@ -863,24 +864,31 @@ static int block_troublesome_sql( && (zArg2==0 || strtoll(zArg2,0,0)>100 || strtoll(zArg2,0,10)>100) ){ return SQLITE_DENY; + }else if( sqlite3_stricmp("hard_heap_limit", zArg1)==0 + || sqlite3_stricmp("reverse_unordered_selects", zArg1)==0 + ){ + /* BTS_BADPRAGMA is sticky. A hard_heap_limit or + ** revert_unordered_selects should inhibit all future attempts + ** at verifying query invariants */ + *pBtsFlags |= BTS_BADPRAGMA; }else if( eVerbosity==0 ){ if( sqlite3_strnicmp("vdbe_", zArg1, 5)==0 || sqlite3_stricmp("parser_trace", zArg1)==0 || sqlite3_stricmp("temp_store_directory", zArg1)==0 ){ return SQLITE_DENY; - } + } }else if( sqlite3_stricmp("oom",zArg1)==0 && zArg2!=0 && zArg2[0]!=0 ){ oomCounter = atoi(zArg2); } - *pFlags |= BTS_NONSELECT; + *pBtsFlags |= BTS_NONSELECT; break; } case SQLITE_ATTACH: { /* Deny the ATTACH if it is attaching anything other than an in-memory ** database. */ - *pFlags |= BTS_NONSELECT; + *pBtsFlags |= BTS_NONSELECT; if( zArg1==0 ) return SQLITE_DENY; if( strcmp(zArg1,":memory:")==0 ) return SQLITE_OK; if( sqlite3_strglob("file:*[?]vfs=memdb", zArg1)==0 @@ -891,23 +899,45 @@ static int block_troublesome_sql( return SQLITE_DENY; } case SQLITE_SELECT: { - *pFlags |= BTS_SELECT; + *pBtsFlags |= BTS_SELECT; break; } case SQLITE_FUNCTION: { static const char *azBadFuncs[] = { + "avg", + "count", + "cume_dist", "current_date", "current_time", "current_timestamp", "date", "datetime", + "decimal_sum", + "dense_rank", + "first_value", + "geopoly_group_bbox", + "group_concat", "implies_nonnull_row", + "json_group_array", + "json_group_object", "julianday", + "lag", + "last_value", + "lead", + "max", + "min", + "nth_value", + "ntile", + "percent_rank", "random", "randomblob", + "rank", + "row_number", "sqlite_offset", "strftime", + "sum", "time", + "total", "unixepoch", }; int first, last; @@ -921,7 +951,7 @@ static int block_troublesome_sql( }else if( c>0 ){ last = mid-1; }else{ - *pFlags |= BTS_BADFUNC; + *pBtsFlags |= BTS_BADFUNC; break; } }while( first<=last ); @@ -932,7 +962,7 @@ static int block_troublesome_sql( break; } default: { - *pFlags |= BTS_NONSELECT; + *pBtsFlags |= BTS_NONSELECT; } } return SQLITE_OK; @@ -962,7 +992,7 @@ static int runDbSql(sqlite3 *db, const char *zSql, unsigned int *pBtsFlags){ printf("RUNNING-SQL: [%s]\n", zSql); fflush(stdout); } - (*pBtsFlags) = 0; + (*pBtsFlags) &= ~BTS_BADPRAGMA; rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); if( rc==SQLITE_OK ){ int nRow = 0; @@ -1018,7 +1048,6 @@ static int runDbSql(sqlite3 *db, const char *zSql, unsigned int *pBtsFlags){ } /* End while( SQLITE_ROW */ if( rc==SQLITE_DONE ){ if( (*pBtsFlags)==BTS_SELECT - && g.doInvariantChecks && !sqlite3_stmt_isexplain(pStmt) && nRow>0 ){ @@ -1674,7 +1703,6 @@ static void showHelp(void){ " --oss-fuzz Enable OSS-FUZZ testing\n" " --prng-seed N Seed value for the PRGN inside of SQLite\n" " -q|--quiet Reduced output\n" -" --query-invariants Run query invariant checks\n" " --rebuild Rebuild and vacuum the database file\n" " --result-trace Show the results of each SQL command\n" " --script Output CLI script instead of running tests\n" @@ -1835,9 +1863,6 @@ int main(int argc, char **argv){ verboseFlag = 0; eVerbosity = 0; }else - if( strcmp(z,"query-invariants")==0 ){ - g.doInvariantChecks = 1; - }else if( strcmp(z,"rebuild")==0 ){ rebuildFlag = 1; openFlags4Data = SQLITE_OPEN_READWRITE; diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c index a59aab4894..a2a5028d1b 100644 --- a/test/fuzzinvariants.c +++ b/test/fuzzinvariants.c @@ -109,7 +109,7 @@ int fuzz_invariant( } if( i>=nCol ) break; } - if( rc!=SQLITE_ROW && rc!=SQLITE_NOMEM ){ + if( rc==SQLITE_DONE ){ /* No matching output row found */ sqlite3_stmt *pCk = 0; rc = sqlite3_prepare_v2(db, "PRAGMA integrity_check", -1, &pCk, 0); @@ -183,8 +183,9 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ while( nIn>0 && (isspace(zIn[nIn-1]) || zIn[nIn-1]==';') ) nIn--; if( strchr(zIn, '?') ) return 0; pTest = sqlite3_str_new(0); - sqlite3_str_appendf(pTest, "SELECT %s* FROM (%.*s)", - bDistinct ? "DISTINCT " : "", (int)nIn, zIn); + sqlite3_str_appendf(pTest, "SELECT %s* FROM (%s", + bDistinct ? "DISTINCT " : "", zIn); + sqlite3_str_appendf(pTest, ")"); rc = sqlite3_prepare_v2(db, sqlite3_str_value(pTest), -1, &pBase, 0); if( rc ){ sqlite3_finalize(pBase);