From 7b0d34fe32ef3b62b86647ff6eb7d04bd360f67d Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 17 Apr 2021 13:46:23 +0000 Subject: [PATCH 1/5] Ensure that variables are not used in the WINDOW clause of a query inside of a trigger. dbsqlfuzz d9cf66100064952b66951845dfab41de1c124611 FossilOrigin-Name: 1a341378ab24a5091e6cf03b9e957d11b2bfe5c711835e8c583785f8fa0125d3 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/attach.c | 1 + src/sqliteInt.h | 1 + src/walker.c | 10 ++++++---- test/window1.test | 13 +++++++++++++ 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index ef75b064ed..7650fad6ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sgeopoly\sto\s$::sqlite_options()\sand\suse\sit\sto\spass\smore\stests. -D 2021-04-16T23:43:22.674 +C Ensure\sthat\svariables\sare\snot\sused\sin\sthe\sWINDOW\sclause\sof\sa\squery\sinside\nof\sa\strigger.\s\sdbsqlfuzz\sd9cf66100064952b66951845dfab41de1c124611 +D 2021-04-17T13:46:23.808 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 14d5d9ba332de515c6e2f729e728426cdd6f5683cdc356ba6b6e3444e1ed210e F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c -F src/attach.c 9cbe761e464025694df8e6f6ee4d9f41432c3a255ca9443ccbb4130eeb87cf72 +F src/attach.c f4c5352b7e65760bed220e46176b540d43fdb2d9453a262c5fa467e5a8dfaa61 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 @@ -547,7 +547,7 @@ F src/shell.c.in 9320b476fde0f7c46700e5695b69b435f1e46843a1513cdd187ac426cdbee01 F src/sqlite.h.in 18ec33e32001721fd4e9c4705a24a85dff04956ac2c0a21775058884ba845b09 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e -F src/sqliteInt.h 95679aa6addc29e48453770a80aeb8ea623d3fa76e309768d83a00ad87fe9111 +F src/sqliteInt.h 73abdd2a633ccff6e4b5d44994d68a25b8009eca6a94d2d582404e74114071af F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -628,7 +628,7 @@ F src/vtab.c 032a0165c147fda16927e6a3230e90c068d4af93f887ce94e26f678fe48e5e4c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 69e770e96fd56cc21608992bf2c6f1f3dc5cf2572d0495c6a643b06c3a679f14 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a -F src/walker.c d42d6c80ea363ef689a462e65eefcfe87deab924c50de5baa37ecb6af7d7ddaa +F src/walker.c df4f432b10011cd587b16afa861ae8878ef1b872dd042565efa4db346bbdc793 F src/where.c 1c305bab0996a63219a6cb3d4718587f3a5dc5608120c4448985aa2bef88b7f5 F src/whereInt.h 446e5e8018f83358ef917cf32d8e6a86dc8430113d0b17e720f1839d3faa44c4 F src/wherecode.c 0e42f4ad53962e90349462520891734ed3217c7852f41c69ffac7a9eeaf31451 @@ -1769,7 +1769,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test d85fd6d82f06ac98da31a7ca1417a051de0a7c01a8c61e4e93d3c7383544f5c7 +F test/window1.test 515512f47c654e1b19e9708aa53d269dfe7acafd3c458e1dfdda783ac8822150 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1912,7 +1912,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 ab83a99899ceae931b43e0c4b3f8f8b83bc832f1568de5692c0d038c968f8a87 -R a25a23255eb14ac26c02b1d56b4537bc -U larrybr -Z 0a0ab19ca8aa12c6c640b6bd1ffda819 +P 23da5016b66f3947cc902dbe2766ea9f5a00f85312a652b536ab51d657446ab7 +R bf25a23f30169f2cf2c12eb36cf30778 +U drh +Z de881fd9f1b18391bcbd6c6b28a4ca60 diff --git a/manifest.uuid b/manifest.uuid index 04a4c91d73..f415a2263d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23da5016b66f3947cc902dbe2766ea9f5a00f85312a652b536ab51d657446ab7 \ No newline at end of file +1a341378ab24a5091e6cf03b9e957d11b2bfe5c711835e8c583785f8fa0125d3 \ No newline at end of file diff --git a/src/attach.c b/src/attach.c index 8eb4486e58..8fcfb0438b 100644 --- a/src/attach.c +++ b/src/attach.c @@ -514,6 +514,7 @@ void sqlite3FixInit( pFix->w.xSelectCallback2 = 0; pFix->w.walkerDepth = 0; pFix->w.eCode = 0; + pFix->w.bWalkWinDefn = 1; pFix->w.u.pFix = pFix; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index f4944c2ed5..69d9b49124 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3833,6 +3833,7 @@ struct Walker { void (*xSelectCallback2)(Walker*,Select*);/* Second callback for SELECTs */ int walkerDepth; /* Number of subqueries */ u16 eCode; /* A small processing code */ + unsigned bWalkWinDefn : 1; /* True to walk pWinDefn */ union { /* Extra data for callback */ NameContext *pNC; /* Naming context */ int n; /* A counter */ diff --git a/src/walker.c b/src/walker.c index 927f7e52d7..6483638815 100644 --- a/src/walker.c +++ b/src/walker.c @@ -130,10 +130,12 @@ int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; -#if !defined(SQLITE_OMIT_WINDOWFUNC) && !defined(SQLITE_OMIT_ALTERTABLE) - { - Parse *pParse = pWalker->pParse; - if( pParse && IN_RENAME_OBJECT ){ +#if !defined(SQLITE_OMIT_WINDOWFUNC) + if( p->pWinDefn ){ + Parse *pParse; + if( pWalker->bWalkWinDefn + || ((pParse = pWalker->pParse)!=0 && IN_RENAME_OBJECT) + ){ /* The following may return WRC_Abort if there are unresolvable ** symbols (e.g. a table that does not exist) in a window definition. */ int rc = walkWindowList(pWalker, p->pWinDefn, 0); diff --git a/test/window1.test b/test/window1.test index 6eb97310fc..0f4e0e2c87 100644 --- a/test/window1.test +++ b/test/window1.test @@ -374,6 +374,19 @@ do_execsql_test 9.3 { SELECT *, min(z) OVER (ORDER BY x) FROM aaa ORDER BY 1; } {1 g g g 2 i i g 3 l l g 4 g l g 5 a l g 6 m m g} +do_catchsql_test 9.4 { + -- 2021-04-17 dbsqlfuzz d9cf66100064952b66951845dfab41de1c124611 + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a,b,c,d); + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(x,y); + CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2(x,y) + SELECT a, max(d) OVER w1 FROM t1 + WINDOW w1 AS (PARTITION BY EXISTS(SELECT 1 FROM t1 WHERE c=?1) ); + END; +} {1 {trigger cannot use variables}} + #------------------------------------------------------------------------- # do_execsql_test 10.0 { From 44918c74cdbb911049433e0f8d009f6dbcd399af Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 17 Apr 2021 14:42:37 +0000 Subject: [PATCH 2/5] Fix cases where code in expr.c was failing to handle OOM failures that occurred while processing sub-select expressions. FossilOrigin-Name: 62efe2eee34fdb147cc456290576d8fc3801487867c78aadd4485f85468d9ffc --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/select.c | 5 +++-- test/exprfault.test | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 test/exprfault.test diff --git a/manifest b/manifest index 7650fad6ab..cd04d45610 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\svariables\sare\snot\sused\sin\sthe\sWINDOW\sclause\sof\sa\squery\sinside\nof\sa\strigger.\s\sdbsqlfuzz\sd9cf66100064952b66951845dfab41de1c124611 -D 2021-04-17T13:46:23.808 +C Fix\scases\swhere\scode\sin\sexpr.c\swas\sfailing\sto\shandle\sOOM\sfailures\sthat\soccurred\swhile\sprocessing\ssub-select\sexpressions. +D 2021-04-17T14:42:37.486 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e299d53c4077fc32bc63741b5b27fdf8a1328cb8e812b9fafb55441c4c73a80a F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c ed07c4ad9c6f21b7b5b71a4eb844d4c52908324b8a3a48f00e0c0923337150c9 +F src/select.c ab7dcf61ffe21e51c4ed8df5f22aaff6473d27d19f62914f38ebcb30fe404c44 F src/shell.c.in 9320b476fde0f7c46700e5695b69b435f1e46843a1513cdd187ac426cdbee016 F src/sqlite.h.in 18ec33e32001721fd4e9c4705a24a85dff04956ac2c0a21775058884ba845b09 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -887,6 +887,7 @@ F test/exists2.test 92d563a97019a70f7adcbe3cbaab16f9fc696affbf0f9ede1796ea5f7cc5 F test/existsfault.test 72a0036c1424d9204d49f4d976c3277a1b8bb2eed3c67aa124ba2df2f1331c7c F test/expr.test 26cd01e8485bc48c8aa6a1add598e9ce1e706b4eb4f3f554e0b0223022e8c2cf F test/expr2.test c27327ae9c017a7ff6280123f67aff496f912da74d78c888926d68b46ec75fd8 +F test/exprfault.test 497cc0b8fe6a677f49b55cb485e040f709ec2834b84f25912fe9c2dfeeda33db F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 F test/external_reader.test c7d34694f1b25c32d866f56ac80c1e29edddc42b4ef90cad589263ffac2cde0c F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 @@ -1912,7 +1913,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 23da5016b66f3947cc902dbe2766ea9f5a00f85312a652b536ab51d657446ab7 -R bf25a23f30169f2cf2c12eb36cf30778 -U drh -Z de881fd9f1b18391bcbd6c6b28a4ca60 +P 1a341378ab24a5091e6cf03b9e957d11b2bfe5c711835e8c583785f8fa0125d3 +R 4d45ac54d5d618caff7814b71621e862 +U dan +Z 1cd6e7298ad37e9ece772ad96317b9fa diff --git a/manifest.uuid b/manifest.uuid index f415a2263d..f0a53c95ac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1a341378ab24a5091e6cf03b9e957d11b2bfe5c711835e8c583785f8fa0125d3 \ No newline at end of file +62efe2eee34fdb147cc456290576d8fc3801487867c78aadd4485f85468d9ffc \ No newline at end of file diff --git a/src/select.c b/src/select.c index d9410bdf62..a543702bf3 100644 --- a/src/select.c +++ b/src/select.c @@ -6197,8 +6197,7 @@ int sqlite3Select( } #ifndef SQLITE_OMIT_WINDOWFUNC - rc = sqlite3WindowRewrite(pParse, p); - if( rc ){ + if( sqlite3WindowRewrite(pParse, p) ){ assert( db->mallocFailed || pParse->nErr>0 ); goto select_end; } @@ -7266,6 +7265,8 @@ int sqlite3Select( ** successful coding of the SELECT. */ select_end: + assert( db->mallocFailed==0 || db->mallocFailed==1 ); + pParse->nErr += db->mallocFailed; sqlite3ExprListDelete(db, pMinMaxOrderBy); #ifdef SQLITE_DEBUG if( pAggInfo && !db->mallocFailed ){ diff --git a/test/exprfault.test b/test/exprfault.test new file mode 100644 index 0000000000..9e5977e1d2 --- /dev/null +++ b/test/exprfault.test @@ -0,0 +1,35 @@ +# 2021 April 17 +# +# 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. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix exprfault + +do_execsql_test 1.0 { + CREATE TABLE t1(a); + CREATE TABLE t2(d); +} +faultsim_save_and_close + +do_faultsim_test 1.1 -faults oom* -prep { + faultsim_restore_and_reopen +} -body { + execsql { + SELECT a = ( SELECT d FROM (SELECT d FROM t2) ) FROM t1 + } +} -test { + faultsim_test_result {0 {}} +} + + +finish_test From 48a6aede46e82b33c0dee37c044bb224aa3411e1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 17 Apr 2021 18:39:39 +0000 Subject: [PATCH 3/5] Add new dbsqlfuzz cases to test/fuzzdata8.db. FossilOrigin-Name: d18793e589a4ee7706e994a1f3d24ba7df190467d92fa6ac040258f4debc149d --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1968128 -> 1980416 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index cd04d45610..e82be27f2a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scases\swhere\scode\sin\sexpr.c\swas\sfailing\sto\shandle\sOOM\sfailures\sthat\soccurred\swhile\sprocessing\ssub-select\sexpressions. -D 2021-04-17T14:42:37.486 +C Add\snew\sdbsqlfuzz\scases\sto\stest/fuzzdata8.db. +D 2021-04-17T18:39:39.769 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1056,7 +1056,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db d2dd21624736d346dc79d8c21912f18d7ab88aff5fa09e80d17149857fe818f5 +F test/fuzzdata8.db 74b8510c083d3d59cd66a5336051960b7d6517590cc9bfdcb2f68fcbd26dd18f F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1913,7 +1913,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 1a341378ab24a5091e6cf03b9e957d11b2bfe5c711835e8c583785f8fa0125d3 -R 4d45ac54d5d618caff7814b71621e862 -U dan -Z 1cd6e7298ad37e9ece772ad96317b9fa +P 62efe2eee34fdb147cc456290576d8fc3801487867c78aadd4485f85468d9ffc +R e6d4f215d327dee505dbd3cfb3329e50 +U drh +Z 27c775b084279a5bc5248aeaf9fef513 diff --git a/manifest.uuid b/manifest.uuid index f0a53c95ac..0efa66cc59 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -62efe2eee34fdb147cc456290576d8fc3801487867c78aadd4485f85468d9ffc \ No newline at end of file +d18793e589a4ee7706e994a1f3d24ba7df190467d92fa6ac040258f4debc149d \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 6fb1c7eae85b3cb09cc90ff5c4d0e986262b0689..68c10cbc5156d8427fc984fabab96b5188b53448 100644 GIT binary patch delta 29273 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 delta 28255 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 Date: Sat, 17 Apr 2021 18:43:29 +0000 Subject: [PATCH 4/5] Allow more time for perf tests when instrumented. Condition another on feature it needs. FossilOrigin-Name: f0dd9cf2d7045d3634294bcf2722d3d7b0a6c4c3ef713b0f7f54fbe31432027f --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/test_config.c | 7 +++++++ test/like.test | 10 ++++++---- test/releasetest.tcl | 2 ++ test/releasetest_data.tcl | 2 ++ test/returning1.test | 2 ++ 7 files changed, 31 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index e82be27f2a..0d0d684ac3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\snew\sdbsqlfuzz\scases\sto\stest/fuzzdata8.db. -D 2021-04-17T18:39:39.769 +C Allow\smore\stime\sfor\sperf\stests\swhen\sinstrumented.\sCondition\sanother\son\sfeature\sit\sneeds. +D 2021-04-17T18:43:29.186 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -567,7 +567,7 @@ F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0 F src/test_bestindex.c 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857 F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 -F src/test_config.c 80d097a0425514a5a14fd12204353d0844949a4979b4436572f222f9ac6d9c10 +F src/test_config.c 842ddde1f1d32c12f1651a77e51d6ccdb84697d5023be352c54683db930e9702 F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 F src/test_devsym.c aff2255ea290d7718da08af30cdf18e470ff7325a5eff63e0057b1496ed66593 @@ -1145,7 +1145,7 @@ F test/kvtest.c feb4358fb022da8ebd098c45811f2f6507688bb6c43aa72b3e840df19026317b F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 -F test/like.test 35e83182beb4c730d50e0f9aff7613fb5cdf8ca9147a833a77290fa5b8ba9474 +F test/like.test 5fe0bc37f307aef0a453ce2de4632bdfc0759448f0421c39f6d53caefe905fac F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da F test/like3.test a76e5938fadbe6d32807284c796bafd869974a961057bc5fc5a28e06de98745c F test/limit.test 350f5d03c29e7dff9a2cde016f84f8d368d40bcd02fa2b2a52fa10c4bf3cbfaf @@ -1294,11 +1294,11 @@ F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d -F test/releasetest.tcl fb76d8fcc95ac29d6356cd9e52b726ab9e43a24082897618dfbcb7c2b0049153 x -F test/releasetest_data.tcl 3d41ddb3f04f474ac9d925485da24ce6576ff0ebc4c7201c8a340bc09846c261 +F test/releasetest.tcl 8dcfc21d6b4a4a1d9a8503de0a94800d129ec8f03ef53d6e68b79ef78a786acd x +F test/releasetest_data.tcl a864d27370e812c34a05224d6144ca082463906d5a4651782ad3b43712ab166a F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb -F test/returning1.test b7ebb065d807c9ed8ebed98e96ca7ab1dea0f64e57d8b70808034201d4d56a6c +F test/returning1.test 99012dc464860e1502153276d5e5c2bee32c53d3a866dcfc09b39932048e2276 F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test 3f3a4e20401825017df7e7671e9f31b6de5fae5620c2b9b49917f52f8c160a8f F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a @@ -1913,7 +1913,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 62efe2eee34fdb147cc456290576d8fc3801487867c78aadd4485f85468d9ffc -R e6d4f215d327dee505dbd3cfb3329e50 -U drh -Z 27c775b084279a5bc5248aeaf9fef513 +P d18793e589a4ee7706e994a1f3d24ba7df190467d92fa6ac040258f4debc149d +R 5f0f01941960771ce3466bb01e0efb08 +U larrybr +Z 218f427ccf1a56a1ffaa0b35ea5e21ea diff --git a/manifest.uuid b/manifest.uuid index 0efa66cc59..75d888e0f8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d18793e589a4ee7706e994a1f3d24ba7df190467d92fa6ac040258f4debc149d \ No newline at end of file +f0dd9cf2d7045d3634294bcf2722d3d7b0a6c4c3ef713b0f7f54fbe31432027f \ No newline at end of file diff --git a/src/test_config.c b/src/test_config.c index ac512fdb6f..5bf6ad63e2 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -65,6 +65,13 @@ static void set_options(Tcl_Interp *interp){ Tcl_SetVar2(interp, "sqlite_options","casesensitivelike","0",TCL_GLOBAL_ONLY); #endif +#ifdef CONFIG_SLOWDOWN_FACTOR + Tcl_SetVar2(interp, "sqlite_options","configslower", + STRINGVALUE(CONFIG_SLOWDOWN_FACTOR),TCL_GLOBAL_ONLY); +#else + Tcl_SetVar2(interp, "sqlite_options","configslower","1.0",TCL_GLOBAL_ONLY); +#endif + #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT Tcl_SetVar2(interp, "sqlite_options", "curdir", "1", TCL_GLOBAL_ONLY); #else diff --git a/test/like.test b/test/like.test index ba9c15afcf..e8662dc6c3 100644 --- a/test/like.test +++ b/test/like.test @@ -1036,16 +1036,18 @@ do_test like-14.1 { set x [lindex [time { db one {SELECT 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz'GLOB'*a*a*a*a*a*a*a*a*y'} }] 0] - puts -nonewline " ($x ms - want less than 1000) " - expr {$x<1000} + set tlimit [expr {1000 * $::sqlite_options(configslower)}] + puts -nonewline " ($x ms - want less than $tlimit) " + expr {$x<$tlimit} } {1} ifcapable !icu { do_test like-14.2 { set x [lindex [time { db one {SELECT 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz'LIKE'%a%a%a%a%a%a%a%a%y'} }] 0] - puts -nonewline " ($x ms - want less than 1000) " - expr {$x<1000} + set tlimit [expr {1000 * $::sqlite_options(configslower)}] + puts -nonewline " ($x ms - want less than $tlimit) " + expr {$x<$tlimit} } {1} } diff --git a/test/releasetest.tcl b/test/releasetest.tcl index 37f00eb4c0..957be1b6fb 100755 --- a/test/releasetest.tcl +++ b/test/releasetest.tcl @@ -55,6 +55,7 @@ array set ::Configs [strip_comments { "Sanitize" { CC=clang -fsanitize=undefined -DSQLITE_ENABLE_STAT4 + -DCONFIG_SLOWDOWN_FACTOR=5.0 --enable-session } "Stdcall" { @@ -254,6 +255,7 @@ array set ::Configs [strip_comments { -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_HIDDEN_COLUMNS + -DCONFIG_SLOWDOWN_FACTOR=8.0 --enable-json1 } diff --git a/test/releasetest_data.tcl b/test/releasetest_data.tcl index b753259c58..62c1e55aa3 100644 --- a/test/releasetest_data.tcl +++ b/test/releasetest_data.tcl @@ -56,6 +56,7 @@ array set ::Configs [strip_comments { "Sanitize" { CC=clang -fsanitize=address,undefined -DSQLITE_ENABLE_STAT4 + -DCONFIG_SLOWDOWN_FACTOR=5.0 --enable-debug --enable-all } @@ -258,6 +259,7 @@ array set ::Configs [strip_comments { -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_HIDDEN_COLUMNS + -DCONFIG_SLOWDOWN_FACTOR=8.0 --enable-json1 } diff --git a/test/returning1.test b/test/returning1.test index 4f94cdfebe..25aaff43ef 100644 --- a/test/returning1.test +++ b/test/returning1.test @@ -184,10 +184,12 @@ do_catchsql_test 8.4 { INSERT INTO t1 VALUES(3) RETURNING a, (SELECT c FROM t2 WHERE t1.a=t2.b) AS x; } {0 {3 40}} +ifcapable vtab { # dbsqlfuzz finds/crash-486f791cbe2dc45839310073e71367a1d8ad22dd do_catchsql_test 9.1 { UPDATE pragma_encoding SET encoding='UTF-8' RETURNING a, b, *; } {1 {table pragma_encoding may not be modified}} +} ;# ifcapable vtab # dbsqlfuzz crash-0081f863d7b2002045ac2361879fc80dfebb98f1 reset_db From 55f36787ea7a90280730c1710c8c18f5a41b5c87 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 17 Apr 2021 19:59:14 +0000 Subject: [PATCH 5/5] Do not run external_reader.test as part of permutation "journaltest", as it requires wal mode. FossilOrigin-Name: 9f5f16cf093cd8b8c7649f664eaf2ad8128fd50e182720dbddf05a6d9227c037 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/permutations.test | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e82be27f2a..a62eee86ba 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\snew\sdbsqlfuzz\scases\sto\stest/fuzzdata8.db. -D 2021-04-17T18:39:39.769 +C Do\snot\srun\sexternal_reader.test\sas\spart\sof\spermutation\s"journaltest",\sas\sit\srequires\swal\smode. +D 2021-04-17T19:59:14.493 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1266,7 +1266,7 @@ F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035c F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test 0a7cf0b6b1283cdd4f0d6e31cb7afbde81d20b1caef60b73914e85b6bf660b8a +F test/permutations.test 9bb03106a024e9938d329a33380ea7fd91b6e45516881db68663505c444b3242 F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f F test/pragma.test 50b91bedea9324d3ab48e793f908ee7d2c7dcf84bfa2281e792838be59641ec8 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1913,7 +1913,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 62efe2eee34fdb147cc456290576d8fc3801487867c78aadd4485f85468d9ffc -R e6d4f215d327dee505dbd3cfb3329e50 -U drh -Z 27c775b084279a5bc5248aeaf9fef513 +P d18793e589a4ee7706e994a1f3d24ba7df190467d92fa6ac040258f4debc149d +R ca230a7aaa2868b098ca02a3b0eadadb +U dan +Z 802c5528301092966a4f4497a5a38b24 diff --git a/manifest.uuid b/manifest.uuid index 0efa66cc59..c17f8b1140 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d18793e589a4ee7706e994a1f3d24ba7df190467d92fa6ac040258f4debc149d \ No newline at end of file +9f5f16cf093cd8b8c7649f664eaf2ad8128fd50e182720dbddf05a6d9227c037 \ No newline at end of file diff --git a/test/permutations.test b/test/permutations.test index 0e7dad4662..ed39c79a0f 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -989,7 +989,7 @@ test_suite "journaltest" -description { pager1.test syscall.test tkt3457.test *malloc* mmap* multiplex* nolock* pager2.test *fault* rowal* snapshot* superlock* symlink.test delete_db.test shmlock.test chunksize.test - busy2.test avfs.test + busy2.test avfs.test external_reader.test }] if {[info commands register_demovfs] != ""} {