-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
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
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
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
-aa3b0eb8c3438ddd3b660bc6bce4b1f4a0e3b5ec897079445231ee1b61210d6a
\ No newline at end of file
+136cdefb2f7b582ff1771ac7f9e733dc24c357605526cbfb1834937697c8a922
\ No newline at end of file
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
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 */
};
"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];
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",