]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhance LEMON to provide the ability to mark a rules as one that will never
authordrh <drh@noemail.net>
Tue, 10 Dec 2019 20:41:48 +0000 (20:41 +0000)
committerdrh <drh@noemail.net>
Tue, 10 Dec 2019 20:41:48 +0000 (20:41 +0000)
reduce due to intervention of actions.  Use this new capability to designate
the EXPLAIN rule as NEVER-REDUCES.

FossilOrigin-Name: 136cdefb2f7b582ff1771ac7f9e733dc24c357605526cbfb1834937697c8a922

manifest
manifest.uuid
src/parse.y
tool/lemon.c

index 7ab26c59ef6f2f77d5cbe04e505d332659bb8b34..b5d35ae301b2bb6728de84838a9ca09d867d61d0 100644 (file)
--- 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
index b0608704d60960a1ebbc4f8f96ed933c0201c1a4..a6aea048b19e46c61afc04ef92e305b2028dca46 100644 (file)
@@ -1 +1 @@
-aa3b0eb8c3438ddd3b660bc6bce4b1f4a0e3b5ec897079445231ee1b61210d6a
\ No newline at end of file
+136cdefb2f7b582ff1771ac7f9e733dc24c357605526cbfb1834937697c8a922
\ No newline at end of file
index 24a811220ff76036f79b4647ba540a7eb35e589e..5876a1aee3b34a3728258802906e0d7136a27d13 100644 (file)
@@ -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
index dca3ec67204155337d4d056a15a22adcd14254f2..c6780de9a8ebdb820f4268bb8c3bc0f7c013adf8 100644 (file)
@@ -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",