From fa16f5d9d660dbf58cac70c2ae297d611103885c Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 3 May 2018 01:37:13 +0000 Subject: [PATCH] Enhance EXPLAIN QUERY PLAN to report the generation of constant rows using VALUES or just a SELECT without FROM. FossilOrigin-Name: c75eee69fa8a9b56ee58a4cc539e80cc982f43390dc3a357344d58479dd89a41 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/select.c | 15 ++++++--------- src/where.c | 2 +- test/eqp.test | 6 ++++++ test/orderby1.test | 9 ++++++--- test/with1.test | 1 + test/with3.test | 3 +++ 8 files changed, 35 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index 18897a018a..a51339acd3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C More\stest\scase\supdates.\s\sTests\sare\sall\srunning\snow. -D 2018-05-02T19:42:33.079 +C Enhance\sEXPLAIN\sQUERY\sPLAN\sto\sreport\sthe\sgeneration\sof\sconstant\srows\susing\nVALUES\sor\sjust\sa\sSELECT\swithout\sFROM. +D 2018-05-03T01:37:13.698 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 5ce9343cba9c189046f1afe6d2bcc1f68079439febc05267b98aec6ecc752439 @@ -493,7 +493,7 @@ F src/printf.c d3b7844ddeb11fbbdd38dd84d09c9c1ac171d21fb038473c3aa97981201cc660 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 6415381a0e9d22c0e7cba33ca4a53f81474190862f5d4838190f5eb5b0b47bc9 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac -F src/select.c 29294be54b5ef53e3359d37b394dc0077f5a594f9d07f06c5eabd1e3830abd9f +F src/select.c e612d71bc58cad38f06c9ebb9e71fa2a9f643d5775f220388b7ba17df5fe21e3 F src/shell.c.in 29309f2ab656c8817fbc3b7910b9af8464557b91cba75277a03669399c8e2730 F src/sqlite.h.in d669de545f18f2f01362de02e309cd7f15185958c71bac8f53cd5438b46d2bea F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -577,7 +577,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c aa9cffc7a2bad6b826a86c8562dd4978398720ed41cb8ee7aa9d054eb8b456a0 F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a F src/walker.c da987a20d40145c0a03c07d8fefcb2ed363becc7680d0500d9c79915591f5b1f -F src/where.c 8265aec8b13c19c9971b0012b004a8d18384dad619a07616c0a9f04401326451 +F src/where.c aa94ef44ef36763817ca952e68c03db7eee5e2d4f1f0c3a98823a58c074157bd F src/whereInt.h 2610cb87dd95509995b63decc674c60f2757697a206cfe0c085ee53d9c43cfff F src/wherecode.c 3368f0797a4b166e0773a4137d270d92ddcbce91618b11d1e9f11f7c39f33068 F src/whereexpr.c e90b2e76dcabc81edff56633bf281bc01d93b71e0c81482dc06925ce39f5844a @@ -791,7 +791,7 @@ F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea F test/enc2.test 83437a79ba1545a55fb549309175c683fb334473 F test/enc3.test 6807f7a7740a00361ca8d0ccd66bc60c8dc5f2b6 F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020 -F test/eqp.test 0d06518e010ca5f02bd56b6a45fb70514a29c7eb97d244d72826d164477cfb1e +F test/eqp.test 2ac18a1d6aa0a0a8f0eea1cc0ba7d63391e2f968a47f59643f889c7c87d238a4 F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9 F test/eval.test a64c9105d6ff163df7cf09d6ac29cdad5922078c F test/exclusive.test 1206b87e192497d78c7f35552e86a9d05421498da300fb1cce5ca5351ccde3c3 @@ -1118,7 +1118,7 @@ F test/openv2.test 0d3040974bf402e19b7df4b783e447289d7ab394 F test/optfuzz-db01.c a0c256905c8ac79f9a5de2f374a3d9f757bef0dca2a238dc7c10cc8a38031834 F test/optfuzz-db01.txt 21f6bdeadc701cf11528276e2a55c70bfcb846ba42df327f979bd9e7b6ce7041 F test/optfuzz.c 50e330304eb1992e15ddd11f3daaad9bcc0d9aaad09cb2bcc77f9515df2e88b1 -F test/orderby1.test c4bbefbdbc0b9c6046c88d3c996ab81b41f799c0885b3e656c02f9295c4773ba +F test/orderby1.test bb8535f52c42e91cfa110622ccff70597e531198bb4b033185ad84c11522ab1b F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04 F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99 F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4 @@ -1611,9 +1611,9 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/with1.test 6b98f6f2adef8909b171d0d1e3b0439e3f4d4b75be94533aaddf7f15fe002e16 +F test/with1.test 58475190cd8caaeebea8cfeb2a264ec97a0c492b8ffe9ad20cefbb23df462f96 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab -F test/with3.test 2829c3de40a9e18d13f35f8f1670f549d26a4778acbd82a3454ad9b0a07de40b +F test/with3.test 5e8ce2c585170bbbc0544e2a01a4941fa0be173ba5265e5c92eb588cd99a232d F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 F test/without_rowid1.test 533add9100255e4cc430d371b3ecfb79f11f956b86c3a1b9d34413bf8e482d8f @@ -1727,7 +1727,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 5f0e803e33aa557865d5fc830d9202d628de9a94c9757058ca48f1a560702cd3 -R 082b82ad611d4d87c26221d79d5fbd45 +P dab5e5294813891469660cceb211ac1a1e526715bb57dcdbb1ab90321e6a4dad +R 53c64522178e60b44f774331a15b70e5 U drh -Z 58923cc0a63a66a0c06aeccf7817dd66 +Z 33f2e8b7048beb839b528a03308b5edb diff --git a/manifest.uuid b/manifest.uuid index f082081d38..4dc52e5fa5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dab5e5294813891469660cceb211ac1a1e526715bb57dcdbb1ab90321e6a4dad \ No newline at end of file +c75eee69fa8a9b56ee58a4cc539e80cc982f43390dc3a357344d58479dd89a41 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 76dfef912a..14e485b2b3 100644 --- a/src/select.c +++ b/src/select.c @@ -2373,10 +2373,9 @@ static int multiSelectValues( Select *p, /* The right-most of SELECTs to be coded */ SelectDest *pDest /* What to do with query results */ ){ - Select *pPrior; - Select *pRightmost = p; int nRow = 1; int rc = 0; + int bShowAll = p->pLimit==0; assert( p->selFlags & SF_MultiValue ); do{ assert( p->selFlags & SF_Values ); @@ -2385,15 +2384,13 @@ static int multiSelectValues( if( p->pPrior==0 ) break; assert( p->pPrior->pNext==p ); p = p->pPrior; - nRow++; + nRow += bShowAll; }while(1); - ExplainQueryPlan((pParse, 0, "SCAN %d CONSTANT ROWS", nRow)); + ExplainQueryPlan((pParse, 0, "SCAN %d CONSTANT ROW%s", nRow, + nRow==1 ? "" : "S")); while( p ){ - pPrior = p->pPrior; - p->pPrior = 0; - rc = sqlite3Select(pParse, p, pDest); - p->pPrior = pPrior; - if( rc || pRightmost->pLimit ) break; + selectInnerLoop(pParse, p, -1, 0, 0, pDest, 1, 1); + if( !bShowAll ) break; p->nSelectRow = nRow; p = p->pNext; } diff --git a/src/where.c b/src/where.c index 1145a554a5..d76d9f81e2 100644 --- a/src/where.c +++ b/src/where.c @@ -4592,7 +4592,7 @@ WhereInfo *sqlite3WhereBegin( if( wctrlFlags & WHERE_WANT_DISTINCT ){ pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; } - /* ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW")); */ + ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW")); }else{ /* Assign a bit from the bitmask to every term in the FROM clause. ** diff --git a/test/eqp.test b/test/eqp.test index d25814628b..4638c34aa4 100644 --- a/test/eqp.test +++ b/test/eqp.test @@ -89,6 +89,7 @@ do_eqp_test 1.7 { } { QUERY PLAN |--MATERIALIZE xxxxxx + | `--SCAN CONSTANT ROW |--SCAN SUBQUERY xxxxxx `--SCAN TABLE t3 } @@ -99,7 +100,9 @@ do_eqp_test 1.8 { |--MATERIALIZE xxxxxx | `--COMPOUND QUERY | |--LEFT-MOST SUBQUERY + | | `--SCAN CONSTANT ROW | `--UNION USING TEMP B-TREE + | `--SCAN CONSTANT ROW |--SCAN SUBQUERY xxxxxx `--SCAN TABLE t3 } @@ -110,6 +113,7 @@ do_eqp_test 1.9 { |--MATERIALIZE xxxxxx | `--COMPOUND QUERY | |--LEFT-MOST SUBQUERY + | | `--SCAN CONSTANT ROW | `--EXCEPT USING TEMP B-TREE | `--SCAN TABLE t3 |--SCAN SUBQUERY xxxxxx @@ -122,6 +126,7 @@ do_eqp_test 1.10 { |--MATERIALIZE xxxxxx | `--COMPOUND QUERY | |--LEFT-MOST SUBQUERY + | | `--SCAN CONSTANT ROW | `--INTERSECT USING TEMP B-TREE | `--SCAN TABLE t3 |--SCAN SUBQUERY xxxxxx @@ -135,6 +140,7 @@ do_eqp_test 1.11 { |--MATERIALIZE xxxxxx | `--COMPOUND QUERY | |--LEFT-MOST SUBQUERY + | | `--SCAN CONSTANT ROW | `--UNION ALL | `--SCAN TABLE t3 |--SCAN SUBQUERY xxxxxx diff --git a/test/orderby1.test b/test/orderby1.test index 3983ff5db3..13bd7bfb5a 100644 --- a/test/orderby1.test +++ b/test/orderby1.test @@ -454,9 +454,12 @@ do_test 4.0 { # No sorting of queries that omit the FROM clause. # -do_execsql_test 5.0 { - EXPLAIN QUERY PLAN SELECT 5 ORDER BY 1 -} {} +do_eqp_test 5.0 { + SELECT 5 ORDER BY 1 +} { + QUERY PLAN + `--SCAN CONSTANT ROW +} do_execsql_test 5.1 { EXPLAIN QUERY PLAN SELECT 5 UNION ALL SELECT 3 ORDER BY 1 } {~/B-TREE/} diff --git a/test/with1.test b/test/with1.test index f1a0625049..f8965399fc 100644 --- a/test/with1.test +++ b/test/with1.test @@ -1005,6 +1005,7 @@ do_eqp_test 19.1b { } { QUERY PLAN |--MATERIALIZE xxxxxx + | `--SCAN CONSTANT ROW |--SCAN SUBQUERY xxxxxx `--SCAN SUBQUERY xxxxxx } diff --git a/test/with3.test b/test/with3.test index d13544cfa0..de150b1fc1 100644 --- a/test/with3.test +++ b/test/with3.test @@ -83,6 +83,7 @@ ifcapable analyze { QUERY PLAN |--MATERIALIZE xxxxxx | |--SETUP + | | `--SCAN CONSTANT ROW | `--RECURSIVE STEP | `--SCAN TABLE cnt |--SCAN SUBQUERY xxxxxx @@ -96,6 +97,7 @@ ifcapable analyze { QUERY PLAN |--MATERIALIZE xxxxxx | |--SETUP + | | `--SCAN CONSTANT ROW | `--RECURSIVE STEP | `--SCAN TABLE cnt |--SCAN TABLE y1 @@ -117,6 +119,7 @@ do_eqp_test 3.2.2 { QUERY PLAN |--MATERIALIZE xxxxxx | |--SETUP + | | |--SCAN CONSTANT ROW | | `--SCALAR SUBQUERY | | `--SCAN TABLE w2 | `--RECURSIVE STEP