From: drh Date: Tue, 10 Dec 2019 20:41:48 +0000 (+0000) Subject: Enhance LEMON to provide the ability to mark a rules as one that will never X-Git-Tag: version-3.31.0~236 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e94006eb4290b428c0fe16b2979540fdcc22a213;p=thirdparty%2Fsqlite.git Enhance LEMON to provide the ability to mark a rules as one that will never reduce due to intervention of actions. Use this new capability to designate the EXPLAIN rule as NEVER-REDUCES. FossilOrigin-Name: 136cdefb2f7b582ff1771ac7f9e733dc24c357605526cbfb1834937697c8a922 --- diff --git a/manifest b/manifest index 7ab26c59ef..b5d35ae301 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sa\sstatement\sjournal\son\sa\sCREATE\sVIRTUAL\sTABLE\sstatement\sin\scase\sthe\nVCreate\sopcode\sfails. -D 2019-12-10T18:10:12.428 +C Enhance\sLEMON\sto\sprovide\sthe\sability\sto\smark\sa\srules\sas\sone\sthat\swill\snever\nreduce\sdue\sto\sintervention\sof\sactions.\s\sUse\sthis\snew\scapability\sto\sdesignate\nthe\sEXPLAIN\srule\sas\sNEVER-REDUCES. +D 2019-12-10T20:41:48.257 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -516,7 +516,7 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 30f20d2263d3717f41a0d9a40f7a3d0f48ce1cfab461b875c6187ead9d6ad1c7 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 33fbc05dea154f81f6e684f70f789dae2eae8e4466876a4aaff09315d61f8193 +F src/parse.y c8d2de64db469fd56e0fa24da46cd8ec8523eb98626567d2708df371b47fdc3f F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 @@ -1771,7 +1771,7 @@ F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c fa7912caf5662ee9b3afc7ff2a2607e81437d603e2f86c88ab412ef43f78fc24 +F tool/lemon.c 8c1abca65016ee24bc0d5aeda5510f8ee9123fdef652b9a20616a658f95c1401 F tool/lempar.c 34b136b281ae022277738d8b51061237fb330deaa317010d89375117e3a028aa F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 @@ -1852,7 +1852,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 707a058a22bd00ef14431cee0d02048cf1be745c0ef5254eda76c325435738ff -R 23ee033913924b108d077e6224dfd82d +P aa3b0eb8c3438ddd3b660bc6bce4b1f4a0e3b5ec897079445231ee1b61210d6a +R 543dcc0e810492e80486964ff81f667f U drh -Z 2cb3de8b05248e16070eb6d2faf81d46 +Z 017e3ed3e4f8730ab8c0fd98979c33fd diff --git a/manifest.uuid b/manifest.uuid index b0608704d6..a6aea048b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aa3b0eb8c3438ddd3b660bc6bce4b1f4a0e3b5ec897079445231ee1b61210d6a \ No newline at end of file +136cdefb2f7b582ff1771ac7f9e733dc24c357605526cbfb1834937697c8a922 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 24a811220f..5876a1aee3 100644 --- a/src/parse.y +++ b/src/parse.y @@ -120,7 +120,7 @@ cmdlist ::= ecmd. ecmd ::= SEMI. ecmd ::= cmdx SEMI. %ifndef SQLITE_OMIT_EXPLAIN -ecmd ::= explain cmdx SEMI. +ecmd ::= explain cmdx SEMI. {NEVER-REDUCE} explain ::= EXPLAIN. { pParse->explain = 1; } explain ::= EXPLAIN QUERY PLAN. { pParse->explain = 2; } %endif SQLITE_OMIT_EXPLAIN diff --git a/tool/lemon.c b/tool/lemon.c index dca3ec6720..c6780de9a8 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -292,13 +292,15 @@ struct rule { const char *code; /* The code executed when this rule is reduced */ const char *codePrefix; /* Setup code before code[] above */ const char *codeSuffix; /* Breakdown code after code[] above */ - int noCode; /* True if this rule has no associated C code */ - int codeEmitted; /* True if the code has been emitted already */ struct symbol *precsym; /* Precedence symbol for this rule */ int index; /* An index number for this rule */ int iRule; /* Rule number as used in the generated tables */ + Boolean noCode; /* True if this rule has no associated C code */ + Boolean codeEmitted; /* True if the code has been emitted already */ Boolean canReduce; /* True if this rule is ever reduced */ Boolean doesReduce; /* Reduce actions occur after optimization */ + Boolean neverReduce; /* Reduce is theoretically possible, but prevented + ** by actions or other outside implementation */ struct rule *nextlhs; /* Next rule with the same LHS */ struct rule *next; /* Next rule in the global list */ }; @@ -2278,6 +2280,8 @@ fragment which begins on this line."); "Code fragment beginning on this line is not the first \ to follow the previous rule."); psp->errorcnt++; + }else if( strcmp(x, "{NEVER-REDUCE")==0 ){ + psp->prevrule->neverReduce = 1; }else{ psp->prevrule->line = psp->tokenlineno; psp->prevrule->code = &x[1]; @@ -4745,7 +4749,10 @@ void ReportTable( assert( rp->noCode ); fprintf(out," /* (%d) ", rp->iRule); writeRuleText(out, rp); - if( rp->doesReduce ){ + if( rp->neverReduce ){ + fprintf(out, " (NEVER REDUCES) */ assert(yyruleno!=%d);\n", + rp->iRule); lineno++; + }else if( rp->doesReduce ){ fprintf(out, " */ yytestcase(yyruleno==%d);\n", rp->iRule); lineno++; }else{ fprintf(out, " (OPTIMIZED OUT) */ assert(yyruleno!=%d);\n",