From: drh Date: Sat, 28 Jul 2018 21:01:55 +0000 (+0000) Subject: Add a small cost penalty to sorting to bias the query planner in favor of X-Git-Tag: version-3.25.0~87 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f559ed3400d826c494bb23bbf31d280e7fbee28f;p=thirdparty%2Fsqlite.git Add a small cost penalty to sorting to bias the query planner in favor of plans that do not require a final sorting pass. FossilOrigin-Name: 85b9beb4605eb0cfe2ed063c2a1925186c9e37031f78c875e60a347cce891638 --- diff --git a/manifest b/manifest index 950d1a5eaa..c1b56c8869 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\sa\scolumn\sreference\sthat\sis\sconverted\sinto\sa\sconstant\sby\sthe\nWHERE-clause\sconstant\spropagation\soptimization\sto\sbe\smoved\sto\sthe\sinit-time\nconstant\sexpression\slist,\sas\sthe\stable\sreference\swill\snot\swork\sthere.\nThis\sfixes\sa\sproblem\sfound\sby\sOSSFuzz. -D 2018-07-28T16:24:08.475 +C Add\sa\ssmall\scost\spenalty\sto\ssorting\sto\sbias\sthe\squery\splanner\sin\sfavor\sof\nplans\sthat\sdo\snot\srequire\sa\sfinal\ssorting\spass. +D 2018-07-28T21:01:55.748 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6 @@ -583,7 +583,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c d44a0811afd2155b1157c38b33141d4ac028fda6232485bed664015bb05819ca F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a F src/walker.c ba7225773931760cf60bf22f34d0cce2588df7ce5ce0f215a52eb88234b55ac4 -F src/where.c fae13835da8cd457bbc50a8530b1f4bfe6eb173dec0687cf1572fc02a7aec415 +F src/where.c 52ab6d07a6ac6e2cb2a7da41217f0b7c13ce17a30d6a1d3459e86ac94b160e15 F src/whereInt.h b90ef9b9707ef750eab2a7a080c48fb4900315033274689def32d0cf5a81ebe4 F src/wherecode.c 2c552dfe50d06e0916dbd49a180e4bf0accfce6d17d46a2dfeea8f75d2b5861b F src/whereexpr.c dc34f0df69418dedb4619f7ad61b7d31f447971223540b957a1b836a62c0ce7b @@ -1133,7 +1133,7 @@ F test/orderby1.test e4501f54721f804ca56922e253403ac6775f88e9f07569994ce99212b3c F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04 F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99 F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4 -F test/orderby5.test 8f08a54836d21fb7c70245360751aedd1c2286fb +F test/orderby5.test 5f4d6cb93cc2f6d3f4228354310a2ce1fbd95d5bbffcba8c6482eeb62a466407 F test/orderby6.test 8b38138ab0972588240b3fca0985d2e400432859 F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd @@ -1597,7 +1597,7 @@ F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cf F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 -F test/where.test 6bfcd29db193b814e5736832ffa899b4ff2969a106b718a79375063d5eb02b29 +F test/where.test 480cfc1758ac9df3f70c6a2541ff586f6a4833354d5ecb548f643e30e31fddc8 F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 @@ -1753,7 +1753,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 e4b4737e348235e196a45e1b71876b82e0cc836e1c5c16ea5f9333b7509b59b8 -R 6a42221e806e5e8418ed63680c0877d8 +P d30b2a947313b146f29e2b53f0fd471409fda7938151241d3fb5863614f88999 +R f478416ffaa85b9b753e0ff20fb9a188 U drh -Z d943f4ee811a58f2418c55b10bc7aa62 +Z e3c69457c35c4a6b4c979e7c01232a05 diff --git a/manifest.uuid b/manifest.uuid index ec702125fe..837bcd5dad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d30b2a947313b146f29e2b53f0fd471409fda7938151241d3fb5863614f88999 \ No newline at end of file +85b9beb4605eb0cfe2ed063c2a1925186c9e37031f78c875e60a347cce891638 \ No newline at end of file diff --git a/src/where.c b/src/where.c index b7e51f3d94..722a0062a5 100644 --- a/src/where.c +++ b/src/where.c @@ -4056,7 +4056,11 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ pWInfo, nRowEst, nOrderBy, isOrdered ); } - rCost = sqlite3LogEstAdd(rUnsorted, aSortCost[isOrdered]); + /* TUNING: Add a small extra penalty (5) to sorting as an + ** extra encouragment to the query planner to select a plan + ** where the rows emerge in the correct order without any sorting + ** required. */ + rCost = sqlite3LogEstAdd(rUnsorted, aSortCost[isOrdered]) + 5; WHERETRACE(0x002, ("---- sort cost=%-3d (%d/%d) increases cost %3d to %-3d\n", diff --git a/test/orderby5.test b/test/orderby5.test index c9cce703ba..e83116bae0 100644 --- a/test/orderby5.test +++ b/test/orderby5.test @@ -83,7 +83,7 @@ do_execsql_test 2.1a { do_execsql_test 2.1b { EXPLAIN QUERY PLAN - SELECT * FROM t1 WHERE likelihood(a=0, 0.05) ORDER BY a, b, c; + SELECT * FROM t1 WHERE likelihood(a=0, 0.03) ORDER BY a, b, c; } {/B-TREE/} do_execsql_test 2.2 { diff --git a/test/where.test b/test/where.test index 216325d03b..db0bc47a7c 100644 --- a/test/where.test +++ b/test/where.test @@ -582,7 +582,7 @@ do_test where-6.7.2 { cksort { SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 1 } -} {1 100 4 sort} +} {1 100 4 nosort} ifcapable subquery { do_test where-6.8a { cksort {