Tarantool development patches archive
 help / color / mirror / Atom feed
* [tarantool-patches] [PATCH v3] sql: remove support of partial indexes
@ 2018-04-24 18:39 Gleb
  2018-04-25  9:22 ` [tarantool-patches] " Alexander Turenko
  0 siblings, 1 reply; 4+ messages in thread
From: Gleb @ 2018-04-24 18:39 UTC (permalink / raw)
  To: tarantool-patches

Remove support of partial indexes.
Add test which checks inaccessibility of partial index syntax.
Delete usage of partial index from tests.
They can be enabled after #2626.

Fixes #2165
---
Issue from https://github.com/tarantool/tarantool/issues/2165.
Source from https://github.com/tarantool/tarantool/tree/gh-2165-remove-support-partial-indexes.
Changes in v3:
 -return tests which use partial.
 -delete "WHERE" from returned tests.
 -correct syntax errors in commit
 src/box/sql/parse.c                                | 4014 ++++++++++++++++++++
 src/box/sql/parse.y                                |    4 +-
 test/sql-tap/analyze9.test.lua                     |    2 +-
 test/sql-tap/autoindex4.test.lua                   |    2 +-
 test/sql-tap/fkey1.test.lua                        |    2 +-
 ...gh-2165-remove-support-partial-indexes.test.lua |   17 +
 test/sql-tap/index6.test.lua                       |   12 +-
 test/sql-tap/index7.test.lua                       |   25 +-
 8 files changed, 4055 insertions(+), 23 deletions(-)
 create mode 100644 src/box/sql/parse.c
 create mode 100644 test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua

diff --git a/src/box/sql/parse.c b/src/box/sql/parse.c
new file mode 100644
index 0000000..36246c3
--- /dev/null
+++ b/src/box/sql/parse.c
@@ -0,0 +1,4014 @@
+/*
+** 2000-05-29
+**
+** The author disclaims copyright to this source code.  In place of
+** a legal notice, here is a blessing:
+**
+**    May you do good and not evil.
+**    May you find forgiveness for yourself and forgive others.
+**    May you share freely, never taking more than you give.
+**
+*************************************************************************
+** Driver template for the LEMON parser generator.
+**
+** The "lemon" program processes an LALR(1) input grammar file, then uses
+** this template to construct a parser.  The "lemon" program inserts text
+** at each "%%" line.  Also, any "P-a-r-s-e" identifer prefix (without the
+** interstitial "-" characters) contained in this template is changed into
+** the value of the %name directive from the grammar.  Otherwise, the content
+** of this template is copied straight through into the generate parser
+** source file.
+**
+** The following is the concatenation of all %include directives from the
+** input grammar file:
+*/
+#include <stdio.h>
+#include <stdbool.h>
+/************ Begin %include sections from the grammar ************************/
+#line 52 "parse.y"
+
+#include "sqliteInt.h"
+
+/*
+** Disable all error recovery processing in the parser push-down
+** automaton.
+*/
+#define YYNOERRORRECOVERY 1
+
+/*
+** Make yytestcase() the same as testcase()
+*/
+#define yytestcase(X) testcase(X)
+
+/*
+** Indicate that sqlite3ParserFree() will never be called with a null
+** pointer.
+*/
+#define YYPARSEFREENEVERNULL 1
+
+/*
+** Alternative datatype for the argument to the malloc() routine passed
+** into sqlite3ParserAlloc().  The default is size_t.
+*/
+#define YYMALLOCARGTYPE  u64
+
+/*
+** An instance of this structure holds information about the
+** LIMIT clause of a SELECT statement.
+*/
+struct LimitVal {
+  Expr *pLimit;    /* The LIMIT expression.  NULL if there is no limit */
+  Expr *pOffset;   /* The OFFSET expression.  NULL if there is none */
+};
+
+/*
+** An instance of the following structure describes the event of a
+** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
+** TK_DELETE, or TK_INSTEAD.  If the event is of the form
+**
+**      UPDATE ON (a,b,c)
+**
+** Then the "b" IdList records the list "a,b,c".
+*/
+struct TrigEvent { int a; IdList * b; };
+
+/*
+** Disable lookaside memory allocation for objects that might be
+** shared across database connections.
+*/
+static void disableLookaside(Parse *pParse){
+  pParse->disableLookaside++;
+  pParse->db->lookaside.bDisable++;
+}
+
+#line 403 "parse.y"
+
+  /*
+  ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
+  ** all elements in the list.  And make sure list length does not exceed
+  ** SQLITE_LIMIT_COMPOUND_SELECT.
+  */
+  static void parserDoubleLinkSelect(Parse *pParse, Select *p){
+    if( p->pPrior ){
+      Select *pNext = 0, *pLoop;
+      int mxSelect, cnt = 0;
+      for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
+        pLoop->pNext = pNext;
+        pLoop->selFlags |= SF_Compound;
+      }
+      if( (p->selFlags & SF_MultiValue)==0 && 
+        (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
+        cnt>mxSelect
+      ){
+        sqlite3ErrorMsg(pParse, "Too many UNION or EXCEPT or INTERSECT operations");
+      }
+    }
+  }
+#line 840 "parse.y"
+
+  /* This is a utility routine used to set the ExprSpan.zStart and
+  ** ExprSpan.zEnd values of pOut so that the span covers the complete
+  ** range of text beginning with pStart and going to the end of pEnd.
+  */
+  static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
+    pOut->zStart = pStart->z;
+    pOut->zEnd = &pEnd->z[pEnd->n];
+  }
+
+  /* Construct a new Expr object from a single identifier.  Use the
+  ** new Expr to populate pOut.  Set the span of pOut to be the identifier
+  ** that created the expression.
+  */
+  static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token t){
+    Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
+    if( p ){
+      memset(p, 0, sizeof(Expr));
+      p->op = (u8)op;
+      p->flags = EP_Leaf;
+      p->iAgg = -1;
+      p->u.zToken = (char*)&p[1];
+      memcpy(p->u.zToken, t.z, t.n);
+      p->u.zToken[t.n] = 0;
+      if (op != TK_VARIABLE){
+        sqlite3NormalizeName(p->u.zToken);
+      }
+#if SQLITE_MAX_EXPR_DEPTH>0
+      p->nHeight = 1;
+#endif  
+    }
+    pOut->pExpr = p;
+    pOut->zStart = t.z;
+    pOut->zEnd = &t.z[t.n];
+  }
+#line 948 "parse.y"
+
+  /* This routine constructs a binary expression node out of two ExprSpan
+  ** objects and uses the result to populate a new ExprSpan object.
+  */
+  static void spanBinaryExpr(
+    Parse *pParse,      /* The parsing context.  Errors accumulate here */
+    int op,             /* The binary operation */
+    ExprSpan *pLeft,    /* The left operand, and output */
+    ExprSpan *pRight    /* The right operand */
+  ){
+    pLeft->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr);
+    pLeft->zEnd = pRight->zEnd;
+  }
+
+  /* If doNot is true, then add a TK_NOT Expr-node wrapper around the
+  ** outside of *ppExpr.
+  */
+  static void exprNot(Parse *pParse, int doNot, ExprSpan *pSpan){
+    if( doNot ){
+      pSpan->pExpr = sqlite3PExpr(pParse, TK_NOT, pSpan->pExpr, 0);
+    }
+  }
+#line 1022 "parse.y"
+
+  /* Construct an expression node for a unary postfix operator
+  */
+  static void spanUnaryPostfix(
+    Parse *pParse,         /* Parsing context to record errors */
+    int op,                /* The operator */
+    ExprSpan *pOperand,    /* The operand, and output */
+    Token *pPostOp         /* The operand token for setting the span */
+  ){
+    pOperand->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0);
+    pOperand->zEnd = &pPostOp->z[pPostOp->n];
+  }                           
+#line 1039 "parse.y"
+
+  /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
+  ** unary TK_ISNULL or TK_NOTNULL expression. */
+  static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
+    sqlite3 *db = pParse->db;
+    if( pA && pY && pY->op==TK_NULL ){
+      pA->op = (u8)op;
+      sql_expr_free(db, pA->pRight, false);
+      pA->pRight = 0;
+    }
+  }
+#line 1067 "parse.y"
+
+  /* Construct an expression node for a unary prefix operator
+  */
+  static void spanUnaryPrefix(
+    ExprSpan *pOut,        /* Write the new expression node here */
+    Parse *pParse,         /* Parsing context to record errors */
+    int op,                /* The operator */
+    ExprSpan *pOperand,    /* The operand */
+    Token *pPreOp         /* The operand token for setting the span */
+  ){
+    pOut->zStart = pPreOp->z;
+    pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0);
+    pOut->zEnd = pOperand->zEnd;
+  }
+#line 1268 "parse.y"
+
+  /* Add a single new term to an ExprList that is used to store a
+  ** list of identifiers.  Report an error if the ID list contains
+  ** a COLLATE clause or an ASC or DESC keyword, except ignore the
+  ** error while parsing a legacy schema.
+  */
+  static ExprList *parserAddExprIdListTerm(
+    Parse *pParse,
+    ExprList *pPrior,
+    Token *pIdToken,
+    int hasCollate,
+    int sortOrder
+  ){
+    ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
+    if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
+        && pParse->db->init.busy==0
+    ){
+      sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
+                         pIdToken->n, pIdToken->z);
+    }
+    sqlite3ExprListSetName(pParse, p, pIdToken, 1);
+    return p;
+  }
+#line 231 "parse.c"
+/**************** End of %include directives **********************************/
+/* These constants specify the various numeric values for terminal symbols
+** in a format understandable to "makeheaders".  This section is blank unless
+** "lemon" is run with the "-m" command-line option.
+***************** Begin makeheaders token definitions *************************/
+/**************** End makeheaders token definitions ***************************/
+
+/* The next sections is a series of control #defines.
+** various aspects of the generated parser.
+**    YYCODETYPE         is the data type used to store the integer codes
+**                       that represent terminal and non-terminal symbols.
+**                       "unsigned char" is used if there are fewer than
+**                       256 symbols.  Larger types otherwise.
+**    YYNOCODE           is a number of type YYCODETYPE that is not used for
+**                       any terminal or nonterminal symbol.
+**    YYFALLBACK         If defined, this indicates that one or more tokens
+**                       (also known as: "terminal symbols") have fall-back
+**                       values which should be used if the original symbol
+**                       would not parse.  This permits keywords to sometimes
+**                       be used as identifiers, for example.
+**    YYACTIONTYPE       is the data type used for "action codes" - numbers
+**                       that indicate what to do in response to the next
+**                       token.
+**    sqlite3ParserTOKENTYPE     is the data type used for minor type for terminal
+**                       symbols.  Background: A "minor type" is a semantic
+**                       value associated with a terminal or non-terminal
+**                       symbols.  For example, for an "ID" terminal symbol,
+**                       the minor type might be the name of the identifier.
+**                       Each non-terminal can have a different minor type.
+**                       Terminal symbols all have the same minor type, though.
+**                       This macros defines the minor type for terminal 
+**                       symbols.
+**    YYMINORTYPE        is the data type used for all minor types.
+**                       This is typically a union of many types, one of
+**                       which is sqlite3ParserTOKENTYPE.  The entry in the union
+**                       for terminal symbols is called "yy0".
+**    YYSTACKDEPTH       is the maximum depth of the parser's stack.  If
+**                       zero the stack is dynamically sized using realloc()
+**    sqlite3ParserARG_SDECL     A static variable declaration for the %extra_argument
+**    sqlite3ParserARG_PDECL     A parameter declaration for the %extra_argument
+**    sqlite3ParserARG_STORE     Code to store %extra_argument into yypParser
+**    sqlite3ParserARG_FETCH     Code to extract %extra_argument from yypParser
+**    YYERRORSYMBOL      is the code number of the error symbol.  If not
+**                       defined, then do no error processing.
+**    YYNSTATE           the combined number of states.
+**    YYNRULE            the number of rules in the grammar
+**    YY_MAX_SHIFT       Maximum value for shift actions
+**    YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions
+**    YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions
+**    YY_MIN_REDUCE      Maximum value for reduce actions
+**    YY_ERROR_ACTION    The yy_action[] code for syntax error
+**    YY_ACCEPT_ACTION   The yy_action[] code for accept
+**    YY_NO_ACTION       The yy_action[] code for no-op
+*/
+#ifndef INTERFACE
+# define INTERFACE 1
+#endif
+/************* Begin control #defines *****************************************/
+#define YYCODETYPE unsigned char
+#define YYNOCODE 231
+#define YYACTIONTYPE unsigned short int
+#define YYWILDCARD 74
+#define sqlite3ParserTOKENTYPE Token
+typedef union {
+  int yyinit;
+  sqlite3ParserTOKENTYPE yy0;
+  struct TrigEvent yy10;
+  IdList* yy40;
+  int yy52;
+  struct {int value; int mask;} yy107;
+  With* yy151;
+  ExprSpan yy162;
+  Select* yy279;
+  Expr* yy362;
+  ExprList* yy382;
+  struct LimitVal yy384;
+  SrcList* yy387;
+  TriggerStep* yy427;
+} YYMINORTYPE;
+#ifndef YYSTACKDEPTH
+#define YYSTACKDEPTH 100
+#endif
+#define sqlite3ParserARG_SDECL Parse *pParse;
+#define sqlite3ParserARG_PDECL ,Parse *pParse
+#define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse
+#define sqlite3ParserARG_STORE yypParser->pParse = pParse
+#define YYFALLBACK 1
+#define YYNSTATE             408
+#define YYNRULE              297
+#define YY_MAX_SHIFT         407
+#define YY_MIN_SHIFTREDUCE   603
+#define YY_MAX_SHIFTREDUCE   899
+#define YY_MIN_REDUCE        900
+#define YY_MAX_REDUCE        1196
+#define YY_ERROR_ACTION      1197
+#define YY_ACCEPT_ACTION     1198
+#define YY_NO_ACTION         1199
+/************* End control #defines *******************************************/
+
+/* Define the yytestcase() macro to be a no-op if is not already defined
+** otherwise.
+**
+** Applications can choose to define yytestcase() in the %include section
+** to a macro that can assist in verifying code coverage.  For production
+** code the yytestcase() macro should be turned off.  But it is useful
+** for testing.
+*/
+#ifndef yytestcase
+# define yytestcase(X)
+#endif
+
+
+/* Next are the tables used to determine what action to take based on the
+** current state and lookahead token.  These tables are used to implement
+** functions that take a state number and lookahead value and return an
+** action integer.  
+**
+** Suppose the action integer is N.  Then the action is determined as
+** follows
+**
+**   0 <= N <= YY_MAX_SHIFT             Shift N.  That is, push the lookahead
+**                                      token onto the stack and goto state N.
+**
+**   N between YY_MIN_SHIFTREDUCE       Shift to an arbitrary state then
+**     and YY_MAX_SHIFTREDUCE           reduce by rule N-YY_MIN_SHIFTREDUCE.
+**
+**   N between YY_MIN_REDUCE            Reduce by rule N-YY_MIN_REDUCE
+**     and YY_MAX_REDUCE
+**
+**   N == YY_ERROR_ACTION               A syntax error has occurred.
+**
+**   N == YY_ACCEPT_ACTION              The parser accepts its input.
+**
+**   N == YY_NO_ACTION                  No such action.  Denotes unused
+**                                      slots in the yy_action[] table.
+**
+** The action table is constructed as a single large table named yy_action[].
+** Given state S and lookahead X, the action is computed as either:
+**
+**    (A)   N = yy_action[ yy_shift_ofst[S] + X ]
+**    (B)   N = yy_default[S]
+**
+** The (A) formula is preferred.  The B formula is used instead if:
+**    (1)  The yy_shift_ofst[S]+X value is out of range, or
+**    (2)  yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or
+**    (3)  yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT.
+** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that
+** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X.
+** Hence only tests (1) and (2) need to be evaluated.)
+**
+** The formulas above are for computing the action when the lookahead is
+** a terminal symbol.  If the lookahead is a non-terminal (as occurs after
+** a reduce action) then the yy_reduce_ofst[] array is used in place of
+** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of
+** YY_SHIFT_USE_DFLT.
+**
+** The following are the tables generated in this section:
+**
+**  yy_action[]        A single table containing all actions.
+**  yy_lookahead[]     A table containing the lookahead for each entry in
+**                     yy_action.  Used to detect hash collisions.
+**  yy_shift_ofst[]    For each state, the offset into yy_action for
+**                     shifting terminals.
+**  yy_reduce_ofst[]   For each state, the offset into yy_action for
+**                     shifting non-terminals after a reduce.
+**  yy_default[]       Default action for each state.
+**
+*********** Begin parsing tables **********************************************/
+#define YY_ACTTAB_COUNT (1401)
+static const YYACTIONTYPE yy_action[] = {
+ /*     0 */    91,   92,  284,   82,  770,  770,  782,  785,  774,  774,
+ /*    10 */    89,   89,   90,   90,   90,   90,  306,   88,   88,   88,
+ /*    20 */    88,   87,   87,   86,   86,   86,   85,  306,   90,   90,
+ /*    30 */    90,   90,   83,   88,   88,   88,   88,   87,   87,   86,
+ /*    40 */    86,   86,   85,  306,  208,  201,  884,   90,   90,   90,
+ /*    50 */    90,  122,   88,   88,   88,   88,   87,   87,   86,   86,
+ /*    60 */    86,   85,  306,   87,   87,   86,   86,   86,   85,  306,
+ /*    70 */   884,   86,   86,   86,   85,  306,   91,   92,  284,   82,
+ /*    80 */   770,  770,  782,  785,  774,  774,   89,   89,   90,   90,
+ /*    90 */    90,   90,  629,   88,   88,   88,   88,   87,   87,   86,
+ /*   100 */    86,   86,   85,  306,   91,   92,  284,   82,  770,  770,
+ /*   110 */   782,  785,  774,  774,   89,   89,   90,   90,   90,   90,
+ /*   120 */   286,   88,   88,   88,   88,   87,   87,   86,   86,   86,
+ /*   130 */    85,  306,  704,   91,   92,  284,   82,  770,  770,  782,
+ /*   140 */   785,  774,  774,   89,   89,   90,   90,   90,   90,   67,
+ /*   150 */    88,   88,   88,   88,   87,   87,   86,   86,   86,   85,
+ /*   160 */   306,  771,  771,  783,  786,  739,   93,  172,  279,  705,
+ /*   170 */   311,  277,  276,  275,  220,  273,  242,  632,  617,  720,
+ /*   180 */   721,  631,   91,   92,  284,   82,  770,  770,  782,  785,
+ /*   190 */   774,  774,   89,   89,   90,   90,   90,   90,  109,   88,
+ /*   200 */    88,   88,   88,   87,   87,   86,   86,   86,   85,  306,
+ /*   210 */    88,   88,   88,   88,   87,   87,   86,   86,   86,   85,
+ /*   220 */   306,  343,  165,  705,  340,  637,  285,  304,  303,  823,
+ /*   230 */   775,   91,   92,  284,   82,  770,  770,  782,  785,  774,
+ /*   240 */   774,   89,   89,   90,   90,   90,   90,  332,   88,   88,
+ /*   250 */    88,   88,   87,   87,   86,   86,   86,   85,  306,  182,
+ /*   260 */   742,  665,  644,  406,  406,  180,  312,  122,  137,  218,
+ /*   270 */   665,  119,  623,  623,  630,  678,  236,  329,  235,  876,
+ /*   280 */    91,   92,  284,   82,  770,  770,  782,  785,  774,  774,
+ /*   290 */    89,   89,   90,   90,   90,   90,  742,   88,   88,   88,
+ /*   300 */    88,   87,   87,   86,   86,   86,   85,  306,   22,  215,
+ /*   310 */   403,  183,  236,  319,  224,  760,  895,  753,  895,   54,
+ /*   320 */   748,  719,  704,  761,  122,  216,  365,   48,   48,   91,
+ /*   330 */    92,  284,   82,  770,  770,  782,  785,  774,  774,   89,
+ /*   340 */    89,   90,   90,   90,   90,  264,   88,   88,   88,   88,
+ /*   350 */    87,   87,   86,   86,   86,   85,  306,  752,  752,  754,
+ /*   360 */   223,  199,  381,  366,  355,  352,  351,  648,   84,   81,
+ /*   370 */   176,  698,  747, 1198,  407,    3,  350,  293,   91,   92,
+ /*   380 */   284,   82,  770,  770,  782,  785,  774,  774,   89,   89,
+ /*   390 */    90,   90,   90,   90,  316,   88,   88,   88,   88,   87,
+ /*   400 */    87,   86,   86,   86,   85,  306,   91,   92,  284,   82,
+ /*   410 */   770,  770,  782,  785,  774,  774,   89,   89,   90,   90,
+ /*   420 */    90,   90,  647,   88,   88,   88,   88,   87,   87,   86,
+ /*   430 */    86,   86,   85,  306,   91,   92,  284,   82,  770,  770,
+ /*   440 */   782,  785,  774,  774,   89,   89,   90,   90,   90,   90,
+ /*   450 */   122,   88,   88,   88,   88,   87,   87,   86,   86,   86,
+ /*   460 */    85,  306,   91,   92,  284,   82,  770,  770,  782,  785,
+ /*   470 */   774,  774,   89,   89,   90,   90,   90,   90,  145,   88,
+ /*   480 */    88,   88,   88,   87,   87,   86,   86,   86,   85,  306,
+ /*   490 */  1149, 1149,   84,   81,  176,   70,   92,  284,   82,  770,
+ /*   500 */   770,  782,  785,  774,  774,   89,   89,   90,   90,   90,
+ /*   510 */    90,  646,   88,   88,   88,   88,   87,   87,   86,   86,
+ /*   520 */    86,   85,  306,   73,  207,  122,  401,  401,  401,   91,
+ /*   530 */    80,  284,   82,  770,  770,  782,  785,  774,  774,   89,
+ /*   540 */    89,   90,   90,   90,   90,  375,   88,   88,   88,   88,
+ /*   550 */    87,   87,   86,   86,   86,   85,  306,  284,   82,  770,
+ /*   560 */   770,  782,  785,  774,  774,   89,   89,   90,   90,   90,
+ /*   570 */    90,   78,   88,   88,   88,   88,   87,   87,   86,   86,
+ /*   580 */    86,   85,  306,  403,  305,  305,  305,  604,  309,  141,
+ /*   590 */    75,   76,  263,  623,  623,  691,  872,   77,  283,  314,
+ /*   600 */    48,   48,  304,  303,  639,   78,  264,   84,   81,  176,
+ /*   610 */   399,    2, 1096,  314,  313,  307,  307,  200,  199,  200,
+ /*   620 */   141,  355,  352,  351,   75,   76,  272,  623,  623,  280,
+ /*   630 */   403,   77,  388,  350,  386,  381,  371,  760,  302,  753,
+ /*   640 */   742, 1172,  748,  660,  399,    2,  403,   10,   10,  307,
+ /*   650 */   307,  890,  298,  894,  382,  372,  236,  329,  235,  370,
+ /*   660 */   892,  292,  893,   48,   48,  360,  388,  750,  347,  332,
+ /*   670 */   201,  760,  845,  753,  704,  314,  748,  295,  397,  752,
+ /*   680 */   752,  754,  755,  402,   18,  138,  846,  109,  403,  623,
+ /*   690 */   623,  895,  109,  895,  847,  671,  164,  122,  381,  383,
+ /*   700 */   373,  750,  672,  842,  122,   48,   48,  162,  174,   78,
+ /*   710 */   718,  842,  184,  752,  752,  754,  755,  402,   18,  885,
+ /*   720 */   885,  217,  155,  252,  358,  247,  357,  203,   75,   76,
+ /*   730 */   692,  122,  688,  189,  245,   77,  109,  687,  403,  327,
+ /*   740 */   381,  380,  869,   78,  109,  286,  362,  403,  399,    2,
+ /*   750 */   245,   85,  306,  307,  307,   30,   30,   84,   81,  176,
+ /*   760 */   330,  657,   75,   76,   48,   48,  869,  403,  330,   77,
+ /*   770 */   388,  886,  707,   23,  369,  760,  167,  753,  328,  109,
+ /*   780 */   748,  254,  399,    2,   10,   10,  339,  307,  307,  403,
+ /*   790 */   363,    9,    9,  216,  365,  403,  177,  177,  294,  381,
+ /*   800 */   361,  829,  829,  324,  388,  750,   48,   48,  368,  760,
+ /*   810 */   704,  753,   10,   10,  748,  658,  403,  752,  752,  754,
+ /*   820 */   755,  402,   18,  623,  623,  403,  198,  403,  338,  885,
+ /*   830 */   885,  670,  670,   48,   48,  315,  157,  156,  822,  750,
+ /*   840 */   822,  299,   47,   47,   10,   10,   66,   68,  185,  815,
+ /*   850 */   817,  752,  752,  754,  755,  402,   18,   95,  378,  146,
+ /*   860 */   403,  633,  633,  177,  177,  651,   75,   76,  376,  240,
+ /*   870 */     5,  356,  208,   77,  884,  368,  652,   34,   34,  642,
+ /*   880 */   338,  886,  706,  760,  403,  753,  399,    2,  748,  317,
+ /*   890 */   704,  307,  307,  705,  296,  229,  262,  704,  884,  403,
+ /*   900 */    24,   35,   35,  334,  623,  623,  805,  845,  388,  623,
+ /*   910 */   623,  815,  188,  760,  403,  753,   36,   36,  748,  239,
+ /*   920 */   178,  846,  403,  746,  403,  752,  752,  754,  848,  847,
+ /*   930 */   387,   37,   37,  403,  704,  320,  403,  668,  668,   38,
+ /*   940 */    38,   26,   26,  750,  403,  228,  165,  705,  403,  840,
+ /*   950 */    27,   27,  232,   29,   29,  752,  752,  754,  755,  402,
+ /*   960 */    18,   39,   39,  403,  234,   40,   40,  826,  263,  825,
+ /*   970 */   403,  704,  677,  403,  920,  322,  227,  403,  226,  403,
+ /*   980 */    41,   41,  109,  622,  287,  403,  323,   11,   11,  403,
+ /*   990 */    42,   42,  143,  403,   97,   97,   43,   43,  403,  746,
+ /*  1000 */   403,  256,   44,   44,  403,  338,   31,   31,  403,  673,
+ /*  1010 */    45,   45,  403,  746,  403,   46,   46,   32,   32,  403,
+ /*  1020 */   751,  112,  112,  251,  693,  113,  113,  403,  704,  114,
+ /*  1030 */   114,   52,   52,  403,  250,  403,   33,   33,  403,  676,
+ /*  1040 */   403,  208,  403,  884,   98,   98,  403,  623,  623,  258,
+ /*  1050 */    49,   49,   99,   99,  393,  100,  100,   96,   96,  111,
+ /*  1060 */   111,  403,  289,  108,  108,  403,  231,  884,  403,  746,
+ /*  1070 */   403,  746,  109,  403,  163,  403,  290,  403,  104,  104,
+ /*  1080 */   403,  169,  103,  103,  403,  101,  101,  102,  102,  191,
+ /*  1090 */    51,   51,   53,   53,   50,   50,  107,   25,   25,    1,
+ /*  1100 */   627,   28,   28,  623,  623,  364,  680,  683,  683,  621,
+ /*  1110 */   161,  160,  159,  400,  287,  390,  394,  368,  398,  175,
+ /*  1120 */   174,  336,  720,  721,  627,   74,  883,   72,  688,  110,
+ /*  1130 */   261,  149,  291,  687,  300,  744,   20,  206,  331,  333,
+ /*  1140 */   206,  206,  109,  804,   64,   66,  650,  649,  109,  109,
+ /*  1150 */   348,  109,  212,  243,  821,   66,  821,  640,  640,  685,
+ /*  1160 */   714,   69,  206,    7,  812,  812,  337,   19,  734,  808,
+ /*  1170 */   625,  212,  106,  851,  756,  756,  318,  850,  153,  819,
+ /*  1180 */   288,  813,  225,  168,  233,  837,  839,  836,  335,  341,
+ /*  1190 */   342,  238,  353,  616,  241,  158,  661,  645,  246,  712,
+ /*  1200 */   644,  745,  260,  694,  249,  389,  810,  265,  809,  266,
+ /*  1210 */   271,  628,  154,  865,  614,  613,  615,  862,  135,  124,
+ /*  1220 */   117,   64,  321,  824,  731,   55,  326,  230,  346,  187,
+ /*  1230 */   147,  194,  144,  195,  126,  359,  196,  297,  642,  128,
+ /*  1240 */   664,  129,  130,  131,  344,  281,  663,  139,  662,  374,
+ /*  1250 */    63,    6,  741,   71,  841,  636,  301,  282,  635,  655,
+ /*  1260 */    94,  248,  634,  874,  379,   65,  654,   21,  377,  863,
+ /*  1270 */   222,  606,  609,  308,  179,  310,  123,  278,  219,  221,
+ /*  1280 */   404,  702,  405,  611,  392,  818,  610,  607,  816,  181,
+ /*  1290 */   115,  396,  740,  125,  120,  116,  127,  186,  674,  827,
+ /*  1300 */   253,  206,  132,  897,  105,  202,  133,  703,  835,  325,
+ /*  1310 */   255,  134,  136,  701,  700,   56,   57,  270,  257,  259,
+ /*  1320 */   684,  267,  268,  269,   58,   59,  121,  838,  190,  192,
+ /*  1330 */   790,  834,    8,  209,   12,  237,  619,  193,  148,  345,
+ /*  1340 */   197,  140,  210,  211,  250,  349,  354,  653,   60,   13,
+ /*  1350 */   204,  244,   14,   61,   62,  118,  682,  170,  759,  758,
+ /*  1360 */   788,   15,  205,  686,    4,  713,  367,  171,  173,  142,
+ /*  1370 */   708,   69,  384,   16,   66,  803,   17,  789,  385,  787,
+ /*  1380 */   792,  844,  843,  166,  391,  855,  150,  151,  213,  856,
+ /*  1390 */   274,  152,  395,  791,  757,  626,   79,  214,  620,  603,
+ /*  1400 */  1154,
+};
+static const YYCODETYPE yy_lookahead[] = {
+ /*     0 */     5,    6,    7,    8,    9,   10,   11,   12,   13,   14,
+ /*    10 */    15,   16,   17,   18,   19,   20,   32,   22,   23,   24,
+ /*    20 */    25,   26,   27,   28,   29,   30,   31,   32,   17,   18,
+ /*    30 */    19,   20,   21,   22,   23,   24,   25,   26,   27,   28,
+ /*    40 */    29,   30,   31,   32,   49,    9,   51,   17,   18,   19,
+ /*    50 */    20,  133,   22,   23,   24,   25,   26,   27,   28,   29,
+ /*    60 */    30,   31,   32,   26,   27,   28,   29,   30,   31,   32,
+ /*    70 */    75,   28,   29,   30,   31,   32,    5,    6,    7,    8,
+ /*    80 */     9,   10,   11,   12,   13,   14,   15,   16,   17,   18,
+ /*    90 */    19,   20,  160,   22,   23,   24,   25,   26,   27,   28,
+ /*   100 */    29,   30,   31,   32,    5,    6,    7,    8,    9,   10,
+ /*   110 */    11,   12,   13,   14,   15,   16,   17,   18,   19,   20,
+ /*   120 */    84,   22,   23,   24,   25,   26,   27,   28,   29,   30,
+ /*   130 */    31,   32,  143,    5,    6,    7,    8,    9,   10,   11,
+ /*   140 */    12,   13,   14,   15,   16,   17,   18,   19,   20,   50,
+ /*   150 */    22,   23,   24,   25,   26,   27,   28,   29,   30,   31,
+ /*   160 */    32,    9,   10,   11,   12,  151,   67,   48,   34,   50,
+ /*   170 */   181,   37,   38,   39,   40,   41,   48,  160,   44,  108,
+ /*   180 */   109,  160,    5,    6,    7,    8,    9,   10,   11,   12,
+ /*   190 */    13,   14,   15,   16,   17,   18,   19,   20,  184,   22,
+ /*   200 */    23,   24,   25,   26,   27,   28,   29,   30,   31,   32,
+ /*   210 */    22,   23,   24,   25,   26,   27,   28,   29,   30,   31,
+ /*   220 */    32,  217,  103,  104,  220,   48,   92,   26,   27,   38,
+ /*   230 */    78,    5,    6,    7,    8,    9,   10,   11,   12,   13,
+ /*   240 */    14,   15,   16,   17,   18,   19,   20,  143,   22,   23,
+ /*   250 */    24,   25,   26,   27,   28,   29,   30,   31,   32,  125,
+ /*   260 */    69,  167,  168,  139,  140,  131,  132,  133,   47,  145,
+ /*   270 */   176,  147,   51,   52,   48,  151,   85,   86,   87,  173,
+ /*   280 */     5,    6,    7,    8,    9,   10,   11,   12,   13,   14,
+ /*   290 */    15,   16,   17,   18,   19,   20,   69,   22,   23,   24,
+ /*   300 */    25,   26,   27,   28,   29,   30,   31,   32,  184,  187,
+ /*   310 */   143,  207,   85,   86,   87,   73,  115,   75,  117,  197,
+ /*   320 */    78,  163,  143,   48,  133,   98,   99,  160,  161,    5,
+ /*   330 */     6,    7,    8,    9,   10,   11,   12,   13,   14,   15,
+ /*   340 */    16,   17,   18,   19,   20,  143,   22,   23,   24,   25,
+ /*   350 */    26,   27,   28,   29,   30,   31,   32,  115,  116,  117,
+ /*   360 */   181,   76,  195,  196,   79,   80,   81,  169,  210,  211,
+ /*   370 */   212,  201,   48,  136,  137,  138,   91,  175,    5,    6,
+ /*   380 */     7,    8,    9,   10,   11,   12,   13,   14,   15,   16,
+ /*   390 */    17,   18,   19,   20,   77,   22,   23,   24,   25,   26,
+ /*   400 */    27,   28,   29,   30,   31,   32,    5,    6,    7,    8,
+ /*   410 */     9,   10,   11,   12,   13,   14,   15,   16,   17,   18,
+ /*   420 */    19,   20,  169,   22,   23,   24,   25,   26,   27,   28,
+ /*   430 */    29,   30,   31,   32,    5,    6,    7,    8,    9,   10,
+ /*   440 */    11,   12,   13,   14,   15,   16,   17,   18,   19,   20,
+ /*   450 */   133,   22,   23,   24,   25,   26,   27,   28,   29,   30,
+ /*   460 */    31,   32,    5,    6,    7,    8,    9,   10,   11,   12,
+ /*   470 */    13,   14,   15,   16,   17,   18,   19,   20,   49,   22,
+ /*   480 */    23,   24,   25,   26,   27,   28,   29,   30,   31,   32,
+ /*   490 */    98,   99,  210,  211,  212,  122,    6,    7,    8,    9,
+ /*   500 */    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,
+ /*   510 */    20,  169,   22,   23,   24,   25,   26,   27,   28,   29,
+ /*   520 */    30,   31,   32,  122,  198,  133,  156,  157,  158,    5,
+ /*   530 */     6,    7,    8,    9,   10,   11,   12,   13,   14,   15,
+ /*   540 */    16,   17,   18,   19,   20,  205,   22,   23,   24,   25,
+ /*   550 */    26,   27,   28,   29,   30,   31,   32,    7,    8,    9,
+ /*   560 */    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,
+ /*   570 */    20,    7,   22,   23,   24,   25,   26,   27,   28,   29,
+ /*   580 */    30,   31,   32,  143,  156,  157,  158,    1,    2,  143,
+ /*   590 */    26,   27,  143,   51,   52,  198,  159,   33,  152,  143,
+ /*   600 */   160,  161,   26,   27,  167,    7,  143,  210,  211,  212,
+ /*   610 */    46,   47,   48,  157,  158,   51,   52,  171,   76,  173,
+ /*   620 */   143,   79,   80,   81,   26,   27,  149,   51,   52,  152,
+ /*   630 */   143,   33,   68,   91,  179,  195,  196,   73,  175,   75,
+ /*   640 */    69,   48,   78,   50,   46,   47,  143,  160,  161,   51,
+ /*   650 */    52,   75,    7,   77,  151,    7,   85,   86,   87,  151,
+ /*   660 */    84,  174,   86,  160,  161,   28,   68,  103,    7,  143,
+ /*   670 */     9,   73,   39,   75,  143,  219,   78,   32,  229,  115,
+ /*   680 */   116,  117,  118,  119,  120,   47,   53,  184,  143,   51,
+ /*   690 */    52,  115,  184,  117,   61,   62,  205,  133,  195,  196,
+ /*   700 */    52,  103,   69,  151,  133,  160,  161,  199,  200,    7,
+ /*   710 */   163,  151,  181,  115,  116,  117,  118,  119,  120,   51,
+ /*   720 */    52,   76,   77,   78,   79,   80,   81,   82,   26,   27,
+ /*   730 */    28,  133,   95,  207,   89,   33,  184,  100,  143,  223,
+ /*   740 */   195,  196,   51,    7,  184,   84,  151,  143,   46,   47,
+ /*   750 */    89,   31,   32,   51,   52,  160,  161,  210,  211,  212,
+ /*   760 */   208,   36,   26,   27,  160,  161,   75,  143,  208,   33,
+ /*   770 */    68,  103,  104,  221,  143,   73,  222,   75,  226,  184,
+ /*   780 */    78,  198,   46,   47,  160,  161,  226,   51,   52,  143,
+ /*   790 */   195,  160,  161,   98,   99,  143,  182,  183,  174,  195,
+ /*   800 */   196,   85,   86,   87,   68,  103,  160,  161,  194,   73,
+ /*   810 */   143,   75,  160,  161,   78,   90,  143,  115,  116,  117,
+ /*   820 */   118,  119,  120,   51,   52,  143,  174,  143,  143,   51,
+ /*   830 */    52,  178,  179,  160,  161,  143,   26,   27,  115,  103,
+ /*   840 */   117,  195,  160,  161,  160,  161,   50,    7,  181,  157,
+ /*   850 */   158,  115,  116,  117,  118,  119,  120,   47,  174,  185,
+ /*   860 */   143,   51,   52,  182,  183,   59,   26,   27,  195,   43,
+ /*   870 */    47,   65,   49,   33,   51,  194,   70,  160,  161,   83,
+ /*   880 */   143,  103,  104,   73,  143,   75,   46,   47,   78,  208,
+ /*   890 */   143,   51,   52,   50,   88,   43,  214,  143,   75,  143,
+ /*   900 */    47,  160,  161,  143,   51,   52,   80,   39,   68,   51,
+ /*   910 */    52,  219,  227,   73,  143,   75,  160,  161,   78,   93,
+ /*   920 */    47,   53,  143,  143,  143,  115,  116,  117,  181,   61,
+ /*   930 */    62,  160,  161,  143,  143,  181,  143,  178,  179,  160,
+ /*   940 */   161,  160,  161,  103,  143,   93,  103,  104,  143,  151,
+ /*   950 */   160,  161,  126,  160,  161,  115,  116,  117,  118,  119,
+ /*   960 */   120,  160,  161,  143,  227,  160,  161,   56,  143,   58,
+ /*   970 */   143,  143,  181,  143,  101,   64,  124,  143,  126,  143,
+ /*   980 */   160,  161,  184,  154,  155,  143,  206,  160,  161,  143,
+ /*   990 */   160,  161,  134,  143,  160,  161,  160,  161,  143,  143,
+ /*  1000 */   143,  198,  160,  161,  143,  143,  160,  161,  143,  181,
+ /*  1010 */   160,  161,  143,  143,  143,  160,  161,  160,  161,  143,
+ /*  1020 */   143,  160,  161,   78,   28,  160,  161,  143,  143,  160,
+ /*  1030 */   161,  160,  161,  143,   89,  143,  160,  161,  143,  151,
+ /*  1040 */   143,   49,  143,   51,  160,  161,  143,   51,   52,  198,
+ /*  1050 */   160,  161,  160,  161,  229,  160,  161,  160,  161,  160,
+ /*  1060 */   161,  143,  206,  160,  161,  143,  181,   75,  143,  143,
+ /*  1070 */   143,  143,  184,  143,  143,  143,  206,  143,  160,  161,
+ /*  1080 */   143,   50,  160,  161,  143,  160,  161,  160,  161,  227,
+ /*  1090 */   160,  161,  160,  161,  160,  161,   47,  160,  161,   47,
+ /*  1100 */    51,  160,  161,   51,   52,   94,  183,   96,   97,  151,
+ /*  1110 */    85,   86,   87,  154,  155,  151,  151,  194,  151,  199,
+ /*  1120 */   200,    7,  108,  109,   75,  121,   50,  123,   95,   47,
+ /*  1130 */   143,   49,  206,  100,  206,   48,   16,   50,   48,   48,
+ /*  1140 */    50,   50,  184,   48,  113,   50,   77,   78,  184,  184,
+ /*  1150 */    48,  184,   50,   48,  115,   50,  117,   51,   52,   48,
+ /*  1160 */    48,   50,   50,  186,   51,   52,   52,   47,  189,   48,
+ /*  1170 */    48,   50,   50,  143,   51,   52,  202,  143,  102,  143,
+ /*  1180 */   143,  143,  202,  143,  228,  143,  189,  143,  228,  143,
+ /*  1190 */   143,  143,  164,  143,  143,  172,  143,  143,  143,  143,
+ /*  1200 */   168,  143,  202,  143,  163,  216,  163,  143,  163,  143,
+ /*  1210 */   188,  143,  186,  146,  143,  143,  143,  143,   47,  209,
+ /*  1220 */     5,  113,   45,  225,  189,  121,  128,  224,   45,  148,
+ /*  1230 */   209,  148,   47,  148,  177,   84,  148,   63,   83,  180,
+ /*  1240 */   162,  180,  180,  180,  165,  165,  162,  177,  162,  106,
+ /*  1250 */    84,   47,  177,  121,  189,  162,   32,  165,  164,  170,
+ /*  1260 */   112,  162,  162,  162,  107,  111,  170,   50,  110,   40,
+ /*  1270 */    35,    4,   36,    3,   42,   72,   43,  141,  144,  144,
+ /*  1280 */   150,  204,  142,  142,  165,   48,  142,  142,   48,  101,
+ /*  1290 */   153,  165,   99,  114,   88,  153,  102,   84,   46,  127,
+ /*  1300 */   203,   50,  127,  130,  166,  166,   84,  204,    1,  129,
+ /*  1310 */   203,  102,  114,  204,  204,   16,   16,  189,  203,  203,
+ /*  1320 */   193,  192,  191,  190,   16,   16,   88,   52,  105,  101,
+ /*  1330 */   213,    1,   34,  215,   47,  124,   46,   84,   49,    7,
+ /*  1340 */    82,   47,  218,  218,   89,   66,   66,   54,   47,   47,
+ /*  1350 */    66,   48,   47,   47,   50,   60,   95,  101,   48,   48,
+ /*  1360 */    48,   47,  105,   48,   47,   52,   50,   48,   48,   47,
+ /*  1370 */   104,   50,   75,  105,   50,   48,  105,   48,   50,   48,
+ /*  1380 */    38,   48,   48,   47,   49,   48,   47,   47,   50,   48,
+ /*  1390 */    42,   47,   49,   48,   48,   48,   47,  101,   48,    1,
+ /*  1400 */     0,
+};
+#define YY_SHIFT_USE_DFLT (1401)
+#define YY_SHIFT_COUNT    (407)
+#define YY_SHIFT_MIN      (-82)
+#define YY_SHIFT_MAX      (1400)
+static const short yy_shift_ofst[] = {
+ /*     0 */   586,  564,  598,  134,  736,  736,  736,  736,  571,   -5,
+ /*    10 */    71,   71,  736,  736,  736,  736,  736,  736,  736,  576,
+ /*    20 */   576,  542,  227,  191,  392,   99,  128,  177,  226,  275,
+ /*    30 */   324,  373,  401,  429,  457,  457,  457,  457,  457,  457,
+ /*    40 */   457,  457,  457,  457,  457,  457,  457,  457,  457,  524,
+ /*    50 */   457,  490,  550,  550,  702,  736,  736,  736,  736,  736,
+ /*    60 */   736,  736,  736,  736,  736,  736,  736,  736,  736,  736,
+ /*    70 */   736,  736,  736,  736,  736,  736,  736,  736,  736,  736,
+ /*    80 */   736,  736,  840,  736,  736,  736,  736,  736,  736,  736,
+ /*    90 */   736,  736,  736,  736,  736,  736,   11,   30,   30,   30,
+ /*   100 */    30,   30,  188,   37,   43,  661,  201,  201,  720,  695,
+ /*   110 */   772,  -16, 1401, 1401, 1401,  645,  645,  633,  633,  826,
+ /*   120 */   221,  221,  858,  772,  317,  772,  772,  772,  772,  772,
+ /*   130 */   772,  772,  772,  772,  772,  772,  772,  772,  772,  772,
+ /*   140 */   772,  691,  772,  772,  772,  691,  695,  -82,  -82,  -82,
+ /*   150 */   -82,  -82,  -82, 1401, 1401,  810,  242,  242,  285,  806,
+ /*   160 */   806,  806,  119,  823,  668,  778,  868,  716,  911,  638,
+ /*   170 */   996,  992,  992,  992,  853,  843, 1052, 1011,  637,  772,
+ /*   180 */   772,  772,  772, 1031,  648,  648,  772,  772, 1114, 1031,
+ /*   190 */   772, 1114,  772,  772,  772,  772,  772,  772,  796,  772,
+ /*   200 */   593,  772,   36,  772, 1014,  772,  772,  648,  772, 1004,
+ /*   210 */  1014, 1014,  772,  772,  772, 1076, 1033,  772, 1082,  772,
+ /*   220 */   772,  772,  772, 1171, 1215, 1108, 1177, 1177, 1177, 1177,
+ /*   230 */  1104, 1098, 1183, 1108, 1171, 1215, 1215, 1183, 1185, 1183,
+ /*   240 */  1183, 1185, 1151, 1151, 1151, 1174, 1185, 1151, 1155, 1151,
+ /*   250 */  1174, 1151, 1151, 1143, 1166, 1143, 1166, 1143, 1166, 1143,
+ /*   260 */  1166, 1204, 1132, 1185, 1224, 1224, 1185, 1148, 1157, 1154,
+ /*   270 */  1158, 1108, 1217, 1229, 1229, 1235, 1235, 1235, 1235, 1236,
+ /*   280 */  1401, 1401, 1401, 1401,  152,  852, 1025, 1049, 1120, 1087,
+ /*   290 */  1090, 1091, 1095, 1102, 1105, 1106, 1069,  725,  945, 1111,
+ /*   300 */  1112, 1113, 1121,  723, 1039, 1122, 1123,  873, 1267, 1270,
+ /*   310 */  1232, 1203, 1233, 1237, 1240, 1188, 1193, 1179, 1206, 1194,
+ /*   320 */  1213, 1252, 1172, 1251, 1175, 1173, 1180, 1222, 1307, 1209,
+ /*   330 */  1198, 1299, 1300, 1308, 1309, 1238, 1275, 1223, 1228, 1330,
+ /*   340 */  1298, 1287, 1253, 1211, 1289, 1290, 1332, 1255, 1258, 1294,
+ /*   350 */  1279, 1301, 1302, 1303, 1305, 1280, 1293, 1306, 1284, 1295,
+ /*   360 */  1310, 1311, 1312, 1304, 1261, 1314, 1315, 1317, 1316, 1256,
+ /*   370 */  1319, 1320, 1313, 1257, 1322, 1266, 1321, 1268, 1324, 1271,
+ /*   380 */  1327, 1321, 1329, 1331, 1333, 1297, 1328, 1334, 1336, 1342,
+ /*   390 */  1337, 1339, 1335, 1338, 1341, 1340, 1343, 1338, 1345, 1344,
+ /*   400 */  1346, 1347, 1349, 1296, 1350, 1348, 1398, 1400,
+};
+#define YY_REDUCE_USE_DFLT (-69)
+#define YY_REDUCE_COUNT (283)
+#define YY_REDUCE_MIN   (-68)
+#define YY_REDUCE_MAX   (1145)
+static const short yy_reduce_ofst[] = {
+ /*     0 */   237,  503,  595,  124,  167,  440,  545,  604,  552,  397,
+ /*    10 */   158,  547,  487,  624,  652,  646,  673,  684,  682,  456,
+ /*    20 */   692,  446,  681,  560,  508,  282,  282,  282,  282,  282,
+ /*    30 */   282,  282,  282,  282,  282,  282,  282,  282,  282,  282,
+ /*    40 */   282,  282,  282,  282,  282,  282,  282,  282,  282,  282,
+ /*    50 */   282,  282,  282,  282,  631,  717,  741,  756,  771,  779,
+ /*    60 */   781,  790,  793,  801,  805,  820,  827,  830,  834,  836,
+ /*    70 */   842,  846,  850,  855,  857,  861,  865,  869,  871,  876,
+ /*    80 */   884,  890,  892,  895,  897,  899,  903,  918,  922,  925,
+ /*    90 */   927,  930,  932,  934,  937,  941,  282,  282,  282,  282,
+ /*   100 */   282,  282,  282,  282,  282,   94,  370,  428,  282,  614,
+ /*   110 */   477,  282,  282,  282,  282,  437,  437,  653,  759,    4,
+ /*   120 */   104,  526,  449,  -11,   14,  179,  531,  667,  747,  754,
+ /*   130 */   791,  828,  780,  885,  685,  856,  737,  870,  926,  862,
+ /*   140 */   202,  829,  928,  825,  463,  959,  923,  798,  888,  958,
+ /*   150 */   964,  965,  967,  920,  122,  -68,   17,   21,  106,  198,
+ /*   160 */   253,  342,  170,  326,  340,  491,  455,  516,  554,  760,
+ /*   170 */   877,  583,  803,  851,  931,  170,  987,  674,  977, 1030,
+ /*   180 */  1034, 1036, 1037,  979,  974,  980, 1038, 1040,  956,  997,
+ /*   190 */  1042,  960, 1044, 1046, 1047, 1048, 1050, 1051, 1028, 1053,
+ /*   200 */  1023, 1054, 1032, 1055, 1041, 1056, 1058, 1000, 1060,  989,
+ /*   210 */  1043, 1045, 1064, 1066,  877, 1022, 1026, 1068, 1067, 1071,
+ /*   220 */  1072, 1073, 1074, 1010, 1057, 1035, 1059, 1061, 1062, 1063,
+ /*   230 */   998, 1003, 1081, 1065, 1021, 1070, 1075, 1083, 1079, 1085,
+ /*   240 */  1088, 1080, 1078, 1084, 1086, 1089, 1092, 1093, 1094, 1099,
+ /*   250 */  1096, 1100, 1101, 1077, 1097, 1103, 1107, 1109, 1115, 1110,
+ /*   260 */  1116, 1117, 1118, 1119, 1124, 1125, 1126, 1127, 1129, 1131,
+ /*   270 */  1133, 1128, 1130, 1134, 1135, 1140, 1141, 1144, 1145, 1136,
+ /*   280 */  1137, 1138, 1139, 1142,
+};
+static const YYACTIONTYPE yy_default[] = {
+ /*     0 */  1155, 1149, 1149, 1149, 1096, 1096, 1096, 1096, 1149,  992,
+ /*    10 */  1019, 1019, 1197, 1197, 1197, 1197, 1197, 1197, 1095, 1197,
+ /*    20 */  1197, 1197, 1197, 1149,  996, 1025, 1197, 1197, 1197, 1097,
+ /*    30 */  1098, 1197, 1197, 1197, 1130, 1035, 1034, 1033, 1032, 1006,
+ /*    40 */  1030, 1023, 1027, 1097, 1091, 1092, 1090, 1094, 1098, 1197,
+ /*    50 */  1026, 1060, 1075, 1059, 1197, 1197, 1197, 1197, 1197, 1197,
+ /*    60 */  1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197,
+ /*    70 */  1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197,
+ /*    80 */  1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197,
+ /*    90 */  1197, 1197, 1197, 1197, 1197, 1197, 1069, 1074, 1081, 1073,
+ /*   100 */  1070, 1062, 1061, 1063, 1064,  963, 1197, 1197, 1065, 1197,
+ /*   110 */  1197, 1066, 1078, 1077, 1076, 1164, 1163, 1197, 1197, 1103,
+ /*   120 */  1197, 1197, 1197, 1197, 1149, 1197, 1197, 1197, 1197, 1197,
+ /*   130 */  1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197,
+ /*   140 */  1197,  921, 1197, 1197, 1197,  921, 1197, 1149, 1149, 1149,
+ /*   150 */  1149, 1149, 1149,  996,  987, 1197, 1197, 1197, 1197, 1197,
+ /*   160 */  1197, 1197, 1197,  992, 1197, 1197, 1197, 1197, 1125, 1197,
+ /*   170 */  1197,  992,  992,  992, 1197,  994, 1197,  976,  986, 1197,
+ /*   180 */  1146, 1197, 1117, 1029, 1008, 1008, 1197, 1197, 1196, 1029,
+ /*   190 */  1197, 1196, 1197, 1197, 1197, 1197, 1197, 1197,  938, 1197,
+ /*   200 */  1175, 1197,  935, 1197, 1019, 1197, 1197, 1008, 1197, 1093,
+ /*   210 */  1019, 1019, 1197, 1197, 1197,  993,  986, 1197, 1197, 1197,
+ /*   220 */  1197, 1197, 1158, 1040,  966, 1029,  972,  972,  972,  972,
+ /*   230 */  1129, 1193,  915, 1029, 1040,  966,  966,  915, 1104,  915,
+ /*   240 */   915, 1104,  964,  964,  964,  953, 1104,  964,  938,  964,
+ /*   250 */   953,  964,  964, 1012, 1007, 1012, 1007, 1012, 1007, 1012,
+ /*   260 */  1007, 1099, 1197, 1104, 1108, 1108, 1104, 1024, 1013, 1022,
+ /*   270 */  1020, 1029,  956, 1161, 1161, 1157, 1157, 1157, 1157,  905,
+ /*   280 */  1170,  940,  940, 1170, 1197, 1197, 1197, 1165, 1111, 1197,
+ /*   290 */  1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197,
+ /*   300 */  1197, 1197, 1197, 1197, 1197, 1197, 1197, 1046, 1197,  902,
+ /*   310 */  1197, 1197, 1197, 1197, 1197, 1188, 1197, 1197, 1197, 1197,
+ /*   320 */  1197, 1197, 1197, 1128, 1127, 1197, 1197, 1197, 1197, 1197,
+ /*   330 */  1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1195, 1197,
+ /*   340 */  1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197,
+ /*   350 */  1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197,
+ /*   360 */  1197, 1197, 1197, 1197,  978, 1197, 1197, 1197, 1179, 1197,
+ /*   370 */  1197, 1197, 1197, 1197, 1197, 1197, 1021, 1197, 1014, 1197,
+ /*   380 */  1197, 1185, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197,
+ /*   390 */  1197, 1197, 1197, 1151, 1197, 1197, 1197, 1150, 1197, 1197,
+ /*   400 */  1197, 1197, 1197, 1197, 1197,  909, 1197, 1197,
+};
+/********** End of lemon-generated parsing tables *****************************/
+
+/* The next table maps tokens (terminal symbols) into fallback tokens.  
+** If a construct like the following:
+** 
+**      %fallback ID X Y Z.
+**
+** appears in the grammar, then ID becomes a fallback token for X, Y,
+** and Z.  Whenever one of the tokens X, Y, or Z is input to the parser
+** but it does not parse, the type of the token is changed to ID and
+** the parse is retried before an error is thrown.
+**
+** This feature can be used, for example, to cause some keywords in a language
+** to revert to identifiers if they keyword does not apply in the context where
+** it appears.
+*/
+#ifdef YYFALLBACK
+static const YYCODETYPE yyFallback[] = {
+    0,  /*          $ => nothing */
+    0,  /*       SEMI => nothing */
+    0,  /*    EXPLAIN => nothing */
+   51,  /*      QUERY => ID */
+   51,  /*       PLAN => ID */
+    0,  /*         OR => nothing */
+    0,  /*        AND => nothing */
+    0,  /*        NOT => nothing */
+    0,  /*         IS => nothing */
+   51,  /*      MATCH => ID */
+    0,  /*    LIKE_KW => nothing */
+    0,  /*    BETWEEN => nothing */
+    0,  /*         IN => nothing */
+   51,  /*     ISNULL => ID */
+   51,  /*    NOTNULL => ID */
+    0,  /*         NE => nothing */
+    0,  /*         EQ => nothing */
+    0,  /*         GT => nothing */
+    0,  /*         LE => nothing */
+    0,  /*         LT => nothing */
+    0,  /*         GE => nothing */
+    0,  /*     ESCAPE => nothing */
+    0,  /*     BITAND => nothing */
+    0,  /*      BITOR => nothing */
+    0,  /*     LSHIFT => nothing */
+    0,  /*     RSHIFT => nothing */
+    0,  /*       PLUS => nothing */
+    0,  /*      MINUS => nothing */
+    0,  /*       STAR => nothing */
+    0,  /*      SLASH => nothing */
+    0,  /*        REM => nothing */
+    0,  /*     CONCAT => nothing */
+    0,  /*    COLLATE => nothing */
+    0,  /*     BITNOT => nothing */
+    0,  /*      BEGIN => nothing */
+    0,  /* TRANSACTION => nothing */
+   51,  /*   DEFERRED => ID */
+    0,  /*     COMMIT => nothing */
+   51,  /*        END => ID */
+    0,  /*   ROLLBACK => nothing */
+    0,  /*  SAVEPOINT => nothing */
+   51,  /*    RELEASE => ID */
+    0,  /*         TO => nothing */
+    0,  /*      TABLE => nothing */
+    0,  /*     CREATE => nothing */
+   51,  /*         IF => ID */
+    0,  /*     EXISTS => nothing */
+    0,  /*         LP => nothing */
+    0,  /*         RP => nothing */
+    0,  /*         AS => nothing */
+    0,  /*      COMMA => nothing */
+    0,  /*         ID => nothing */
+    0,  /*    INDEXED => nothing */
+   51,  /*      ABORT => ID */
+   51,  /*     ACTION => ID */
+   51,  /*        ADD => ID */
+   51,  /*      AFTER => ID */
+   51,  /* AUTOINCREMENT => ID */
+   51,  /*     BEFORE => ID */
+   51,  /*    CASCADE => ID */
+   51,  /*   CONFLICT => ID */
+   51,  /*       FAIL => ID */
+   51,  /*     IGNORE => ID */
+   51,  /*  INITIALLY => ID */
+   51,  /*    INSTEAD => ID */
+   51,  /*         NO => ID */
+   51,  /*        KEY => ID */
+   51,  /*     OFFSET => ID */
+   51,  /*      RAISE => ID */
+   51,  /*    REPLACE => ID */
+   51,  /*   RESTRICT => ID */
+   51,  /*    REINDEX => ID */
+   51,  /*     RENAME => ID */
+   51,  /*   CTIME_KW => ID */
+};
+#endif /* YYFALLBACK */
+
+/* The following structure represents a single element of the
+** parser's stack.  Information stored includes:
+**
+**   +  The state number for the parser at this level of the stack.
+**
+**   +  The value of the token stored at this level of the stack.
+**      (In other words, the "major" token.)
+**
+**   +  The semantic value stored at this level of the stack.  This is
+**      the information used by the action routines in the grammar.
+**      It is sometimes called the "minor" token.
+**
+** After the "shift" half of a SHIFTREDUCE action, the stateno field
+** actually contains the reduce action for the second half of the
+** SHIFTREDUCE.
+*/
+struct yyStackEntry {
+  YYACTIONTYPE stateno;  /* The state-number, or reduce action in SHIFTREDUCE */
+  YYCODETYPE major;      /* The major token value.  This is the code
+                         ** number for the token at this stack level */
+  YYMINORTYPE minor;     /* The user-supplied minor token value.  This
+                         ** is the value of the token  */
+};
+typedef struct yyStackEntry yyStackEntry;
+
+/* The state of the parser is completely contained in an instance of
+** the following structure */
+struct yyParser {
+  yyStackEntry *yytos;          /* Pointer to top element of the stack */
+#ifdef YYTRACKMAXSTACKDEPTH
+  int yyhwm;                    /* High-water mark of the stack */
+#endif
+#ifndef YYNOERRORRECOVERY
+  int yyerrcnt;                 /* Shifts left before out of the error */
+#endif
+  bool is_fallback_failed;      /* Shows if fallback failed or not */
+  sqlite3ParserARG_SDECL                /* A place to hold %extra_argument */
+#if YYSTACKDEPTH<=0
+  int yystksz;                  /* Current side of the stack */
+  yyStackEntry *yystack;        /* The parser's stack */
+  yyStackEntry yystk0;          /* First stack entry */
+#else
+  yyStackEntry yystack[YYSTACKDEPTH];  /* The parser's stack */
+#endif
+};
+typedef struct yyParser yyParser;
+
+#ifndef NDEBUG
+#include <stdio.h>
+static FILE *yyTraceFILE = 0;
+static char *yyTracePrompt = 0;
+#endif /* NDEBUG */
+
+#ifndef NDEBUG
+/* 
+** Turn parser tracing on by giving a stream to which to write the trace
+** and a prompt to preface each trace message.  Tracing is turned off
+** by making either argument NULL 
+**
+** Inputs:
+** <ul>
+** <li> A FILE* to which trace output should be written.
+**      If NULL, then tracing is turned off.
+** <li> A prefix string written at the beginning of every
+**      line of trace output.  If NULL, then tracing is
+**      turned off.
+** </ul>
+**
+** Outputs:
+** None.
+*/
+void sqlite3ParserTrace(FILE *TraceFILE, char *zTracePrompt){
+  yyTraceFILE = TraceFILE;
+  yyTracePrompt = zTracePrompt;
+  if( yyTraceFILE==0 ) yyTracePrompt = 0;
+  else if( yyTracePrompt==0 ) yyTraceFILE = 0;
+}
+#endif /* NDEBUG */
+
+#ifndef NDEBUG
+/* For tracing shifts, the names of all terminals and nonterminals
+** are required.  The following table supplies these names */
+static const char *const yyTokenName[] = { 
+  "$",             "SEMI",          "EXPLAIN",       "QUERY",       
+  "PLAN",          "OR",            "AND",           "NOT",         
+  "IS",            "MATCH",         "LIKE_KW",       "BETWEEN",     
+  "IN",            "ISNULL",        "NOTNULL",       "NE",          
+  "EQ",            "GT",            "LE",            "LT",          
+  "GE",            "ESCAPE",        "BITAND",        "BITOR",       
+  "LSHIFT",        "RSHIFT",        "PLUS",          "MINUS",       
+  "STAR",          "SLASH",         "REM",           "CONCAT",      
+  "COLLATE",       "BITNOT",        "BEGIN",         "TRANSACTION", 
+  "DEFERRED",      "COMMIT",        "END",           "ROLLBACK",    
+  "SAVEPOINT",     "RELEASE",       "TO",            "TABLE",       
+  "CREATE",        "IF",            "EXISTS",        "LP",          
+  "RP",            "AS",            "COMMA",         "ID",          
+  "INDEXED",       "ABORT",         "ACTION",        "ADD",         
+  "AFTER",         "AUTOINCREMENT",  "BEFORE",        "CASCADE",     
+  "CONFLICT",      "FAIL",          "IGNORE",        "INITIALLY",   
+  "INSTEAD",       "NO",            "KEY",           "OFFSET",      
+  "RAISE",         "REPLACE",       "RESTRICT",      "REINDEX",     
+  "RENAME",        "CTIME_KW",      "ANY",           "STRING",      
+  "CONSTRAINT",    "DEFAULT",       "NULL",          "PRIMARY",     
+  "UNIQUE",        "CHECK",         "REFERENCES",    "AUTOINCR",    
+  "ON",            "INSERT",        "DELETE",        "UPDATE",      
+  "SET",           "DEFERRABLE",    "IMMEDIATE",     "FOREIGN",     
+  "DROP",          "VIEW",          "UNION",         "ALL",         
+  "EXCEPT",        "INTERSECT",     "SELECT",        "VALUES",      
+  "DISTINCT",      "DOT",           "FROM",          "JOIN_KW",     
+  "JOIN",          "BY",            "USING",         "ORDER",       
+  "ASC",           "DESC",          "GROUP",         "HAVING",      
+  "LIMIT",         "WHERE",         "INTO",          "FLOAT",       
+  "BLOB",          "INTEGER",       "VARIABLE",      "CAST",        
+  "CASE",          "WHEN",          "THEN",          "ELSE",        
+  "INDEX",         "PRAGMA",        "TRIGGER",       "OF",          
+  "FOR",           "EACH",          "ROW",           "ANALYZE",     
+  "ALTER",         "WITH",          "RECURSIVE",     "error",       
+  "input",         "ecmd",          "explain",       "cmdx",        
+  "cmd",           "transtype",     "trans_opt",     "nm",          
+  "savepoint_opt",  "create_table",  "create_table_args",  "createkw",    
+  "ifnotexists",   "columnlist",    "conslist_opt",  "select",      
+  "columnname",    "carglist",      "typetoken",     "typename",    
+  "signed",        "plus_num",      "minus_num",     "ccons",       
+  "term",          "expr",          "onconf",        "sortorder",   
+  "autoinc",       "eidlist_opt",   "refargs",       "defer_subclause",
+  "refarg",        "refact",        "init_deferred_pred_opt",  "conslist",    
+  "tconscomma",    "tcons",         "sortlist",      "eidlist",     
+  "defer_subclause_opt",  "orconf",        "resolvetype",   "raisetype",   
+  "ifexists",      "fullname",      "selectnowith",  "oneselect",   
+  "with",          "multiselect_op",  "distinct",      "selcollist",  
+  "from",          "where_opt",     "groupby_opt",   "having_opt",  
+  "orderby_opt",   "limit_opt",     "values",        "nexprlist",   
+  "exprlist",      "sclp",          "as",            "seltablist",  
+  "stl_prefix",    "joinop",        "indexed_opt",   "on_opt",      
+  "using_opt",     "join_nm",       "idlist",        "setlist",     
+  "insert_cmd",    "idlist_opt",    "likeop",        "between_op",  
+  "in_op",         "paren_exprlist",  "case_operand",  "case_exprlist",
+  "case_else",     "uniqueflag",    "collate",       "nmnum",       
+  "trigger_decl",  "trigger_cmd_list",  "trigger_time",  "trigger_event",
+  "foreach_clause",  "when_clause",   "trigger_cmd",   "trnm",        
+  "tridxby",       "wqlist",      
+};
+#endif /* NDEBUG */
+
+#ifndef NDEBUG
+/* For tracing reduce actions, the names of all rules are required.
+*/
+static const char *const yyRuleName[] = {
+ /*   0 */ "ecmd ::= explain cmdx SEMI",
+ /*   1 */ "ecmd ::= SEMI",
+ /*   2 */ "explain ::= EXPLAIN",
+ /*   3 */ "explain ::= EXPLAIN QUERY PLAN",
+ /*   4 */ "cmd ::= BEGIN transtype trans_opt",
+ /*   5 */ "transtype ::=",
+ /*   6 */ "transtype ::= DEFERRED",
+ /*   7 */ "cmd ::= COMMIT trans_opt",
+ /*   8 */ "cmd ::= END trans_opt",
+ /*   9 */ "cmd ::= ROLLBACK trans_opt",
+ /*  10 */ "cmd ::= SAVEPOINT nm",
+ /*  11 */ "cmd ::= RELEASE savepoint_opt nm",
+ /*  12 */ "cmd ::= ROLLBACK trans_opt TO savepoint_opt nm",
+ /*  13 */ "create_table ::= createkw TABLE ifnotexists nm",
+ /*  14 */ "createkw ::= CREATE",
+ /*  15 */ "ifnotexists ::=",
+ /*  16 */ "ifnotexists ::= IF NOT EXISTS",
+ /*  17 */ "create_table_args ::= LP columnlist conslist_opt RP",
+ /*  18 */ "create_table_args ::= AS select",
+ /*  19 */ "columnname ::= nm typetoken",
+ /*  20 */ "nm ::= ID|INDEXED",
+ /*  21 */ "typetoken ::=",
+ /*  22 */ "typetoken ::= typename LP signed RP",
+ /*  23 */ "typetoken ::= typename LP signed COMMA signed RP",
+ /*  24 */ "typename ::= typename ID|STRING",
+ /*  25 */ "ccons ::= CONSTRAINT nm",
+ /*  26 */ "ccons ::= DEFAULT term",
+ /*  27 */ "ccons ::= DEFAULT LP expr RP",
+ /*  28 */ "ccons ::= DEFAULT PLUS term",
+ /*  29 */ "ccons ::= DEFAULT MINUS term",
+ /*  30 */ "ccons ::= DEFAULT ID|INDEXED",
+ /*  31 */ "ccons ::= NOT NULL onconf",
+ /*  32 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
+ /*  33 */ "ccons ::= UNIQUE onconf",
+ /*  34 */ "ccons ::= CHECK LP expr RP",
+ /*  35 */ "ccons ::= REFERENCES nm eidlist_opt refargs",
+ /*  36 */ "ccons ::= defer_subclause",
+ /*  37 */ "ccons ::= COLLATE ID|INDEXED",
+ /*  38 */ "autoinc ::=",
+ /*  39 */ "autoinc ::= AUTOINCR",
+ /*  40 */ "refargs ::=",
+ /*  41 */ "refargs ::= refargs refarg",
+ /*  42 */ "refarg ::= MATCH nm",
+ /*  43 */ "refarg ::= ON INSERT refact",
+ /*  44 */ "refarg ::= ON DELETE refact",
+ /*  45 */ "refarg ::= ON UPDATE refact",
+ /*  46 */ "refact ::= SET NULL",
+ /*  47 */ "refact ::= SET DEFAULT",
+ /*  48 */ "refact ::= CASCADE",
+ /*  49 */ "refact ::= RESTRICT",
+ /*  50 */ "refact ::= NO ACTION",
+ /*  51 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
+ /*  52 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
+ /*  53 */ "init_deferred_pred_opt ::=",
+ /*  54 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
+ /*  55 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
+ /*  56 */ "conslist_opt ::=",
+ /*  57 */ "tconscomma ::= COMMA",
+ /*  58 */ "tcons ::= CONSTRAINT nm",
+ /*  59 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf",
+ /*  60 */ "tcons ::= UNIQUE LP sortlist RP onconf",
+ /*  61 */ "tcons ::= CHECK LP expr RP onconf",
+ /*  62 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt",
+ /*  63 */ "defer_subclause_opt ::=",
+ /*  64 */ "onconf ::=",
+ /*  65 */ "onconf ::= ON CONFLICT resolvetype",
+ /*  66 */ "orconf ::=",
+ /*  67 */ "orconf ::= OR resolvetype",
+ /*  68 */ "resolvetype ::= IGNORE",
+ /*  69 */ "resolvetype ::= REPLACE",
+ /*  70 */ "cmd ::= DROP TABLE ifexists fullname",
+ /*  71 */ "ifexists ::= IF EXISTS",
+ /*  72 */ "ifexists ::=",
+ /*  73 */ "cmd ::= createkw VIEW ifnotexists nm eidlist_opt AS select",
+ /*  74 */ "cmd ::= DROP VIEW ifexists fullname",
+ /*  75 */ "cmd ::= select",
+ /*  76 */ "select ::= with selectnowith",
+ /*  77 */ "selectnowith ::= selectnowith multiselect_op oneselect",
+ /*  78 */ "multiselect_op ::= UNION",
+ /*  79 */ "multiselect_op ::= UNION ALL",
+ /*  80 */ "multiselect_op ::= EXCEPT|INTERSECT",
+ /*  81 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
+ /*  82 */ "values ::= VALUES LP nexprlist RP",
+ /*  83 */ "values ::= values COMMA LP exprlist RP",
+ /*  84 */ "distinct ::= DISTINCT",
+ /*  85 */ "distinct ::= ALL",
+ /*  86 */ "distinct ::=",
+ /*  87 */ "sclp ::=",
+ /*  88 */ "selcollist ::= sclp expr as",
+ /*  89 */ "selcollist ::= sclp STAR",
+ /*  90 */ "selcollist ::= sclp nm DOT STAR",
+ /*  91 */ "as ::= AS nm",
+ /*  92 */ "as ::=",
+ /*  93 */ "from ::=",
+ /*  94 */ "from ::= FROM seltablist",
+ /*  95 */ "stl_prefix ::= seltablist joinop",
+ /*  96 */ "stl_prefix ::=",
+ /*  97 */ "seltablist ::= stl_prefix nm as indexed_opt on_opt using_opt",
+ /*  98 */ "seltablist ::= stl_prefix nm LP exprlist RP as on_opt using_opt",
+ /*  99 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
+ /* 100 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
+ /* 101 */ "fullname ::= nm",
+ /* 102 */ "joinop ::= COMMA|JOIN",
+ /* 103 */ "joinop ::= JOIN_KW JOIN",
+ /* 104 */ "joinop ::= JOIN_KW join_nm JOIN",
+ /* 105 */ "joinop ::= JOIN_KW join_nm join_nm JOIN",
+ /* 106 */ "on_opt ::= ON expr",
+ /* 107 */ "on_opt ::=",
+ /* 108 */ "indexed_opt ::=",
+ /* 109 */ "indexed_opt ::= INDEXED BY nm",
+ /* 110 */ "indexed_opt ::= NOT INDEXED",
+ /* 111 */ "using_opt ::= USING LP idlist RP",
+ /* 112 */ "using_opt ::=",
+ /* 113 */ "orderby_opt ::=",
+ /* 114 */ "orderby_opt ::= ORDER BY sortlist",
+ /* 115 */ "sortlist ::= sortlist COMMA expr sortorder",
+ /* 116 */ "sortlist ::= expr sortorder",
+ /* 117 */ "sortorder ::= ASC",
+ /* 118 */ "sortorder ::= DESC",
+ /* 119 */ "sortorder ::=",
+ /* 120 */ "groupby_opt ::=",
+ /* 121 */ "groupby_opt ::= GROUP BY nexprlist",
+ /* 122 */ "having_opt ::=",
+ /* 123 */ "having_opt ::= HAVING expr",
+ /* 124 */ "limit_opt ::=",
+ /* 125 */ "limit_opt ::= LIMIT expr",
+ /* 126 */ "limit_opt ::= LIMIT expr OFFSET expr",
+ /* 127 */ "limit_opt ::= LIMIT expr COMMA expr",
+ /* 128 */ "cmd ::= with DELETE FROM fullname indexed_opt where_opt",
+ /* 129 */ "where_opt ::=",
+ /* 130 */ "where_opt ::= WHERE expr",
+ /* 131 */ "cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt",
+ /* 132 */ "setlist ::= setlist COMMA nm EQ expr",
+ /* 133 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
+ /* 134 */ "setlist ::= nm EQ expr",
+ /* 135 */ "setlist ::= LP idlist RP EQ expr",
+ /* 136 */ "cmd ::= with insert_cmd INTO fullname idlist_opt select",
+ /* 137 */ "cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES",
+ /* 138 */ "insert_cmd ::= INSERT orconf",
+ /* 139 */ "insert_cmd ::= REPLACE",
+ /* 140 */ "idlist_opt ::=",
+ /* 141 */ "idlist_opt ::= LP idlist RP",
+ /* 142 */ "idlist ::= idlist COMMA nm",
+ /* 143 */ "idlist ::= nm",
+ /* 144 */ "expr ::= LP expr RP",
+ /* 145 */ "term ::= NULL",
+ /* 146 */ "expr ::= ID|INDEXED",
+ /* 147 */ "expr ::= JOIN_KW",
+ /* 148 */ "expr ::= nm DOT nm",
+ /* 149 */ "term ::= FLOAT|BLOB",
+ /* 150 */ "term ::= STRING",
+ /* 151 */ "term ::= INTEGER",
+ /* 152 */ "expr ::= VARIABLE",
+ /* 153 */ "expr ::= expr COLLATE ID|INDEXED",
+ /* 154 */ "expr ::= CAST LP expr AS typetoken RP",
+ /* 155 */ "expr ::= ID|INDEXED LP distinct exprlist RP",
+ /* 156 */ "expr ::= ID|INDEXED LP STAR RP",
+ /* 157 */ "term ::= CTIME_KW",
+ /* 158 */ "expr ::= LP nexprlist COMMA expr RP",
+ /* 159 */ "expr ::= expr AND expr",
+ /* 160 */ "expr ::= expr OR expr",
+ /* 161 */ "expr ::= expr LT|GT|GE|LE expr",
+ /* 162 */ "expr ::= expr EQ|NE expr",
+ /* 163 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
+ /* 164 */ "expr ::= expr PLUS|MINUS expr",
+ /* 165 */ "expr ::= expr STAR|SLASH|REM expr",
+ /* 166 */ "expr ::= expr CONCAT expr",
+ /* 167 */ "likeop ::= LIKE_KW|MATCH",
+ /* 168 */ "likeop ::= NOT LIKE_KW|MATCH",
+ /* 169 */ "expr ::= expr likeop expr",
+ /* 170 */ "expr ::= expr likeop expr ESCAPE expr",
+ /* 171 */ "expr ::= expr ISNULL|NOTNULL",
+ /* 172 */ "expr ::= expr NOT NULL",
+ /* 173 */ "expr ::= expr IS expr",
+ /* 174 */ "expr ::= expr IS NOT expr",
+ /* 175 */ "expr ::= NOT expr",
+ /* 176 */ "expr ::= BITNOT expr",
+ /* 177 */ "expr ::= MINUS expr",
+ /* 178 */ "expr ::= PLUS expr",
+ /* 179 */ "between_op ::= BETWEEN",
+ /* 180 */ "between_op ::= NOT BETWEEN",
+ /* 181 */ "expr ::= expr between_op expr AND expr",
+ /* 182 */ "in_op ::= IN",
+ /* 183 */ "in_op ::= NOT IN",
+ /* 184 */ "expr ::= expr in_op LP exprlist RP",
+ /* 185 */ "expr ::= LP select RP",
+ /* 186 */ "expr ::= expr in_op LP select RP",
+ /* 187 */ "expr ::= expr in_op nm paren_exprlist",
+ /* 188 */ "expr ::= EXISTS LP select RP",
+ /* 189 */ "expr ::= CASE case_operand case_exprlist case_else END",
+ /* 190 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
+ /* 191 */ "case_exprlist ::= WHEN expr THEN expr",
+ /* 192 */ "case_else ::= ELSE expr",
+ /* 193 */ "case_else ::=",
+ /* 194 */ "case_operand ::= expr",
+ /* 195 */ "case_operand ::=",
+ /* 196 */ "exprlist ::=",
+ /* 197 */ "nexprlist ::= nexprlist COMMA expr",
+ /* 198 */ "nexprlist ::= expr",
+ /* 199 */ "paren_exprlist ::=",
+ /* 200 */ "paren_exprlist ::= LP exprlist RP",
+ /* 201 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm ON nm LP sortlist RP",
+ /* 202 */ "uniqueflag ::= UNIQUE",
+ /* 203 */ "uniqueflag ::=",
+ /* 204 */ "eidlist_opt ::=",
+ /* 205 */ "eidlist_opt ::= LP eidlist RP",
+ /* 206 */ "eidlist ::= eidlist COMMA nm collate sortorder",
+ /* 207 */ "eidlist ::= nm collate sortorder",
+ /* 208 */ "collate ::=",
+ /* 209 */ "collate ::= COLLATE ID|INDEXED",
+ /* 210 */ "cmd ::= DROP INDEX ifexists fullname ON nm",
+ /* 211 */ "cmd ::= PRAGMA nm",
+ /* 212 */ "cmd ::= PRAGMA nm EQ nmnum",
+ /* 213 */ "cmd ::= PRAGMA nm LP nmnum RP",
+ /* 214 */ "cmd ::= PRAGMA nm EQ minus_num",
+ /* 215 */ "cmd ::= PRAGMA nm LP minus_num RP",
+ /* 216 */ "cmd ::= PRAGMA nm EQ nm DOT nm",
+ /* 217 */ "cmd ::= PRAGMA",
+ /* 218 */ "plus_num ::= PLUS INTEGER|FLOAT",
+ /* 219 */ "minus_num ::= MINUS INTEGER|FLOAT",
+ /* 220 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
+ /* 221 */ "trigger_decl ::= TRIGGER ifnotexists nm trigger_time trigger_event ON fullname foreach_clause when_clause",
+ /* 222 */ "trigger_time ::= BEFORE",
+ /* 223 */ "trigger_time ::= AFTER",
+ /* 224 */ "trigger_time ::= INSTEAD OF",
+ /* 225 */ "trigger_time ::=",
+ /* 226 */ "trigger_event ::= DELETE|INSERT",
+ /* 227 */ "trigger_event ::= UPDATE",
+ /* 228 */ "trigger_event ::= UPDATE OF idlist",
+ /* 229 */ "when_clause ::=",
+ /* 230 */ "when_clause ::= WHEN expr",
+ /* 231 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
+ /* 232 */ "trigger_cmd_list ::= trigger_cmd SEMI",
+ /* 233 */ "trnm ::= nm DOT nm",
+ /* 234 */ "tridxby ::= INDEXED BY nm",
+ /* 235 */ "tridxby ::= NOT INDEXED",
+ /* 236 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt",
+ /* 237 */ "trigger_cmd ::= insert_cmd INTO trnm idlist_opt select",
+ /* 238 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt",
+ /* 239 */ "trigger_cmd ::= select",
+ /* 240 */ "expr ::= RAISE LP IGNORE RP",
+ /* 241 */ "expr ::= RAISE LP raisetype COMMA STRING RP",
+ /* 242 */ "raisetype ::= ROLLBACK",
+ /* 243 */ "raisetype ::= ABORT",
+ /* 244 */ "raisetype ::= FAIL",
+ /* 245 */ "cmd ::= DROP TRIGGER ifexists fullname",
+ /* 246 */ "cmd ::= ANALYZE",
+ /* 247 */ "cmd ::= ANALYZE nm",
+ /* 248 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
+ /* 249 */ "with ::=",
+ /* 250 */ "with ::= WITH wqlist",
+ /* 251 */ "with ::= WITH RECURSIVE wqlist",
+ /* 252 */ "wqlist ::= nm eidlist_opt AS LP select RP",
+ /* 253 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP",
+ /* 254 */ "input ::= ecmd",
+ /* 255 */ "explain ::=",
+ /* 256 */ "cmdx ::= cmd",
+ /* 257 */ "trans_opt ::=",
+ /* 258 */ "trans_opt ::= TRANSACTION",
+ /* 259 */ "trans_opt ::= TRANSACTION nm",
+ /* 260 */ "savepoint_opt ::= SAVEPOINT",
+ /* 261 */ "savepoint_opt ::=",
+ /* 262 */ "cmd ::= create_table create_table_args",
+ /* 263 */ "columnlist ::= columnlist COMMA columnname carglist",
+ /* 264 */ "columnlist ::= columnname carglist",
+ /* 265 */ "typetoken ::= typename",
+ /* 266 */ "typename ::= ID|STRING",
+ /* 267 */ "signed ::= plus_num",
+ /* 268 */ "signed ::= minus_num",
+ /* 269 */ "carglist ::= carglist ccons",
+ /* 270 */ "carglist ::=",
+ /* 271 */ "ccons ::= NULL onconf",
+ /* 272 */ "conslist_opt ::= COMMA conslist",
+ /* 273 */ "conslist ::= conslist tconscomma tcons",
+ /* 274 */ "conslist ::= tcons",
+ /* 275 */ "tconscomma ::=",
+ /* 276 */ "defer_subclause_opt ::= defer_subclause",
+ /* 277 */ "resolvetype ::= raisetype",
+ /* 278 */ "selectnowith ::= oneselect",
+ /* 279 */ "oneselect ::= values",
+ /* 280 */ "sclp ::= selcollist COMMA",
+ /* 281 */ "as ::= ID|STRING",
+ /* 282 */ "join_nm ::= ID|INDEXED",
+ /* 283 */ "join_nm ::= JOIN_KW",
+ /* 284 */ "expr ::= term",
+ /* 285 */ "exprlist ::= nexprlist",
+ /* 286 */ "nmnum ::= plus_num",
+ /* 287 */ "nmnum ::= STRING",
+ /* 288 */ "nmnum ::= nm",
+ /* 289 */ "nmnum ::= ON",
+ /* 290 */ "nmnum ::= DELETE",
+ /* 291 */ "nmnum ::= DEFAULT",
+ /* 292 */ "plus_num ::= INTEGER|FLOAT",
+ /* 293 */ "foreach_clause ::=",
+ /* 294 */ "foreach_clause ::= FOR EACH ROW",
+ /* 295 */ "trnm ::= nm",
+ /* 296 */ "tridxby ::=",
+};
+#endif /* NDEBUG */
+
+
+#if YYSTACKDEPTH<=0
+/*
+** Try to increase the size of the parser stack.  Return the number
+** of errors.  Return 0 on success.
+*/
+static int yyGrowStack(yyParser *p){
+  int newSize;
+  int idx;
+  yyStackEntry *pNew;
+
+  newSize = p->yystksz*2 + 100;
+  idx = p->yytos ? (int)(p->yytos - p->yystack) : 0;
+  if( p->yystack==&p->yystk0 ){
+    pNew = malloc(newSize*sizeof(pNew[0]));
+    if( pNew ) pNew[0] = p->yystk0;
+  }else{
+    pNew = realloc(p->yystack, newSize*sizeof(pNew[0]));
+  }
+  if( pNew ){
+    p->yystack = pNew;
+    p->yytos = &p->yystack[idx];
+#ifndef NDEBUG
+    if( yyTraceFILE ){
+      fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n",
+              yyTracePrompt, p->yystksz, newSize);
+    }
+#endif
+    p->yystksz = newSize;
+  }
+  return pNew==0; 
+}
+#endif
+
+/* Datatype of the argument to the memory allocated passed as the
+** second argument to sqlite3ParserAlloc() below.  This can be changed by
+** putting an appropriate #define in the %include section of the input
+** grammar.
+*/
+#ifndef YYMALLOCARGTYPE
+# define YYMALLOCARGTYPE size_t
+#endif
+
+/* 
+** This function allocates a new parser.
+** The only argument is a pointer to a function which works like
+** malloc.
+**
+** Inputs:
+** A pointer to the function used to allocate memory.
+**
+** Outputs:
+** A pointer to a parser.  This pointer is used in subsequent calls
+** to sqlite3Parser and sqlite3ParserFree.
+*/
+void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){
+  yyParser *pParser;
+  pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) );
+  if( pParser ){
+#ifdef YYTRACKMAXSTACKDEPTH
+    pParser->yyhwm = 0;
+    pParser->is_fallback_failed = false;
+#endif
+#if YYSTACKDEPTH<=0
+    pParser->yytos = NULL;
+    pParser->yystack = NULL;
+    pParser->yystksz = 0;
+    if( yyGrowStack(pParser) ){
+      pParser->yystack = &pParser->yystk0;
+      pParser->yystksz = 1;
+    }
+#endif
+#ifndef YYNOERRORRECOVERY
+    pParser->yyerrcnt = -1;
+#endif
+    pParser->yytos = pParser->yystack;
+    pParser->yystack[0].stateno = 0;
+    pParser->yystack[0].major = 0;
+  }
+  return pParser;
+}
+
+/* The following function deletes the "minor type" or semantic value
+** associated with a symbol.  The symbol can be either a terminal
+** or nonterminal. "yymajor" is the symbol code, and "yypminor" is
+** a pointer to the value to be deleted.  The code used to do the 
+** deletions is derived from the %destructor and/or %token_destructor
+** directives of the input grammar.
+*/
+static void yy_destructor(
+  yyParser *yypParser,    /* The parser */
+  YYCODETYPE yymajor,     /* Type code for object to destroy */
+  YYMINORTYPE *yypminor   /* The object to be destroyed */
+){
+  sqlite3ParserARG_FETCH;
+  switch( yymajor ){
+    /* Here is inserted the actions which take place when a
+    ** terminal or non-terminal is destroyed.  This can happen
+    ** when the symbol is popped from the stack during a
+    ** reduce or during error processing or when a parser is 
+    ** being destroyed before it is finished parsing.
+    **
+    ** Note: during a reduce, the only symbols destroyed are those
+    ** which appear on the RHS of the rule, but which are *not* used
+    ** inside the C code.
+    */
+/********* Begin destructor definitions ***************************************/
+    case 151: /* select */
+    case 182: /* selectnowith */
+    case 183: /* oneselect */
+    case 194: /* values */
+{
+#line 397 "parse.y"
+sqlite3SelectDelete(pParse->db, (yypminor->yy279));
+#line 1469 "parse.c"
+}
+      break;
+    case 160: /* term */
+    case 161: /* expr */
+{
+#line 838 "parse.y"
+sql_expr_free(pParse->db, (yypminor->yy162).pExpr, false);
+#line 1477 "parse.c"
+}
+      break;
+    case 165: /* eidlist_opt */
+    case 174: /* sortlist */
+    case 175: /* eidlist */
+    case 187: /* selcollist */
+    case 190: /* groupby_opt */
+    case 192: /* orderby_opt */
+    case 195: /* nexprlist */
+    case 196: /* exprlist */
+    case 197: /* sclp */
+    case 207: /* setlist */
+    case 213: /* paren_exprlist */
+    case 215: /* case_exprlist */
+{
+#line 1266 "parse.y"
+sqlite3ExprListDelete(pParse->db, (yypminor->yy382));
+#line 1495 "parse.c"
+}
+      break;
+    case 181: /* fullname */
+    case 188: /* from */
+    case 199: /* seltablist */
+    case 200: /* stl_prefix */
+{
+#line 622 "parse.y"
+sqlite3SrcListDelete(pParse->db, (yypminor->yy387));
+#line 1505 "parse.c"
+}
+      break;
+    case 184: /* with */
+    case 229: /* wqlist */
+{
+#line 1517 "parse.y"
+sqlite3WithDelete(pParse->db, (yypminor->yy151));
+#line 1513 "parse.c"
+}
+      break;
+    case 189: /* where_opt */
+    case 191: /* having_opt */
+    case 203: /* on_opt */
+    case 214: /* case_operand */
+    case 216: /* case_else */
+    case 225: /* when_clause */
+{
+#line 747 "parse.y"
+sql_expr_free(pParse->db, (yypminor->yy362), false);
+#line 1525 "parse.c"
+}
+      break;
+    case 204: /* using_opt */
+    case 206: /* idlist */
+    case 209: /* idlist_opt */
+{
+#line 659 "parse.y"
+sqlite3IdListDelete(pParse->db, (yypminor->yy40));
+#line 1534 "parse.c"
+}
+      break;
+    case 221: /* trigger_cmd_list */
+    case 226: /* trigger_cmd */
+{
+#line 1390 "parse.y"
+sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy427));
+#line 1542 "parse.c"
+}
+      break;
+    case 223: /* trigger_event */
+{
+#line 1376 "parse.y"
+sqlite3IdListDelete(pParse->db, (yypminor->yy10).b);
+#line 1549 "parse.c"
+}
+      break;
+/********* End destructor definitions *****************************************/
+    default:  break;   /* If no destructor action specified: do nothing */
+  }
+}
+
+/*
+** Pop the parser's stack once.
+**
+** If there is a destructor routine associated with the token which
+** is popped from the stack, then call it.
+*/
+static void yy_pop_parser_stack(yyParser *pParser){
+  yyStackEntry *yytos;
+  assert( pParser->yytos!=0 );
+  assert( pParser->yytos > pParser->yystack );
+  yytos = pParser->yytos--;
+#ifndef NDEBUG
+  if( yyTraceFILE ){
+    fprintf(yyTraceFILE,"%sPopping %s\n",
+      yyTracePrompt,
+      yyTokenName[yytos->major]);
+  }
+#endif
+  yy_destructor(pParser, yytos->major, &yytos->minor);
+}
+
+/* 
+** Deallocate and destroy a parser.  Destructors are called for
+** all stack elements before shutting the parser down.
+**
+** If the YYPARSEFREENEVERNULL macro exists (for example because it
+** is defined in a %include section of the input grammar) then it is
+** assumed that the input pointer is never NULL.
+*/
+void sqlite3ParserFree(
+  void *p,                    /* The parser to be deleted */
+  void (*freeProc)(void*)     /* Function used to reclaim memory */
+){
+  yyParser *pParser = (yyParser*)p;
+#ifndef YYPARSEFREENEVERNULL
+  if( pParser==0 ) return;
+#endif
+  while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser);
+#if YYSTACKDEPTH<=0
+  if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack);
+#endif
+  (*freeProc)((void*)pParser);
+}
+
+/*
+** Return the peak depth of the stack for a parser.
+*/
+#ifdef YYTRACKMAXSTACKDEPTH
+int sqlite3ParserStackPeak(void *p){
+  yyParser *pParser = (yyParser*)p;
+  return pParser->yyhwm;
+}
+#endif
+
+/*
+** Find the appropriate action for a parser given the terminal
+** look-ahead token iLookAhead.
+*/
+static unsigned int yy_find_shift_action(
+  yyParser *pParser,        /* The parser */
+  YYCODETYPE iLookAhead     /* The look-ahead token */
+){
+  int i;
+  int stateno = pParser->yytos->stateno;
+ 
+  if( stateno>=YY_MIN_REDUCE ) return stateno;
+  assert( stateno <= YY_SHIFT_COUNT );
+  do{
+    i = yy_shift_ofst[stateno];
+    assert( iLookAhead!=YYNOCODE );
+    i += iLookAhead;
+    if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
+#ifdef YYFALLBACK
+      YYCODETYPE iFallback = -1;            /* Fallback token */
+      if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
+             && (iFallback = yyFallback[iLookAhead])!=0 ){
+#ifndef NDEBUG
+        if( yyTraceFILE ){
+          fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n",
+             yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]);
+        }
+#endif
+        assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */
+        iLookAhead = iFallback;
+        continue;
+      } else if ( iFallback==0 ) {
+        pParser->is_fallback_failed = true;
+      }
+#endif
+#ifdef YYWILDCARD
+      {
+        int j = i - iLookAhead + YYWILDCARD;
+        if( 
+#if YY_SHIFT_MIN+YYWILDCARD<0
+          j>=0 &&
+#endif
+#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT
+          j<YY_ACTTAB_COUNT &&
+#endif
+          yy_lookahead[j]==YYWILDCARD && iLookAhead>0
+        ){
+#ifndef NDEBUG
+          if( yyTraceFILE ){
+            fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n",
+               yyTracePrompt, yyTokenName[iLookAhead],
+               yyTokenName[YYWILDCARD]);
+          }
+#endif /* NDEBUG */
+          return yy_action[j];
+        }
+      }
+#endif /* YYWILDCARD */
+      return yy_default[stateno];
+    }else{
+      return yy_action[i];
+    }
+  }while(1);
+}
+
+/*
+** Find the appropriate action for a parser given the non-terminal
+** look-ahead token iLookAhead.
+*/
+static int yy_find_reduce_action(
+  int stateno,              /* Current state number */
+  YYCODETYPE iLookAhead     /* The look-ahead token */
+){
+  int i;
+#ifdef YYERRORSYMBOL
+  if( stateno>YY_REDUCE_COUNT ){
+    return yy_default[stateno];
+  }
+#else
+  assert( stateno<=YY_REDUCE_COUNT );
+#endif
+  i = yy_reduce_ofst[stateno];
+  assert( i!=YY_REDUCE_USE_DFLT );
+  assert( iLookAhead!=YYNOCODE );
+  i += iLookAhead;
+#ifdef YYERRORSYMBOL
+  if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
+    return yy_default[stateno];
+  }
+#else
+  assert( i>=0 && i<YY_ACTTAB_COUNT );
+  assert( yy_lookahead[i]==iLookAhead );
+#endif
+  return yy_action[i];
+}
+
+/*
+** The following routine is called if the stack overflows.
+*/
+static void yyStackOverflow(yyParser *yypParser){
+   sqlite3ParserARG_FETCH;
+#ifndef NDEBUG
+   if( yyTraceFILE ){
+     fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
+   }
+#endif
+   while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
+   /* Here code is inserted which will execute if the parser
+   ** stack every overflows */
+/******** Begin %stack_overflow code ******************************************/
+#line 41 "parse.y"
+
+  sqlite3ErrorMsg(pParse, "parser stack overflow");
+#line 1724 "parse.c"
+/******** End %stack_overflow code ********************************************/
+   sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument var */
+}
+
+/*
+** Print tracing information for a SHIFT action
+*/
+#ifndef NDEBUG
+static void yyTraceShift(yyParser *yypParser, int yyNewState){
+  if( yyTraceFILE ){
+    if( yyNewState<YYNSTATE ){
+      fprintf(yyTraceFILE,"%sShift '%s', go to state %d\n",
+         yyTracePrompt,yyTokenName[yypParser->yytos->major],
+         yyNewState);
+    }else{
+      fprintf(yyTraceFILE,"%sShift '%s'\n",
+         yyTracePrompt,yyTokenName[yypParser->yytos->major]);
+    }
+  }
+}
+#else
+# define yyTraceShift(X,Y)
+#endif
+
+/*
+** Perform a shift action.
+*/
+static void yy_shift(
+  yyParser *yypParser,          /* The parser to be shifted */
+  int yyNewState,               /* The new state to shift in */
+  int yyMajor,                  /* The major token to shift in */
+  sqlite3ParserTOKENTYPE yyMinor        /* The minor token to shift in */
+){
+  yyStackEntry *yytos;
+  yypParser->yytos++;
+#ifdef YYTRACKMAXSTACKDEPTH
+  if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){
+    yypParser->yyhwm++;
+    assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) );
+  }
+#endif
+#if YYSTACKDEPTH>0 
+  if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH] ){
+    yypParser->yytos--;
+    yyStackOverflow(yypParser);
+    return;
+  }
+#else
+  if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){
+    if( yyGrowStack(yypParser) ){
+      yypParser->yytos--;
+      yyStackOverflow(yypParser);
+      return;
+    }
+  }
+#endif
+  if( yyNewState > YY_MAX_SHIFT ){
+    yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE;
+  }
+  yytos = yypParser->yytos;
+  yytos->stateno = (YYACTIONTYPE)yyNewState;
+  yytos->major = (YYCODETYPE)yyMajor;
+  yytos->minor.yy0 = yyMinor;
+  yyTraceShift(yypParser, yyNewState);
+}
+
+/* The following table contains information about every rule that
+** is used during the reduce.
+*/
+static const struct {
+  YYCODETYPE lhs;         /* Symbol on the left-hand side of the rule */
+  unsigned char nrhs;     /* Number of right-hand side symbols in the rule */
+} yyRuleInfo[] = {
+  { 137, 3 },
+  { 137, 1 },
+  { 138, 1 },
+  { 138, 3 },
+  { 140, 3 },
+  { 141, 0 },
+  { 141, 1 },
+  { 140, 2 },
+  { 140, 2 },
+  { 140, 2 },
+  { 140, 2 },
+  { 140, 3 },
+  { 140, 5 },
+  { 145, 4 },
+  { 147, 1 },
+  { 148, 0 },
+  { 148, 3 },
+  { 146, 4 },
+  { 146, 2 },
+  { 152, 2 },
+  { 143, 1 },
+  { 154, 0 },
+  { 154, 4 },
+  { 154, 6 },
+  { 155, 2 },
+  { 159, 2 },
+  { 159, 2 },
+  { 159, 4 },
+  { 159, 3 },
+  { 159, 3 },
+  { 159, 2 },
+  { 159, 3 },
+  { 159, 5 },
+  { 159, 2 },
+  { 159, 4 },
+  { 159, 4 },
+  { 159, 1 },
+  { 159, 2 },
+  { 164, 0 },
+  { 164, 1 },
+  { 166, 0 },
+  { 166, 2 },
+  { 168, 2 },
+  { 168, 3 },
+  { 168, 3 },
+  { 168, 3 },
+  { 169, 2 },
+  { 169, 2 },
+  { 169, 1 },
+  { 169, 1 },
+  { 169, 2 },
+  { 167, 3 },
+  { 167, 2 },
+  { 170, 0 },
+  { 170, 2 },
+  { 170, 2 },
+  { 150, 0 },
+  { 172, 1 },
+  { 173, 2 },
+  { 173, 7 },
+  { 173, 5 },
+  { 173, 5 },
+  { 173, 10 },
+  { 176, 0 },
+  { 162, 0 },
+  { 162, 3 },
+  { 177, 0 },
+  { 177, 2 },
+  { 178, 1 },
+  { 178, 1 },
+  { 140, 4 },
+  { 180, 2 },
+  { 180, 0 },
+  { 140, 7 },
+  { 140, 4 },
+  { 140, 1 },
+  { 151, 2 },
+  { 182, 3 },
+  { 185, 1 },
+  { 185, 2 },
+  { 185, 1 },
+  { 183, 9 },
+  { 194, 4 },
+  { 194, 5 },
+  { 186, 1 },
+  { 186, 1 },
+  { 186, 0 },
+  { 197, 0 },
+  { 187, 3 },
+  { 187, 2 },
+  { 187, 4 },
+  { 198, 2 },
+  { 198, 0 },
+  { 188, 0 },
+  { 188, 2 },
+  { 200, 2 },
+  { 200, 0 },
+  { 199, 6 },
+  { 199, 8 },
+  { 199, 7 },
+  { 199, 7 },
+  { 181, 1 },
+  { 201, 1 },
+  { 201, 2 },
+  { 201, 3 },
+  { 201, 4 },
+  { 203, 2 },
+  { 203, 0 },
+  { 202, 0 },
+  { 202, 3 },
+  { 202, 2 },
+  { 204, 4 },
+  { 204, 0 },
+  { 192, 0 },
+  { 192, 3 },
+  { 174, 4 },
+  { 174, 2 },
+  { 163, 1 },
+  { 163, 1 },
+  { 163, 0 },
+  { 190, 0 },
+  { 190, 3 },
+  { 191, 0 },
+  { 191, 2 },
+  { 193, 0 },
+  { 193, 2 },
+  { 193, 4 },
+  { 193, 4 },
+  { 140, 6 },
+  { 189, 0 },
+  { 189, 2 },
+  { 140, 8 },
+  { 207, 5 },
+  { 207, 7 },
+  { 207, 3 },
+  { 207, 5 },
+  { 140, 6 },
+  { 140, 7 },
+  { 208, 2 },
+  { 208, 1 },
+  { 209, 0 },
+  { 209, 3 },
+  { 206, 3 },
+  { 206, 1 },
+  { 161, 3 },
+  { 160, 1 },
+  { 161, 1 },
+  { 161, 1 },
+  { 161, 3 },
+  { 160, 1 },
+  { 160, 1 },
+  { 160, 1 },
+  { 161, 1 },
+  { 161, 3 },
+  { 161, 6 },
+  { 161, 5 },
+  { 161, 4 },
+  { 160, 1 },
+  { 161, 5 },
+  { 161, 3 },
+  { 161, 3 },
+  { 161, 3 },
+  { 161, 3 },
+  { 161, 3 },
+  { 161, 3 },
+  { 161, 3 },
+  { 161, 3 },
+  { 210, 1 },
+  { 210, 2 },
+  { 161, 3 },
+  { 161, 5 },
+  { 161, 2 },
+  { 161, 3 },
+  { 161, 3 },
+  { 161, 4 },
+  { 161, 2 },
+  { 161, 2 },
+  { 161, 2 },
+  { 161, 2 },
+  { 211, 1 },
+  { 211, 2 },
+  { 161, 5 },
+  { 212, 1 },
+  { 212, 2 },
+  { 161, 5 },
+  { 161, 3 },
+  { 161, 5 },
+  { 161, 4 },
+  { 161, 4 },
+  { 161, 5 },
+  { 215, 5 },
+  { 215, 4 },
+  { 216, 2 },
+  { 216, 0 },
+  { 214, 1 },
+  { 214, 0 },
+  { 196, 0 },
+  { 195, 3 },
+  { 195, 1 },
+  { 213, 0 },
+  { 213, 3 },
+  { 140, 10 },
+  { 217, 1 },
+  { 217, 0 },
+  { 165, 0 },
+  { 165, 3 },
+  { 175, 5 },
+  { 175, 3 },
+  { 218, 0 },
+  { 218, 2 },
+  { 140, 6 },
+  { 140, 2 },
+  { 140, 4 },
+  { 140, 5 },
+  { 140, 4 },
+  { 140, 5 },
+  { 140, 6 },
+  { 140, 1 },
+  { 157, 2 },
+  { 158, 2 },
+  { 140, 5 },
+  { 220, 9 },
+  { 222, 1 },
+  { 222, 1 },
+  { 222, 2 },
+  { 222, 0 },
+  { 223, 1 },
+  { 223, 1 },
+  { 223, 3 },
+  { 225, 0 },
+  { 225, 2 },
+  { 221, 3 },
+  { 221, 2 },
+  { 227, 3 },
+  { 228, 3 },
+  { 228, 2 },
+  { 226, 7 },
+  { 226, 5 },
+  { 226, 5 },
+  { 226, 1 },
+  { 161, 4 },
+  { 161, 6 },
+  { 179, 1 },
+  { 179, 1 },
+  { 179, 1 },
+  { 140, 4 },
+  { 140, 1 },
+  { 140, 2 },
+  { 140, 6 },
+  { 184, 0 },
+  { 184, 2 },
+  { 184, 3 },
+  { 229, 6 },
+  { 229, 8 },
+  { 136, 1 },
+  { 138, 0 },
+  { 139, 1 },
+  { 142, 0 },
+  { 142, 1 },
+  { 142, 2 },
+  { 144, 1 },
+  { 144, 0 },
+  { 140, 2 },
+  { 149, 4 },
+  { 149, 2 },
+  { 154, 1 },
+  { 155, 1 },
+  { 156, 1 },
+  { 156, 1 },
+  { 153, 2 },
+  { 153, 0 },
+  { 159, 2 },
+  { 150, 2 },
+  { 171, 3 },
+  { 171, 1 },
+  { 172, 0 },
+  { 176, 1 },
+  { 178, 1 },
+  { 182, 1 },
+  { 183, 1 },
+  { 197, 2 },
+  { 198, 1 },
+  { 205, 1 },
+  { 205, 1 },
+  { 161, 1 },
+  { 196, 1 },
+  { 219, 1 },
+  { 219, 1 },
+  { 219, 1 },
+  { 219, 1 },
+  { 219, 1 },
+  { 219, 1 },
+  { 157, 1 },
+  { 224, 0 },
+  { 224, 3 },
+  { 227, 1 },
+  { 228, 0 },
+};
+
+static void yy_accept(yyParser*);  /* Forward Declaration */
+
+/*
+** Perform a reduce action and the shift that must immediately
+** follow the reduce.
+*/
+static void yy_reduce(
+  yyParser *yypParser,         /* The parser */
+  unsigned int yyruleno        /* Number of the rule by which to reduce */
+){
+  int yygoto;                     /* The next state */
+  int yyact;                      /* The next action */
+  yyStackEntry *yymsp;            /* The top of the parser's stack */
+  int yysize;                     /* Amount to pop the stack */
+  sqlite3ParserARG_FETCH;
+  yymsp = yypParser->yytos;
+#ifndef NDEBUG
+  if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){
+    yysize = yyRuleInfo[yyruleno].nrhs;
+    fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt,
+      yyRuleName[yyruleno], yymsp[-yysize].stateno);
+  }
+#endif /* NDEBUG */
+
+  /* Check that the stack is large enough to grow by a single entry
+  ** if the RHS of the rule is empty.  This ensures that there is room
+  ** enough on the stack to push the LHS value */
+  if( yyRuleInfo[yyruleno].nrhs==0 ){
+#ifdef YYTRACKMAXSTACKDEPTH
+    if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){
+      yypParser->yyhwm++;
+      assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack));
+    }
+#endif
+#if YYSTACKDEPTH>0 
+    if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH-1] ){
+      yyStackOverflow(yypParser);
+      return;
+    }
+#else
+    if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){
+      if( yyGrowStack(yypParser) ){
+        yyStackOverflow(yypParser);
+        return;
+      }
+      yymsp = yypParser->yytos;
+    }
+#endif
+  }
+
+  switch( yyruleno ){
+  /* Beginning here are the reduction cases.  A typical example
+  ** follows:
+  **   case 0:
+  **  #line <lineno> <grammarfile>
+  **     { ... }           // User supplied code
+  **  #line <lineno> <thisfile>
+  **     break;
+  */
+/********** Begin reduce actions **********************************************/
+        YYMINORTYPE yylhsminor;
+      case 0: /* ecmd ::= explain cmdx SEMI */
+#line 111 "parse.y"
+{
+	if (!pParse->parse_only)
+		sqlite3FinishCoding(pParse);
+}
+#line 2164 "parse.c"
+        break;
+      case 1: /* ecmd ::= SEMI */
+#line 115 "parse.y"
+{
+  sqlite3ErrorMsg(pParse, "syntax error: empty request");
+}
+#line 2171 "parse.c"
+        break;
+      case 2: /* explain ::= EXPLAIN */
+#line 119 "parse.y"
+{ pParse->explain = 1; }
+#line 2176 "parse.c"
+        break;
+      case 3: /* explain ::= EXPLAIN QUERY PLAN */
+#line 120 "parse.y"
+{ pParse->explain = 2; }
+#line 2181 "parse.c"
+        break;
+      case 4: /* cmd ::= BEGIN transtype trans_opt */
+#line 151 "parse.y"
+{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy52);}
+#line 2186 "parse.c"
+        break;
+      case 5: /* transtype ::= */
+#line 156 "parse.y"
+{yymsp[1].minor.yy52 = TK_DEFERRED;}
+#line 2191 "parse.c"
+        break;
+      case 6: /* transtype ::= DEFERRED */
+#line 157 "parse.y"
+{yymsp[0].minor.yy52 = yymsp[0].major; /*A-overwrites-X*/}
+#line 2196 "parse.c"
+        break;
+      case 7: /* cmd ::= COMMIT trans_opt */
+      case 8: /* cmd ::= END trans_opt */ yytestcase(yyruleno==8);
+#line 158 "parse.y"
+{sqlite3CommitTransaction(pParse);}
+#line 2202 "parse.c"
+        break;
+      case 9: /* cmd ::= ROLLBACK trans_opt */
+#line 160 "parse.y"
+{sqlite3RollbackTransaction(pParse);}
+#line 2207 "parse.c"
+        break;
+      case 10: /* cmd ::= SAVEPOINT nm */
+#line 164 "parse.y"
+{
+  sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &yymsp[0].minor.yy0);
+}
+#line 2214 "parse.c"
+        break;
+      case 11: /* cmd ::= RELEASE savepoint_opt nm */
+#line 167 "parse.y"
+{
+  sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &yymsp[0].minor.yy0);
+}
+#line 2221 "parse.c"
+        break;
+      case 12: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */
+#line 170 "parse.y"
+{
+  sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &yymsp[0].minor.yy0);
+}
+#line 2228 "parse.c"
+        break;
+      case 13: /* create_table ::= createkw TABLE ifnotexists nm */
+#line 177 "parse.y"
+{
+   sqlite3StartTable(pParse,&yymsp[0].minor.yy0,yymsp[-1].minor.yy52);
+}
+#line 2235 "parse.c"
+        break;
+      case 14: /* createkw ::= CREATE */
+#line 180 "parse.y"
+{disableLookaside(pParse);}
+#line 2240 "parse.c"
+        break;
+      case 15: /* ifnotexists ::= */
+      case 38: /* autoinc ::= */ yytestcase(yyruleno==38);
+      case 53: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==53);
+      case 63: /* defer_subclause_opt ::= */ yytestcase(yyruleno==63);
+      case 72: /* ifexists ::= */ yytestcase(yyruleno==72);
+      case 86: /* distinct ::= */ yytestcase(yyruleno==86);
+      case 208: /* collate ::= */ yytestcase(yyruleno==208);
+#line 183 "parse.y"
+{yymsp[1].minor.yy52 = 0;}
+#line 2251 "parse.c"
+        break;
+      case 16: /* ifnotexists ::= IF NOT EXISTS */
+#line 184 "parse.y"
+{yymsp[-2].minor.yy52 = 1;}
+#line 2256 "parse.c"
+        break;
+      case 17: /* create_table_args ::= LP columnlist conslist_opt RP */
+#line 186 "parse.y"
+{
+  sqlite3EndTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0);
+}
+#line 2263 "parse.c"
+        break;
+      case 18: /* create_table_args ::= AS select */
+#line 189 "parse.y"
+{
+  sqlite3EndTable(pParse,0,0,yymsp[0].minor.yy279);
+  sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy279);
+}
+#line 2271 "parse.c"
+        break;
+      case 19: /* columnname ::= nm typetoken */
+#line 195 "parse.y"
+{sqlite3AddColumn(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
+#line 2276 "parse.c"
+        break;
+      case 20: /* nm ::= ID|INDEXED */
+#line 233 "parse.y"
+{
+  if(yymsp[0].minor.yy0.isReserved) {
+    sqlite3ErrorMsg(pParse, "keyword \"%T\" is reserved", &yymsp[0].minor.yy0);
+  }
+}
+#line 2285 "parse.c"
+        break;
+      case 21: /* typetoken ::= */
+      case 56: /* conslist_opt ::= */ yytestcase(yyruleno==56);
+      case 92: /* as ::= */ yytestcase(yyruleno==92);
+#line 244 "parse.y"
+{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;}
+#line 2292 "parse.c"
+        break;
+      case 22: /* typetoken ::= typename LP signed RP */
+#line 246 "parse.y"
+{
+  yymsp[-3].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z);
+}
+#line 2299 "parse.c"
+        break;
+      case 23: /* typetoken ::= typename LP signed COMMA signed RP */
+#line 249 "parse.y"
+{
+  yymsp[-5].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z);
+}
+#line 2306 "parse.c"
+        break;
+      case 24: /* typename ::= typename ID|STRING */
+#line 254 "parse.y"
+{yymsp[-1].minor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);}
+#line 2311 "parse.c"
+        break;
+      case 25: /* ccons ::= CONSTRAINT nm */
+      case 58: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==58);
+#line 263 "parse.y"
+{pParse->constraintName = yymsp[0].minor.yy0;}
+#line 2317 "parse.c"
+        break;
+      case 26: /* ccons ::= DEFAULT term */
+      case 28: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==28);
+#line 264 "parse.y"
+{sqlite3AddDefaultValue(pParse,&yymsp[0].minor.yy162);}
+#line 2323 "parse.c"
+        break;
+      case 27: /* ccons ::= DEFAULT LP expr RP */
+#line 265 "parse.y"
+{sqlite3AddDefaultValue(pParse,&yymsp[-1].minor.yy162);}
+#line 2328 "parse.c"
+        break;
+      case 29: /* ccons ::= DEFAULT MINUS term */
+#line 267 "parse.y"
+{
+  ExprSpan v;
+  v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy162.pExpr, 0);
+  v.zStart = yymsp[-1].minor.yy0.z;
+  v.zEnd = yymsp[0].minor.yy162.zEnd;
+  sqlite3AddDefaultValue(pParse,&v);
+}
+#line 2339 "parse.c"
+        break;
+      case 30: /* ccons ::= DEFAULT ID|INDEXED */
+#line 274 "parse.y"
+{
+  ExprSpan v;
+  spanExpr(&v, pParse, TK_STRING, yymsp[0].minor.yy0);
+  sqlite3AddDefaultValue(pParse,&v);
+}
+#line 2348 "parse.c"
+        break;
+      case 31: /* ccons ::= NOT NULL onconf */
+#line 284 "parse.y"
+{sqlite3AddNotNull(pParse, yymsp[0].minor.yy52);}
+#line 2353 "parse.c"
+        break;
+      case 32: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
+#line 286 "parse.y"
+{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy52,yymsp[0].minor.yy52,yymsp[-2].minor.yy52);}
+#line 2358 "parse.c"
+        break;
+      case 33: /* ccons ::= UNIQUE onconf */
+#line 287 "parse.y"
+{sqlite3CreateIndex(pParse,0,0,0,yymsp[0].minor.yy52,0,0,0,0,
+                                   SQLITE_IDXTYPE_UNIQUE);}
+#line 2364 "parse.c"
+        break;
+      case 34: /* ccons ::= CHECK LP expr RP */
+#line 289 "parse.y"
+{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy162.pExpr);}
+#line 2369 "parse.c"
+        break;
+      case 35: /* ccons ::= REFERENCES nm eidlist_opt refargs */
+#line 291 "parse.y"
+{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy382,yymsp[0].minor.yy52);}
+#line 2374 "parse.c"
+        break;
+      case 36: /* ccons ::= defer_subclause */
+#line 292 "parse.y"
+{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy52);}
+#line 2379 "parse.c"
+        break;
+      case 37: /* ccons ::= COLLATE ID|INDEXED */
+#line 293 "parse.y"
+{sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);}
+#line 2384 "parse.c"
+        break;
+      case 39: /* autoinc ::= AUTOINCR */
+#line 298 "parse.y"
+{yymsp[0].minor.yy52 = 1;}
+#line 2389 "parse.c"
+        break;
+      case 40: /* refargs ::= */
+#line 306 "parse.y"
+{ yymsp[1].minor.yy52 = ON_CONFLICT_ACTION_NONE*0x0101; /* EV: R-19803-45884 */}
+#line 2394 "parse.c"
+        break;
+      case 41: /* refargs ::= refargs refarg */
+#line 307 "parse.y"
+{ yymsp[-1].minor.yy52 = (yymsp[-1].minor.yy52 & ~yymsp[0].minor.yy107.mask) | yymsp[0].minor.yy107.value; }
+#line 2399 "parse.c"
+        break;
+      case 42: /* refarg ::= MATCH nm */
+#line 309 "parse.y"
+{ yymsp[-1].minor.yy107.value = 0;     yymsp[-1].minor.yy107.mask = 0x000000; }
+#line 2404 "parse.c"
+        break;
+      case 43: /* refarg ::= ON INSERT refact */
+#line 310 "parse.y"
+{ yymsp[-2].minor.yy107.value = 0;     yymsp[-2].minor.yy107.mask = 0x000000; }
+#line 2409 "parse.c"
+        break;
+      case 44: /* refarg ::= ON DELETE refact */
+#line 311 "parse.y"
+{ yymsp[-2].minor.yy107.value = yymsp[0].minor.yy52;     yymsp[-2].minor.yy107.mask = 0x0000ff; }
+#line 2414 "parse.c"
+        break;
+      case 45: /* refarg ::= ON UPDATE refact */
+#line 312 "parse.y"
+{ yymsp[-2].minor.yy107.value = yymsp[0].minor.yy52<<8;  yymsp[-2].minor.yy107.mask = 0x00ff00; }
+#line 2419 "parse.c"
+        break;
+      case 46: /* refact ::= SET NULL */
+#line 314 "parse.y"
+{ yymsp[-1].minor.yy52 = OE_SetNull;  /* EV: R-33326-45252 */}
+#line 2424 "parse.c"
+        break;
+      case 47: /* refact ::= SET DEFAULT */
+#line 315 "parse.y"
+{ yymsp[-1].minor.yy52 = OE_SetDflt;  /* EV: R-33326-45252 */}
+#line 2429 "parse.c"
+        break;
+      case 48: /* refact ::= CASCADE */
+#line 316 "parse.y"
+{ yymsp[0].minor.yy52 = OE_Cascade;  /* EV: R-33326-45252 */}
+#line 2434 "parse.c"
+        break;
+      case 49: /* refact ::= RESTRICT */
+#line 317 "parse.y"
+{ yymsp[0].minor.yy52 = OE_Restrict; /* EV: R-33326-45252 */}
+#line 2439 "parse.c"
+        break;
+      case 50: /* refact ::= NO ACTION */
+#line 318 "parse.y"
+{ yymsp[-1].minor.yy52 = ON_CONFLICT_ACTION_NONE;     /* EV: R-33326-45252 */}
+#line 2444 "parse.c"
+        break;
+      case 51: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
+#line 320 "parse.y"
+{yymsp[-2].minor.yy52 = 0;}
+#line 2449 "parse.c"
+        break;
+      case 52: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
+      case 67: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==67);
+      case 138: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==138);
+#line 321 "parse.y"
+{yymsp[-1].minor.yy52 = yymsp[0].minor.yy52;}
+#line 2456 "parse.c"
+        break;
+      case 54: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
+      case 71: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==71);
+      case 180: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==180);
+      case 183: /* in_op ::= NOT IN */ yytestcase(yyruleno==183);
+      case 209: /* collate ::= COLLATE ID|INDEXED */ yytestcase(yyruleno==209);
+#line 324 "parse.y"
+{yymsp[-1].minor.yy52 = 1;}
+#line 2465 "parse.c"
+        break;
+      case 55: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
+#line 325 "parse.y"
+{yymsp[-1].minor.yy52 = 0;}
+#line 2470 "parse.c"
+        break;
+      case 57: /* tconscomma ::= COMMA */
+#line 331 "parse.y"
+{pParse->constraintName.n = 0;}
+#line 2475 "parse.c"
+        break;
+      case 59: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
+#line 335 "parse.y"
+{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy382,yymsp[0].minor.yy52,yymsp[-2].minor.yy52,0);}
+#line 2480 "parse.c"
+        break;
+      case 60: /* tcons ::= UNIQUE LP sortlist RP onconf */
+#line 337 "parse.y"
+{sqlite3CreateIndex(pParse,0,0,yymsp[-2].minor.yy382,yymsp[0].minor.yy52,0,0,0,0,
+                                       SQLITE_IDXTYPE_UNIQUE);}
+#line 2486 "parse.c"
+        break;
+      case 61: /* tcons ::= CHECK LP expr RP onconf */
+#line 340 "parse.y"
+{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy162.pExpr);}
+#line 2491 "parse.c"
+        break;
+      case 62: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
+#line 342 "parse.y"
+{
+    sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy382, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy382, yymsp[-1].minor.yy52);
+    sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy52);
+}
+#line 2499 "parse.c"
+        break;
+      case 64: /* onconf ::= */
+      case 66: /* orconf ::= */ yytestcase(yyruleno==66);
+#line 356 "parse.y"
+{yymsp[1].minor.yy52 = ON_CONFLICT_ACTION_DEFAULT;}
+#line 2505 "parse.c"
+        break;
+      case 65: /* onconf ::= ON CONFLICT resolvetype */
+#line 357 "parse.y"
+{yymsp[-2].minor.yy52 = yymsp[0].minor.yy52;}
+#line 2510 "parse.c"
+        break;
+      case 68: /* resolvetype ::= IGNORE */
+#line 361 "parse.y"
+{yymsp[0].minor.yy52 = ON_CONFLICT_ACTION_IGNORE;}
+#line 2515 "parse.c"
+        break;
+      case 69: /* resolvetype ::= REPLACE */
+      case 139: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==139);
+#line 362 "parse.y"
+{yymsp[0].minor.yy52 = ON_CONFLICT_ACTION_REPLACE;}
+#line 2521 "parse.c"
+        break;
+      case 70: /* cmd ::= DROP TABLE ifexists fullname */
+#line 366 "parse.y"
+{
+  sql_drop_table(pParse, yymsp[0].minor.yy387, 0, yymsp[-1].minor.yy52);
+}
+#line 2528 "parse.c"
+        break;
+      case 73: /* cmd ::= createkw VIEW ifnotexists nm eidlist_opt AS select */
+#line 377 "parse.y"
+{
+  sqlite3CreateView(pParse, &yymsp[-6].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy382, yymsp[0].minor.yy279, yymsp[-4].minor.yy52);
+}
+#line 2535 "parse.c"
+        break;
+      case 74: /* cmd ::= DROP VIEW ifexists fullname */
+#line 380 "parse.y"
+{
+  sql_drop_table(pParse, yymsp[0].minor.yy387, 1, yymsp[-1].minor.yy52);
+}
+#line 2542 "parse.c"
+        break;
+      case 75: /* cmd ::= select */
+#line 387 "parse.y"
+{
+  SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
+  if(!pParse->parse_only)
+	  sqlite3Select(pParse, yymsp[0].minor.yy279, &dest);
+  else
+	  sql_expr_extract_select(pParse, yymsp[0].minor.yy279);
+  sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy279);
+}
+#line 2554 "parse.c"
+        break;
+      case 76: /* select ::= with selectnowith */
+#line 427 "parse.y"
+{
+  Select *p = yymsp[0].minor.yy279;
+  if( p ){
+    p->pWith = yymsp[-1].minor.yy151;
+    parserDoubleLinkSelect(pParse, p);
+  }else{
+    sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy151);
+  }
+  yymsp[-1].minor.yy279 = p; /*A-overwrites-W*/
+}
+#line 2568 "parse.c"
+        break;
+      case 77: /* selectnowith ::= selectnowith multiselect_op oneselect */
+#line 440 "parse.y"
+{
+  Select *pRhs = yymsp[0].minor.yy279;
+  Select *pLhs = yymsp[-2].minor.yy279;
+  if( pRhs && pRhs->pPrior ){
+    SrcList *pFrom;
+    Token x;
+    x.n = 0;
+    parserDoubleLinkSelect(pParse, pRhs);
+    pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,&x,pRhs,0,0);
+    pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0);
+  }
+  if( pRhs ){
+    pRhs->op = (u8)yymsp[-1].minor.yy52;
+    pRhs->pPrior = pLhs;
+    if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
+    pRhs->selFlags &= ~SF_MultiValue;
+    if( yymsp[-1].minor.yy52!=TK_ALL ) pParse->hasCompound = 1;
+  }else{
+    sqlite3SelectDelete(pParse->db, pLhs);
+  }
+  yymsp[-2].minor.yy279 = pRhs;
+}
+#line 2594 "parse.c"
+        break;
+      case 78: /* multiselect_op ::= UNION */
+      case 80: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==80);
+#line 463 "parse.y"
+{yymsp[0].minor.yy52 = yymsp[0].major; /*A-overwrites-OP*/}
+#line 2600 "parse.c"
+        break;
+      case 79: /* multiselect_op ::= UNION ALL */
+#line 464 "parse.y"
+{yymsp[-1].minor.yy52 = TK_ALL;}
+#line 2605 "parse.c"
+        break;
+      case 81: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+#line 468 "parse.y"
+{
+#ifdef SELECTTRACE_ENABLED
+  Token s = yymsp[-8].minor.yy0; /*A-overwrites-S*/
+#endif
+  yymsp[-8].minor.yy279 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy382,yymsp[-5].minor.yy387,yymsp[-4].minor.yy362,yymsp[-3].minor.yy382,yymsp[-2].minor.yy362,yymsp[-1].minor.yy382,yymsp[-7].minor.yy52,yymsp[0].minor.yy384.pLimit,yymsp[0].minor.yy384.pOffset);
+#ifdef SELECTTRACE_ENABLED
+  /* Populate the Select.zSelName[] string that is used to help with
+  ** query planner debugging, to differentiate between multiple Select
+  ** objects in a complex query.
+  **
+  ** If the SELECT keyword is immediately followed by a C-style comment
+  ** then extract the first few alphanumeric characters from within that
+  ** comment to be the zSelName value.  Otherwise, the label is #N where
+  ** is an integer that is incremented with each SELECT statement seen.
+  */
+  if( yymsp[-8].minor.yy279!=0 ){
+    const char *z = s.z+6;
+    int i;
+    sqlite3_snprintf(sizeof(yymsp[-8].minor.yy279->zSelName), yymsp[-8].minor.yy279->zSelName, "#%d",
+                     ++pParse->nSelect);
+    while( z[0]==' ' ) z++;
+    if( z[0]=='/' && z[1]=='*' ){
+      z += 2;
+      while( z[0]==' ' ) z++;
+      for(i=0; sqlite3Isalnum(z[i]); i++){}
+      sqlite3_snprintf(sizeof(yymsp[-8].minor.yy279->zSelName), yymsp[-8].minor.yy279->zSelName, "%.*s", i, z);
+    }
+  }
+#endif /* SELECTRACE_ENABLED */
+}
+#line 2639 "parse.c"
+        break;
+      case 82: /* values ::= VALUES LP nexprlist RP */
+#line 502 "parse.y"
+{
+  yymsp[-3].minor.yy279 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy382,0,0,0,0,0,SF_Values,0,0);
+}
+#line 2646 "parse.c"
+        break;
+      case 83: /* values ::= values COMMA LP exprlist RP */
+#line 505 "parse.y"
+{
+  Select *pRight, *pLeft = yymsp[-4].minor.yy279;
+  pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy382,0,0,0,0,0,SF_Values|SF_MultiValue,0,0);
+  if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
+  if( pRight ){
+    pRight->op = TK_ALL;
+    pRight->pPrior = pLeft;
+    yymsp[-4].minor.yy279 = pRight;
+  }else{
+    yymsp[-4].minor.yy279 = pLeft;
+  }
+}
+#line 2662 "parse.c"
+        break;
+      case 84: /* distinct ::= DISTINCT */
+#line 522 "parse.y"
+{yymsp[0].minor.yy52 = SF_Distinct;}
+#line 2667 "parse.c"
+        break;
+      case 85: /* distinct ::= ALL */
+#line 523 "parse.y"
+{yymsp[0].minor.yy52 = SF_All;}
+#line 2672 "parse.c"
+        break;
+      case 87: /* sclp ::= */
+      case 113: /* orderby_opt ::= */ yytestcase(yyruleno==113);
+      case 120: /* groupby_opt ::= */ yytestcase(yyruleno==120);
+      case 196: /* exprlist ::= */ yytestcase(yyruleno==196);
+      case 199: /* paren_exprlist ::= */ yytestcase(yyruleno==199);
+      case 204: /* eidlist_opt ::= */ yytestcase(yyruleno==204);
+#line 536 "parse.y"
+{yymsp[1].minor.yy382 = 0;}
+#line 2682 "parse.c"
+        break;
+      case 88: /* selcollist ::= sclp expr as */
+#line 537 "parse.y"
+{
+   yymsp[-2].minor.yy382 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy382, yymsp[-1].minor.yy162.pExpr);
+   if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-2].minor.yy382, &yymsp[0].minor.yy0, 1);
+   sqlite3ExprListSetSpan(pParse,yymsp[-2].minor.yy382,&yymsp[-1].minor.yy162);
+}
+#line 2691 "parse.c"
+        break;
+      case 89: /* selcollist ::= sclp STAR */
+#line 542 "parse.y"
+{
+  Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
+  yymsp[-1].minor.yy382 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy382, p);
+}
+#line 2699 "parse.c"
+        break;
+      case 90: /* selcollist ::= sclp nm DOT STAR */
+#line 546 "parse.y"
+{
+  Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
+  Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
+  Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
+  yymsp[-3].minor.yy382 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy382, pDot);
+}
+#line 2709 "parse.c"
+        break;
+      case 91: /* as ::= AS nm */
+      case 218: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==218);
+      case 219: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==219);
+#line 557 "parse.y"
+{yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;}
+#line 2716 "parse.c"
+        break;
+      case 93: /* from ::= */
+#line 571 "parse.y"
+{yymsp[1].minor.yy387 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy387));}
+#line 2721 "parse.c"
+        break;
+      case 94: /* from ::= FROM seltablist */
+#line 572 "parse.y"
+{
+  yymsp[-1].minor.yy387 = yymsp[0].minor.yy387;
+  sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy387);
+}
+#line 2729 "parse.c"
+        break;
+      case 95: /* stl_prefix ::= seltablist joinop */
+#line 580 "parse.y"
+{
+   if( ALWAYS(yymsp[-1].minor.yy387 && yymsp[-1].minor.yy387->nSrc>0) ) yymsp[-1].minor.yy387->a[yymsp[-1].minor.yy387->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy52;
+}
+#line 2736 "parse.c"
+        break;
+      case 96: /* stl_prefix ::= */
+#line 583 "parse.y"
+{yymsp[1].minor.yy387 = 0;}
+#line 2741 "parse.c"
+        break;
+      case 97: /* seltablist ::= stl_prefix nm as indexed_opt on_opt using_opt */
+#line 585 "parse.y"
+{
+  yymsp[-5].minor.yy387 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy387,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy362,yymsp[0].minor.yy40);
+  sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy387, &yymsp[-2].minor.yy0);
+}
+#line 2749 "parse.c"
+        break;
+      case 98: /* seltablist ::= stl_prefix nm LP exprlist RP as on_opt using_opt */
+#line 590 "parse.y"
+{
+  yymsp[-7].minor.yy387 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-7].minor.yy387,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy362,yymsp[0].minor.yy40);
+  sqlite3SrcListFuncArgs(pParse, yymsp[-7].minor.yy387, yymsp[-4].minor.yy382);
+}
+#line 2757 "parse.c"
+        break;
+      case 99: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
+#line 595 "parse.y"
+{
+  yymsp[-6].minor.yy387 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy387,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy279,yymsp[-1].minor.yy362,yymsp[0].minor.yy40);
+}
+#line 2764 "parse.c"
+        break;
+      case 100: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
+#line 599 "parse.y"
+{
+  if( yymsp[-6].minor.yy387==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy362==0 && yymsp[0].minor.yy40==0 ){
+    yymsp[-6].minor.yy387 = yymsp[-4].minor.yy387;
+  }else if( yymsp[-4].minor.yy387->nSrc==1 ){
+    yymsp[-6].minor.yy387 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy387,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy362,yymsp[0].minor.yy40);
+    if( yymsp[-6].minor.yy387 ){
+      struct SrcList_item *pNew = &yymsp[-6].minor.yy387->a[yymsp[-6].minor.yy387->nSrc-1];
+      struct SrcList_item *pOld = yymsp[-4].minor.yy387->a;
+      pNew->zName = pOld->zName;
+      pNew->pSelect = pOld->pSelect;
+      pOld->zName =  0;
+      pOld->pSelect = 0;
+    }
+    sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy387);
+  }else{
+    Select *pSubquery;
+    sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy387);
+    pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy387,0,0,0,0,SF_NestedFrom,0,0);
+    yymsp[-6].minor.yy387 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy387,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy362,yymsp[0].minor.yy40);
+  }
+}
+#line 2789 "parse.c"
+        break;
+      case 101: /* fullname ::= nm */
+#line 624 "parse.y"
+{yymsp[0].minor.yy387 = sqlite3SrcListAppend(pParse->db,0,&yymsp[0].minor.yy0); /*A-overwrites-X*/}
+#line 2794 "parse.c"
+        break;
+      case 102: /* joinop ::= COMMA|JOIN */
+#line 630 "parse.y"
+{ yymsp[0].minor.yy52 = JT_INNER; }
+#line 2799 "parse.c"
+        break;
+      case 103: /* joinop ::= JOIN_KW JOIN */
+#line 632 "parse.y"
+{yymsp[-1].minor.yy52 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0);  /*X-overwrites-A*/}
+#line 2804 "parse.c"
+        break;
+      case 104: /* joinop ::= JOIN_KW join_nm JOIN */
+#line 634 "parse.y"
+{yymsp[-2].minor.yy52 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/}
+#line 2809 "parse.c"
+        break;
+      case 105: /* joinop ::= JOIN_KW join_nm join_nm JOIN */
+#line 636 "parse.y"
+{yymsp[-3].minor.yy52 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/}
+#line 2814 "parse.c"
+        break;
+      case 106: /* on_opt ::= ON expr */
+      case 123: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==123);
+      case 130: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==130);
+      case 192: /* case_else ::= ELSE expr */ yytestcase(yyruleno==192);
+#line 640 "parse.y"
+{yymsp[-1].minor.yy362 = yymsp[0].minor.yy162.pExpr;}
+#line 2822 "parse.c"
+        break;
+      case 107: /* on_opt ::= */
+      case 122: /* having_opt ::= */ yytestcase(yyruleno==122);
+      case 129: /* where_opt ::= */ yytestcase(yyruleno==129);
+      case 193: /* case_else ::= */ yytestcase(yyruleno==193);
+      case 195: /* case_operand ::= */ yytestcase(yyruleno==195);
+#line 641 "parse.y"
+{yymsp[1].minor.yy362 = 0;}
+#line 2831 "parse.c"
+        break;
+      case 108: /* indexed_opt ::= */
+#line 654 "parse.y"
+{yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;}
+#line 2836 "parse.c"
+        break;
+      case 109: /* indexed_opt ::= INDEXED BY nm */
+#line 655 "parse.y"
+{yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;}
+#line 2841 "parse.c"
+        break;
+      case 110: /* indexed_opt ::= NOT INDEXED */
+#line 656 "parse.y"
+{yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;}
+#line 2846 "parse.c"
+        break;
+      case 111: /* using_opt ::= USING LP idlist RP */
+#line 660 "parse.y"
+{yymsp[-3].minor.yy40 = yymsp[-1].minor.yy40;}
+#line 2851 "parse.c"
+        break;
+      case 112: /* using_opt ::= */
+      case 140: /* idlist_opt ::= */ yytestcase(yyruleno==140);
+#line 661 "parse.y"
+{yymsp[1].minor.yy40 = 0;}
+#line 2857 "parse.c"
+        break;
+      case 114: /* orderby_opt ::= ORDER BY sortlist */
+      case 121: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==121);
+#line 675 "parse.y"
+{yymsp[-2].minor.yy382 = yymsp[0].minor.yy382;}
+#line 2863 "parse.c"
+        break;
+      case 115: /* sortlist ::= sortlist COMMA expr sortorder */
+#line 676 "parse.y"
+{
+  yymsp[-3].minor.yy382 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy382,yymsp[-1].minor.yy162.pExpr);
+  sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy382,yymsp[0].minor.yy52);
+}
+#line 2871 "parse.c"
+        break;
+      case 116: /* sortlist ::= expr sortorder */
+#line 680 "parse.y"
+{
+  yymsp[-1].minor.yy382 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy162.pExpr); /*A-overwrites-Y*/
+  sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy382,yymsp[0].minor.yy52);
+}
+#line 2879 "parse.c"
+        break;
+      case 117: /* sortorder ::= ASC */
+#line 687 "parse.y"
+{yymsp[0].minor.yy52 = SQLITE_SO_ASC;}
+#line 2884 "parse.c"
+        break;
+      case 118: /* sortorder ::= DESC */
+#line 688 "parse.y"
+{yymsp[0].minor.yy52 = SQLITE_SO_DESC;}
+#line 2889 "parse.c"
+        break;
+      case 119: /* sortorder ::= */
+#line 689 "parse.y"
+{yymsp[1].minor.yy52 = SQLITE_SO_UNDEFINED;}
+#line 2894 "parse.c"
+        break;
+      case 124: /* limit_opt ::= */
+#line 714 "parse.y"
+{yymsp[1].minor.yy384.pLimit = 0; yymsp[1].minor.yy384.pOffset = 0;}
+#line 2899 "parse.c"
+        break;
+      case 125: /* limit_opt ::= LIMIT expr */
+#line 715 "parse.y"
+{yymsp[-1].minor.yy384.pLimit = yymsp[0].minor.yy162.pExpr; yymsp[-1].minor.yy384.pOffset = 0;}
+#line 2904 "parse.c"
+        break;
+      case 126: /* limit_opt ::= LIMIT expr OFFSET expr */
+#line 717 "parse.y"
+{yymsp[-3].minor.yy384.pLimit = yymsp[-2].minor.yy162.pExpr; yymsp[-3].minor.yy384.pOffset = yymsp[0].minor.yy162.pExpr;}
+#line 2909 "parse.c"
+        break;
+      case 127: /* limit_opt ::= LIMIT expr COMMA expr */
+#line 719 "parse.y"
+{yymsp[-3].minor.yy384.pOffset = yymsp[-2].minor.yy162.pExpr; yymsp[-3].minor.yy384.pLimit = yymsp[0].minor.yy162.pExpr;}
+#line 2914 "parse.c"
+        break;
+      case 128: /* cmd ::= with DELETE FROM fullname indexed_opt where_opt */
+#line 736 "parse.y"
+{
+  sqlite3WithPush(pParse, yymsp[-5].minor.yy151, 1);
+  sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy387, &yymsp[-1].minor.yy0);
+  sqlSubProgramsRemaining = SQL_MAX_COMPILING_TRIGGERS;
+  /* Instruct SQL to initate Tarantool's transaction.  */
+  pParse->initiateTTrans = true;
+  sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy387,yymsp[0].minor.yy362);
+}
+#line 2926 "parse.c"
+        break;
+      case 131: /* cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */
+#line 769 "parse.y"
+{
+  sqlite3WithPush(pParse, yymsp[-7].minor.yy151, 1);
+  sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy387, &yymsp[-3].minor.yy0);
+  sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy382,"set list"); 
+  sqlSubProgramsRemaining = SQL_MAX_COMPILING_TRIGGERS;
+  /* Instruct SQL to initate Tarantool's transaction.  */
+  pParse->initiateTTrans = true;
+  sqlite3Update(pParse,yymsp[-4].minor.yy387,yymsp[-1].minor.yy382,yymsp[0].minor.yy362,yymsp[-5].minor.yy52);
+}
+#line 2939 "parse.c"
+        break;
+      case 132: /* setlist ::= setlist COMMA nm EQ expr */
+#line 783 "parse.y"
+{
+  yymsp[-4].minor.yy382 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy382, yymsp[0].minor.yy162.pExpr);
+  sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy382, &yymsp[-2].minor.yy0, 1);
+}
+#line 2947 "parse.c"
+        break;
+      case 133: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
+#line 787 "parse.y"
+{
+  yymsp[-6].minor.yy382 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy382, yymsp[-3].minor.yy40, yymsp[0].minor.yy162.pExpr);
+}
+#line 2954 "parse.c"
+        break;
+      case 134: /* setlist ::= nm EQ expr */
+#line 790 "parse.y"
+{
+  yylhsminor.yy382 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy162.pExpr);
+  sqlite3ExprListSetName(pParse, yylhsminor.yy382, &yymsp[-2].minor.yy0, 1);
+}
+#line 2962 "parse.c"
+  yymsp[-2].minor.yy382 = yylhsminor.yy382;
+        break;
+      case 135: /* setlist ::= LP idlist RP EQ expr */
+#line 794 "parse.y"
+{
+  yymsp[-4].minor.yy382 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy40, yymsp[0].minor.yy162.pExpr);
+}
+#line 2970 "parse.c"
+        break;
+      case 136: /* cmd ::= with insert_cmd INTO fullname idlist_opt select */
+#line 800 "parse.y"
+{
+  sqlite3WithPush(pParse, yymsp[-5].minor.yy151, 1);
+  sqlSubProgramsRemaining = SQL_MAX_COMPILING_TRIGGERS;
+  /* Instruct SQL to initate Tarantool's transaction.  */
+  pParse->initiateTTrans = true;
+  sqlite3Insert(pParse, yymsp[-2].minor.yy387, yymsp[0].minor.yy279, yymsp[-1].minor.yy40, yymsp[-4].minor.yy52);
+}
+#line 2981 "parse.c"
+        break;
+      case 137: /* cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES */
+#line 808 "parse.y"
+{
+  sqlite3WithPush(pParse, yymsp[-6].minor.yy151, 1);
+  sqlSubProgramsRemaining = SQL_MAX_COMPILING_TRIGGERS;
+  /* Instruct SQL to initate Tarantool's transaction.  */
+  pParse->initiateTTrans = true;
+  sqlite3Insert(pParse, yymsp[-3].minor.yy387, 0, yymsp[-2].minor.yy40, yymsp[-5].minor.yy52);
+}
+#line 2992 "parse.c"
+        break;
+      case 141: /* idlist_opt ::= LP idlist RP */
+#line 826 "parse.y"
+{yymsp[-2].minor.yy40 = yymsp[-1].minor.yy40;}
+#line 2997 "parse.c"
+        break;
+      case 142: /* idlist ::= idlist COMMA nm */
+#line 828 "parse.y"
+{yymsp[-2].minor.yy40 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy40,&yymsp[0].minor.yy0);}
+#line 3002 "parse.c"
+        break;
+      case 143: /* idlist ::= nm */
+#line 830 "parse.y"
+{yymsp[0].minor.yy40 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/}
+#line 3007 "parse.c"
+        break;
+      case 144: /* expr ::= LP expr RP */
+#line 879 "parse.y"
+{spanSet(&yymsp[-2].minor.yy162,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/  yymsp[-2].minor.yy162.pExpr = yymsp[-1].minor.yy162.pExpr;}
+#line 3012 "parse.c"
+        break;
+      case 145: /* term ::= NULL */
+      case 149: /* term ::= FLOAT|BLOB */ yytestcase(yyruleno==149);
+      case 150: /* term ::= STRING */ yytestcase(yyruleno==150);
+#line 880 "parse.y"
+{spanExpr(&yymsp[0].minor.yy162,pParse,yymsp[0].major,yymsp[0].minor.yy0);/*A-overwrites-X*/}
+#line 3019 "parse.c"
+        break;
+      case 146: /* expr ::= ID|INDEXED */
+      case 147: /* expr ::= JOIN_KW */ yytestcase(yyruleno==147);
+#line 881 "parse.y"
+{spanExpr(&yymsp[0].minor.yy162,pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/}
+#line 3025 "parse.c"
+        break;
+      case 148: /* expr ::= nm DOT nm */
+#line 883 "parse.y"
+{
+  Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
+  Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1);
+  spanSet(&yymsp[-2].minor.yy162,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
+  yymsp[-2].minor.yy162.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
+}
+#line 3035 "parse.c"
+        break;
+      case 151: /* term ::= INTEGER */
+#line 891 "parse.y"
+{
+  yylhsminor.yy162.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1);
+  yylhsminor.yy162.zStart = yymsp[0].minor.yy0.z;
+  yylhsminor.yy162.zEnd = yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n;
+  if( yylhsminor.yy162.pExpr ) yylhsminor.yy162.pExpr->flags |= EP_Leaf;
+}
+#line 3045 "parse.c"
+  yymsp[0].minor.yy162 = yylhsminor.yy162;
+        break;
+      case 152: /* expr ::= VARIABLE */
+#line 897 "parse.y"
+{
+  if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){
+    u32 n = yymsp[0].minor.yy0.n;
+    spanExpr(&yymsp[0].minor.yy162, pParse, TK_VARIABLE, yymsp[0].minor.yy0);
+    sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy162.pExpr, n);
+  }else{
+    /* When doing a nested parse, one can include terms in an expression
+    ** that look like this:   #1 #2 ...  These terms refer to registers
+    ** in the virtual machine.  #N is the N-th register. */
+    Token t = yymsp[0].minor.yy0; /*A-overwrites-X*/
+    assert( t.n>=2 );
+    spanSet(&yymsp[0].minor.yy162, &t, &t);
+    if( pParse->nested==0 ){
+      sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
+      yymsp[0].minor.yy162.pExpr = 0;
+    }else{
+      yymsp[0].minor.yy162.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
+      if( yymsp[0].minor.yy162.pExpr ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy162.pExpr->iTable);
+    }
+  }
+}
+#line 3071 "parse.c"
+        break;
+      case 153: /* expr ::= expr COLLATE ID|INDEXED */
+#line 918 "parse.y"
+{
+  yymsp[-2].minor.yy162.pExpr = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy162.pExpr, &yymsp[0].minor.yy0, 1);
+  yymsp[-2].minor.yy162.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
+}
+#line 3079 "parse.c"
+        break;
+      case 154: /* expr ::= CAST LP expr AS typetoken RP */
+#line 923 "parse.y"
+{
+  spanSet(&yymsp[-5].minor.yy162,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
+  yymsp[-5].minor.yy162.pExpr = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1);
+  sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy162.pExpr, yymsp[-3].minor.yy162.pExpr, 0);
+}
+#line 3088 "parse.c"
+        break;
+      case 155: /* expr ::= ID|INDEXED LP distinct exprlist RP */
+#line 929 "parse.y"
+{
+  if( yymsp[-1].minor.yy382 && yymsp[-1].minor.yy382->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
+    sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0);
+  }
+  yylhsminor.yy162.pExpr = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy382, &yymsp[-4].minor.yy0);
+  spanSet(&yylhsminor.yy162,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0);
+  if( yymsp[-2].minor.yy52==SF_Distinct && yylhsminor.yy162.pExpr ){
+    yylhsminor.yy162.pExpr->flags |= EP_Distinct;
+  }
+}
+#line 3102 "parse.c"
+  yymsp[-4].minor.yy162 = yylhsminor.yy162;
+        break;
+      case 156: /* expr ::= ID|INDEXED LP STAR RP */
+#line 939 "parse.y"
+{
+  yylhsminor.yy162.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0);
+  spanSet(&yylhsminor.yy162,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0);
+}
+#line 3111 "parse.c"
+  yymsp[-3].minor.yy162 = yylhsminor.yy162;
+        break;
+      case 157: /* term ::= CTIME_KW */
+#line 943 "parse.y"
+{
+  yylhsminor.yy162.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0);
+  spanSet(&yylhsminor.yy162, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0);
+}
+#line 3120 "parse.c"
+  yymsp[0].minor.yy162 = yylhsminor.yy162;
+        break;
+      case 158: /* expr ::= LP nexprlist COMMA expr RP */
+#line 972 "parse.y"
+{
+  ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy382, yymsp[-1].minor.yy162.pExpr);
+  yylhsminor.yy162.pExpr = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
+  if( yylhsminor.yy162.pExpr ){
+    yylhsminor.yy162.pExpr->x.pList = pList;
+    spanSet(&yylhsminor.yy162, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0);
+  }else{
+    sqlite3ExprListDelete(pParse->db, pList);
+  }
+}
+#line 3135 "parse.c"
+  yymsp[-4].minor.yy162 = yylhsminor.yy162;
+        break;
+      case 159: /* expr ::= expr AND expr */
+      case 160: /* expr ::= expr OR expr */ yytestcase(yyruleno==160);
+      case 161: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==161);
+      case 162: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==162);
+      case 163: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==163);
+      case 164: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==164);
+      case 165: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==165);
+      case 166: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==166);
+#line 983 "parse.y"
+{spanBinaryExpr(pParse,yymsp[-1].major,&yymsp[-2].minor.yy162,&yymsp[0].minor.yy162);}
+#line 3148 "parse.c"
+        break;
+      case 167: /* likeop ::= LIKE_KW|MATCH */
+#line 996 "parse.y"
+{yymsp[0].minor.yy0=yymsp[0].minor.yy0;/*A-overwrites-X*/}
+#line 3153 "parse.c"
+        break;
+      case 168: /* likeop ::= NOT LIKE_KW|MATCH */
+#line 997 "parse.y"
+{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/}
+#line 3158 "parse.c"
+        break;
+      case 169: /* expr ::= expr likeop expr */
+#line 998 "parse.y"
+{
+  ExprList *pList;
+  int bNot = yymsp[-1].minor.yy0.n & 0x80000000;
+  yymsp[-1].minor.yy0.n &= 0x7fffffff;
+  pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy162.pExpr);
+  pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy162.pExpr);
+  yymsp[-2].minor.yy162.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0);
+  exprNot(pParse, bNot, &yymsp[-2].minor.yy162);
+  yymsp[-2].minor.yy162.zEnd = yymsp[0].minor.yy162.zEnd;
+  if( yymsp[-2].minor.yy162.pExpr ) yymsp[-2].minor.yy162.pExpr->flags |= EP_InfixFunc;
+}
+#line 3173 "parse.c"
+        break;
+      case 170: /* expr ::= expr likeop expr ESCAPE expr */
+#line 1009 "parse.y"
+{
+  ExprList *pList;
+  int bNot = yymsp[-3].minor.yy0.n & 0x80000000;
+  yymsp[-3].minor.yy0.n &= 0x7fffffff;
+  pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy162.pExpr);
+  pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy162.pExpr);
+  pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy162.pExpr);
+  yymsp[-4].minor.yy162.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0);
+  exprNot(pParse, bNot, &yymsp[-4].minor.yy162);
+  yymsp[-4].minor.yy162.zEnd = yymsp[0].minor.yy162.zEnd;
+  if( yymsp[-4].minor.yy162.pExpr ) yymsp[-4].minor.yy162.pExpr->flags |= EP_InfixFunc;
+}
+#line 3189 "parse.c"
+        break;
+      case 171: /* expr ::= expr ISNULL|NOTNULL */
+#line 1036 "parse.y"
+{spanUnaryPostfix(pParse,yymsp[0].major,&yymsp[-1].minor.yy162,&yymsp[0].minor.yy0);}
+#line 3194 "parse.c"
+        break;
+      case 172: /* expr ::= expr NOT NULL */
+#line 1037 "parse.y"
+{spanUnaryPostfix(pParse,TK_NOTNULL,&yymsp[-2].minor.yy162,&yymsp[0].minor.yy0);}
+#line 3199 "parse.c"
+        break;
+      case 173: /* expr ::= expr IS expr */
+#line 1058 "parse.y"
+{
+  spanBinaryExpr(pParse,TK_IS,&yymsp[-2].minor.yy162,&yymsp[0].minor.yy162);
+  binaryToUnaryIfNull(pParse, yymsp[0].minor.yy162.pExpr, yymsp[-2].minor.yy162.pExpr, TK_ISNULL);
+}
+#line 3207 "parse.c"
+        break;
+      case 174: /* expr ::= expr IS NOT expr */
+#line 1062 "parse.y"
+{
+  spanBinaryExpr(pParse,TK_ISNOT,&yymsp[-3].minor.yy162,&yymsp[0].minor.yy162);
+  binaryToUnaryIfNull(pParse, yymsp[0].minor.yy162.pExpr, yymsp[-3].minor.yy162.pExpr, TK_NOTNULL);
+}
+#line 3215 "parse.c"
+        break;
+      case 175: /* expr ::= NOT expr */
+      case 176: /* expr ::= BITNOT expr */ yytestcase(yyruleno==176);
+#line 1086 "parse.y"
+{spanUnaryPrefix(&yymsp[-1].minor.yy162,pParse,yymsp[-1].major,&yymsp[0].minor.yy162,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
+#line 3221 "parse.c"
+        break;
+      case 177: /* expr ::= MINUS expr */
+#line 1090 "parse.y"
+{spanUnaryPrefix(&yymsp[-1].minor.yy162,pParse,TK_UMINUS,&yymsp[0].minor.yy162,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
+#line 3226 "parse.c"
+        break;
+      case 178: /* expr ::= PLUS expr */
+#line 1092 "parse.y"
+{spanUnaryPrefix(&yymsp[-1].minor.yy162,pParse,TK_UPLUS,&yymsp[0].minor.yy162,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
+#line 3231 "parse.c"
+        break;
+      case 179: /* between_op ::= BETWEEN */
+      case 182: /* in_op ::= IN */ yytestcase(yyruleno==182);
+#line 1095 "parse.y"
+{yymsp[0].minor.yy52 = 0;}
+#line 3237 "parse.c"
+        break;
+      case 181: /* expr ::= expr between_op expr AND expr */
+#line 1097 "parse.y"
+{
+  ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy162.pExpr);
+  pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy162.pExpr);
+  yymsp[-4].minor.yy162.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy162.pExpr, 0);
+  if( yymsp[-4].minor.yy162.pExpr ){
+    yymsp[-4].minor.yy162.pExpr->x.pList = pList;
+  }else{
+    sqlite3ExprListDelete(pParse->db, pList);
+  } 
+  exprNot(pParse, yymsp[-3].minor.yy52, &yymsp[-4].minor.yy162);
+  yymsp[-4].minor.yy162.zEnd = yymsp[0].minor.yy162.zEnd;
+}
+#line 3253 "parse.c"
+        break;
+      case 184: /* expr ::= expr in_op LP exprlist RP */
+#line 1112 "parse.y"
+{
+  if( yymsp[-1].minor.yy382==0 ){
+    /* Expressions of the form
+    **
+    **      expr1 IN ()
+    **      expr1 NOT IN ()
+    **
+    ** simplify to constants 0 (false) and 1 (true), respectively,
+    ** regardless of the value of expr1.
+    */
+    sql_expr_free(pParse->db, yymsp[-4].minor.yy162.pExpr, false);
+    yymsp[-4].minor.yy162.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[yymsp[-3].minor.yy52],1);
+  }else if( yymsp[-1].minor.yy382->nExpr==1 ){
+    /* Expressions of the form:
+    **
+    **      expr1 IN (?1)
+    **      expr1 NOT IN (?2)
+    **
+    ** with exactly one value on the RHS can be simplified to something
+    ** like this:
+    **
+    **      expr1 == ?1
+    **      expr1 <> ?2
+    **
+    ** But, the RHS of the == or <> is marked with the EP_Generic flag
+    ** so that it may not contribute to the computation of comparison
+    ** affinity or the collating sequence to use for comparison.  Otherwise,
+    ** the semantics would be subtly different from IN or NOT IN.
+    */
+    Expr *pRHS = yymsp[-1].minor.yy382->a[0].pExpr;
+    yymsp[-1].minor.yy382->a[0].pExpr = 0;
+    sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy382);
+    /* pRHS cannot be NULL because a malloc error would have been detected
+    ** before now and control would have never reached this point */
+    if( ALWAYS(pRHS) ){
+      pRHS->flags &= ~EP_Collate;
+      pRHS->flags |= EP_Generic;
+    }
+    yymsp[-4].minor.yy162.pExpr = sqlite3PExpr(pParse, yymsp[-3].minor.yy52 ? TK_NE : TK_EQ, yymsp[-4].minor.yy162.pExpr, pRHS);
+  }else{
+    yymsp[-4].minor.yy162.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy162.pExpr, 0);
+    if( yymsp[-4].minor.yy162.pExpr ){
+      yymsp[-4].minor.yy162.pExpr->x.pList = yymsp[-1].minor.yy382;
+      sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy162.pExpr);
+    }else{
+      sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy382);
+    }
+    exprNot(pParse, yymsp[-3].minor.yy52, &yymsp[-4].minor.yy162);
+  }
+  yymsp[-4].minor.yy162.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
+}
+#line 3308 "parse.c"
+        break;
+      case 185: /* expr ::= LP select RP */
+#line 1163 "parse.y"
+{
+  spanSet(&yymsp[-2].minor.yy162,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/
+  yymsp[-2].minor.yy162.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
+  sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy162.pExpr, yymsp[-1].minor.yy279);
+}
+#line 3317 "parse.c"
+        break;
+      case 186: /* expr ::= expr in_op LP select RP */
+#line 1168 "parse.y"
+{
+  yymsp[-4].minor.yy162.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy162.pExpr, 0);
+  sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy162.pExpr, yymsp[-1].minor.yy279);
+  exprNot(pParse, yymsp[-3].minor.yy52, &yymsp[-4].minor.yy162);
+  yymsp[-4].minor.yy162.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
+}
+#line 3327 "parse.c"
+        break;
+      case 187: /* expr ::= expr in_op nm paren_exprlist */
+#line 1174 "parse.y"
+{
+  SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-1].minor.yy0);
+  Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
+  if( yymsp[0].minor.yy382 )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy382);
+  yymsp[-3].minor.yy162.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-3].minor.yy162.pExpr, 0);
+  sqlite3PExprAddSelect(pParse, yymsp[-3].minor.yy162.pExpr, pSelect);
+  exprNot(pParse, yymsp[-2].minor.yy52, &yymsp[-3].minor.yy162);
+  yymsp[-3].minor.yy162.zEnd = &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n];
+}
+#line 3340 "parse.c"
+        break;
+      case 188: /* expr ::= EXISTS LP select RP */
+#line 1183 "parse.y"
+{
+  Expr *p;
+  spanSet(&yymsp[-3].minor.yy162,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/
+  p = yymsp[-3].minor.yy162.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
+  sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy279);
+}
+#line 3350 "parse.c"
+        break;
+      case 189: /* expr ::= CASE case_operand case_exprlist case_else END */
+#line 1191 "parse.y"
+{
+  spanSet(&yymsp[-4].minor.yy162,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0);  /*A-overwrites-C*/
+  yymsp[-4].minor.yy162.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy362, 0);
+  if( yymsp[-4].minor.yy162.pExpr ){
+    yymsp[-4].minor.yy162.pExpr->x.pList = yymsp[-1].minor.yy362 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy382,yymsp[-1].minor.yy362) : yymsp[-2].minor.yy382;
+    sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy162.pExpr);
+  }else{
+    sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy382);
+    sql_expr_free(pParse->db, yymsp[-1].minor.yy362, false);
+  }
+}
+#line 3365 "parse.c"
+        break;
+      case 190: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
+#line 1204 "parse.y"
+{
+  yymsp[-4].minor.yy382 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy382, yymsp[-2].minor.yy162.pExpr);
+  yymsp[-4].minor.yy382 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy382, yymsp[0].minor.yy162.pExpr);
+}
+#line 3373 "parse.c"
+        break;
+      case 191: /* case_exprlist ::= WHEN expr THEN expr */
+#line 1208 "parse.y"
+{
+  yymsp[-3].minor.yy382 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy162.pExpr);
+  yymsp[-3].minor.yy382 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy382, yymsp[0].minor.yy162.pExpr);
+}
+#line 3381 "parse.c"
+        break;
+      case 194: /* case_operand ::= expr */
+#line 1218 "parse.y"
+{yymsp[0].minor.yy362 = yymsp[0].minor.yy162.pExpr; /*A-overwrites-X*/}
+#line 3386 "parse.c"
+        break;
+      case 197: /* nexprlist ::= nexprlist COMMA expr */
+#line 1229 "parse.y"
+{yymsp[-2].minor.yy382 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy382,yymsp[0].minor.yy162.pExpr);}
+#line 3391 "parse.c"
+        break;
+      case 198: /* nexprlist ::= expr */
+#line 1231 "parse.y"
+{yymsp[0].minor.yy382 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy162.pExpr); /*A-overwrites-Y*/}
+#line 3396 "parse.c"
+        break;
+      case 200: /* paren_exprlist ::= LP exprlist RP */
+      case 205: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==205);
+#line 1238 "parse.y"
+{yymsp[-2].minor.yy382 = yymsp[-1].minor.yy382;}
+#line 3402 "parse.c"
+        break;
+      case 201: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm ON nm LP sortlist RP */
+#line 1244 "parse.y"
+{
+  sqlite3CreateIndex(pParse, &yymsp[-5].minor.yy0,
+                     sqlite3SrcListAppend(pParse->db,0,&yymsp[-3].minor.yy0), yymsp[-1].minor.yy382, yymsp[-8].minor.yy52,
+                      &yymsp[-9].minor.yy0, 0, SQLITE_SO_ASC, yymsp[-6].minor.yy52, SQLITE_IDXTYPE_APPDEF);
+}
+#line 3411 "parse.c"
+        break;
+      case 202: /* uniqueflag ::= UNIQUE */
+      case 243: /* raisetype ::= ABORT */ yytestcase(yyruleno==243);
+#line 1251 "parse.y"
+{yymsp[0].minor.yy52 = ON_CONFLICT_ACTION_ABORT;}
+#line 3417 "parse.c"
+        break;
+      case 203: /* uniqueflag ::= */
+#line 1252 "parse.y"
+{yymsp[1].minor.yy52 = ON_CONFLICT_ACTION_NONE;}
+#line 3422 "parse.c"
+        break;
+      case 206: /* eidlist ::= eidlist COMMA nm collate sortorder */
+#line 1295 "parse.y"
+{
+  yymsp[-4].minor.yy382 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy382, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy52, yymsp[0].minor.yy52);
+}
+#line 3429 "parse.c"
+        break;
+      case 207: /* eidlist ::= nm collate sortorder */
+#line 1298 "parse.y"
+{
+  yymsp[-2].minor.yy382 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy52, yymsp[0].minor.yy52); /*A-overwrites-Y*/
+}
+#line 3436 "parse.c"
+        break;
+      case 210: /* cmd ::= DROP INDEX ifexists fullname ON nm */
+#line 1309 "parse.y"
+{
+    sql_drop_index(pParse, yymsp[-2].minor.yy387, &yymsp[0].minor.yy0, yymsp[-3].minor.yy52);
+}
+#line 3443 "parse.c"
+        break;
+      case 211: /* cmd ::= PRAGMA nm */
+#line 1316 "parse.y"
+{
+    sqlite3Pragma(pParse,&yymsp[0].minor.yy0,0,0,0);
+}
+#line 3450 "parse.c"
+        break;
+      case 212: /* cmd ::= PRAGMA nm EQ nmnum */
+#line 1319 "parse.y"
+{
+    sqlite3Pragma(pParse,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0,0);
+}
+#line 3457 "parse.c"
+        break;
+      case 213: /* cmd ::= PRAGMA nm LP nmnum RP */
+#line 1322 "parse.y"
+{
+    sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0,0);
+}
+#line 3464 "parse.c"
+        break;
+      case 214: /* cmd ::= PRAGMA nm EQ minus_num */
+#line 1325 "parse.y"
+{
+    sqlite3Pragma(pParse,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0,1);
+}
+#line 3471 "parse.c"
+        break;
+      case 215: /* cmd ::= PRAGMA nm LP minus_num RP */
+#line 1328 "parse.y"
+{
+    sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0,1);
+}
+#line 3478 "parse.c"
+        break;
+      case 216: /* cmd ::= PRAGMA nm EQ nm DOT nm */
+#line 1331 "parse.y"
+{
+    sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0,0);
+}
+#line 3485 "parse.c"
+        break;
+      case 217: /* cmd ::= PRAGMA */
+#line 1334 "parse.y"
+{
+    sqlite3Pragma(pParse, 0,0,0,0);
+}
+#line 3492 "parse.c"
+        break;
+      case 220: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
+#line 1354 "parse.y"
+{
+  Token all;
+  all.z = yymsp[-3].minor.yy0.z;
+  all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n;
+  pParse->initiateTTrans = false;
+  sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy427, &all);
+}
+#line 3503 "parse.c"
+        break;
+      case 221: /* trigger_decl ::= TRIGGER ifnotexists nm trigger_time trigger_event ON fullname foreach_clause when_clause */
+#line 1364 "parse.y"
+{
+  sqlite3BeginTrigger(pParse, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy52, yymsp[-4].minor.yy10.a, yymsp[-4].minor.yy10.b, yymsp[-2].minor.yy387, yymsp[0].minor.yy362, yymsp[-7].minor.yy52);
+  yymsp[-8].minor.yy0 = yymsp[-6].minor.yy0; /*yymsp[-8].minor.yy0-overwrites-T*/
+}
+#line 3511 "parse.c"
+        break;
+      case 222: /* trigger_time ::= BEFORE */
+#line 1370 "parse.y"
+{ yymsp[0].minor.yy52 = TK_BEFORE; }
+#line 3516 "parse.c"
+        break;
+      case 223: /* trigger_time ::= AFTER */
+#line 1371 "parse.y"
+{ yymsp[0].minor.yy52 = TK_AFTER;  }
+#line 3521 "parse.c"
+        break;
+      case 224: /* trigger_time ::= INSTEAD OF */
+#line 1372 "parse.y"
+{ yymsp[-1].minor.yy52 = TK_INSTEAD;}
+#line 3526 "parse.c"
+        break;
+      case 225: /* trigger_time ::= */
+#line 1373 "parse.y"
+{ yymsp[1].minor.yy52 = TK_BEFORE; }
+#line 3531 "parse.c"
+        break;
+      case 226: /* trigger_event ::= DELETE|INSERT */
+      case 227: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==227);
+#line 1377 "parse.y"
+{yymsp[0].minor.yy10.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy10.b = 0;}
+#line 3537 "parse.c"
+        break;
+      case 228: /* trigger_event ::= UPDATE OF idlist */
+#line 1379 "parse.y"
+{yymsp[-2].minor.yy10.a = TK_UPDATE; yymsp[-2].minor.yy10.b = yymsp[0].minor.yy40;}
+#line 3542 "parse.c"
+        break;
+      case 229: /* when_clause ::= */
+#line 1386 "parse.y"
+{ yymsp[1].minor.yy362 = 0; }
+#line 3547 "parse.c"
+        break;
+      case 230: /* when_clause ::= WHEN expr */
+#line 1387 "parse.y"
+{ yymsp[-1].minor.yy362 = yymsp[0].minor.yy162.pExpr; }
+#line 3552 "parse.c"
+        break;
+      case 231: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+#line 1391 "parse.y"
+{
+  assert( yymsp[-2].minor.yy427!=0 );
+  yymsp[-2].minor.yy427->pLast->pNext = yymsp[-1].minor.yy427;
+  yymsp[-2].minor.yy427->pLast = yymsp[-1].minor.yy427;
+}
+#line 3561 "parse.c"
+        break;
+      case 232: /* trigger_cmd_list ::= trigger_cmd SEMI */
+#line 1396 "parse.y"
+{ 
+  assert( yymsp[-1].minor.yy427!=0 );
+  yymsp[-1].minor.yy427->pLast = yymsp[-1].minor.yy427;
+}
+#line 3569 "parse.c"
+        break;
+      case 233: /* trnm ::= nm DOT nm */
+#line 1407 "parse.y"
+{
+  yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;
+  sqlite3ErrorMsg(pParse, 
+        "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
+        "statements within triggers");
+}
+#line 3579 "parse.c"
+        break;
+      case 234: /* tridxby ::= INDEXED BY nm */
+#line 1419 "parse.y"
+{
+  sqlite3ErrorMsg(pParse,
+        "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
+        "within triggers");
+}
+#line 3588 "parse.c"
+        break;
+      case 235: /* tridxby ::= NOT INDEXED */
+#line 1424 "parse.y"
+{
+  sqlite3ErrorMsg(pParse,
+        "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
+        "within triggers");
+}
+#line 3597 "parse.c"
+        break;
+      case 236: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */
+#line 1437 "parse.y"
+{yymsp[-6].minor.yy427 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy382, yymsp[0].minor.yy362, yymsp[-5].minor.yy52);}
+#line 3602 "parse.c"
+        break;
+      case 237: /* trigger_cmd ::= insert_cmd INTO trnm idlist_opt select */
+#line 1441 "parse.y"
+{yymsp[-4].minor.yy427 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy40, yymsp[0].minor.yy279, yymsp[-4].minor.yy52);/*A-overwrites-R*/}
+#line 3607 "parse.c"
+        break;
+      case 238: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */
+#line 1445 "parse.y"
+{yymsp[-4].minor.yy427 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy362);}
+#line 3612 "parse.c"
+        break;
+      case 239: /* trigger_cmd ::= select */
+#line 1449 "parse.y"
+{yymsp[0].minor.yy427 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy279); /*A-overwrites-X*/}
+#line 3617 "parse.c"
+        break;
+      case 240: /* expr ::= RAISE LP IGNORE RP */
+#line 1452 "parse.y"
+{
+  spanSet(&yymsp[-3].minor.yy162,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0);  /*A-overwrites-X*/
+  yymsp[-3].minor.yy162.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0); 
+  if( yymsp[-3].minor.yy162.pExpr ){
+    yymsp[-3].minor.yy162.pExpr->affinity = ON_CONFLICT_ACTION_IGNORE;
+  }
+}
+#line 3628 "parse.c"
+        break;
+      case 241: /* expr ::= RAISE LP raisetype COMMA STRING RP */
+#line 1459 "parse.y"
+{
+  spanSet(&yymsp[-5].minor.yy162,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0);  /*A-overwrites-X*/
+  yymsp[-5].minor.yy162.pExpr = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); 
+  if( yymsp[-5].minor.yy162.pExpr ) {
+    yymsp[-5].minor.yy162.pExpr->affinity = (char)yymsp[-3].minor.yy52;
+  }
+}
+#line 3639 "parse.c"
+        break;
+      case 242: /* raisetype ::= ROLLBACK */
+#line 1469 "parse.y"
+{yymsp[0].minor.yy52 = ON_CONFLICT_ACTION_ROLLBACK;}
+#line 3644 "parse.c"
+        break;
+      case 244: /* raisetype ::= FAIL */
+#line 1471 "parse.y"
+{yymsp[0].minor.yy52 = ON_CONFLICT_ACTION_FAIL;}
+#line 3649 "parse.c"
+        break;
+      case 245: /* cmd ::= DROP TRIGGER ifexists fullname */
+#line 1476 "parse.y"
+{
+  sqlite3DropTrigger(pParse,yymsp[0].minor.yy387,yymsp[-1].minor.yy52);
+}
+#line 3656 "parse.c"
+        break;
+      case 246: /* cmd ::= ANALYZE */
+#line 1491 "parse.y"
+{sqlite3Analyze(pParse, 0);}
+#line 3661 "parse.c"
+        break;
+      case 247: /* cmd ::= ANALYZE nm */
+#line 1492 "parse.y"
+{sqlite3Analyze(pParse, &yymsp[0].minor.yy0);}
+#line 3666 "parse.c"
+        break;
+      case 248: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
+#line 1497 "parse.y"
+{
+  sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy387,&yymsp[0].minor.yy0);
+}
+#line 3673 "parse.c"
+        break;
+      case 249: /* with ::= */
+#line 1520 "parse.y"
+{yymsp[1].minor.yy151 = 0;}
+#line 3678 "parse.c"
+        break;
+      case 250: /* with ::= WITH wqlist */
+#line 1522 "parse.y"
+{ yymsp[-1].minor.yy151 = yymsp[0].minor.yy151; }
+#line 3683 "parse.c"
+        break;
+      case 251: /* with ::= WITH RECURSIVE wqlist */
+#line 1523 "parse.y"
+{ yymsp[-2].minor.yy151 = yymsp[0].minor.yy151; }
+#line 3688 "parse.c"
+        break;
+      case 252: /* wqlist ::= nm eidlist_opt AS LP select RP */
+#line 1525 "parse.y"
+{
+  yymsp[-5].minor.yy151 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy382, yymsp[-1].minor.yy279); /*A-overwrites-X*/
+}
+#line 3695 "parse.c"
+        break;
+      case 253: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
+#line 1528 "parse.y"
+{
+  yymsp[-7].minor.yy151 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy151, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy382, yymsp[-1].minor.yy279);
+}
+#line 3702 "parse.c"
+        break;
+      default:
+      /* (254) input ::= ecmd */ yytestcase(yyruleno==254);
+      /* (255) explain ::= */ yytestcase(yyruleno==255);
+      /* (256) cmdx ::= cmd (OPTIMIZED OUT) */ assert(yyruleno!=256);
+      /* (257) trans_opt ::= */ yytestcase(yyruleno==257);
+      /* (258) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==258);
+      /* (259) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==259);
+      /* (260) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==260);
+      /* (261) savepoint_opt ::= */ yytestcase(yyruleno==261);
+      /* (262) cmd ::= create_table create_table_args */ yytestcase(yyruleno==262);
+      /* (263) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==263);
+      /* (264) columnlist ::= columnname carglist */ yytestcase(yyruleno==264);
+      /* (265) typetoken ::= typename */ yytestcase(yyruleno==265);
+      /* (266) typename ::= ID|STRING */ yytestcase(yyruleno==266);
+      /* (267) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=267);
+      /* (268) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=268);
+      /* (269) carglist ::= carglist ccons */ yytestcase(yyruleno==269);
+      /* (270) carglist ::= */ yytestcase(yyruleno==270);
+      /* (271) ccons ::= NULL onconf */ yytestcase(yyruleno==271);
+      /* (272) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==272);
+      /* (273) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==273);
+      /* (274) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=274);
+      /* (275) tconscomma ::= */ yytestcase(yyruleno==275);
+      /* (276) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=276);
+      /* (277) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=277);
+      /* (278) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=278);
+      /* (279) oneselect ::= values */ yytestcase(yyruleno==279);
+      /* (280) sclp ::= selcollist COMMA */ yytestcase(yyruleno==280);
+      /* (281) as ::= ID|STRING */ yytestcase(yyruleno==281);
+      /* (282) join_nm ::= ID|INDEXED */ yytestcase(yyruleno==282);
+      /* (283) join_nm ::= JOIN_KW */ yytestcase(yyruleno==283);
+      /* (284) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=284);
+      /* (285) exprlist ::= nexprlist */ yytestcase(yyruleno==285);
+      /* (286) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=286);
+      /* (287) nmnum ::= STRING */ yytestcase(yyruleno==287);
+      /* (288) nmnum ::= nm */ yytestcase(yyruleno==288);
+      /* (289) nmnum ::= ON */ yytestcase(yyruleno==289);
+      /* (290) nmnum ::= DELETE */ yytestcase(yyruleno==290);
+      /* (291) nmnum ::= DEFAULT */ yytestcase(yyruleno==291);
+      /* (292) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==292);
+      /* (293) foreach_clause ::= */ yytestcase(yyruleno==293);
+      /* (294) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==294);
+      /* (295) trnm ::= nm */ yytestcase(yyruleno==295);
+      /* (296) tridxby ::= */ yytestcase(yyruleno==296);
+        break;
+/********** End reduce actions ************************************************/
+  };
+  assert( yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) );
+  yygoto = yyRuleInfo[yyruleno].lhs;
+  yysize = yyRuleInfo[yyruleno].nrhs;
+  yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto);
+  if( yyact <= YY_MAX_SHIFTREDUCE ){
+    if( yyact>YY_MAX_SHIFT ){
+      yyact += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE;
+    }
+    yymsp -= yysize-1;
+    yypParser->yytos = yymsp;
+    yymsp->stateno = (YYACTIONTYPE)yyact;
+    yymsp->major = (YYCODETYPE)yygoto;
+    yyTraceShift(yypParser, yyact);
+  }else{
+    assert( yyact == YY_ACCEPT_ACTION );
+    yypParser->yytos -= yysize;
+    yy_accept(yypParser);
+  }
+}
+
+/*
+** The following code executes when the parse fails
+*/
+#ifndef YYNOERRORRECOVERY
+static void yy_parse_failed(
+  yyParser *yypParser           /* The parser */
+){
+  sqlite3ParserARG_FETCH;
+#ifndef NDEBUG
+  if( yyTraceFILE ){
+    fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);
+  }
+#endif
+  while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
+  /* Here code is inserted which will be executed whenever the
+  ** parser fails */
+/************ Begin %parse_failure code ***************************************/
+/************ End %parse_failure code *****************************************/
+  sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+}
+#endif /* YYNOERRORRECOVERY */
+
+/*
+** The following code executes when a syntax error first occurs.
+*/
+static void yy_syntax_error(
+  yyParser *yypParser,           /* The parser */
+  int yymajor,                   /* The major type of the error token */
+  sqlite3ParserTOKENTYPE yyminor         /* The minor type of the error token */
+){
+  sqlite3ParserARG_FETCH;
+#define TOKEN yyminor
+/************ Begin %syntax_error code ****************************************/
+#line 32 "parse.y"
+
+  UNUSED_PARAMETER(yymajor);  /* Silence some compiler warnings */
+  assert( TOKEN.z[0] );  /* The tokenizer always gives us a token */
+  if (yypParser->is_fallback_failed && TOKEN.isReserved) {
+    sqlite3ErrorMsg(pParse, "keyword \"%T\" is reserved", &TOKEN);
+  } else {
+    sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
+  }
+#line 3813 "parse.c"
+/************ End %syntax_error code ******************************************/
+  sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+}
+
+/*
+** The following is executed when the parser accepts
+*/
+static void yy_accept(
+  yyParser *yypParser           /* The parser */
+){
+  sqlite3ParserARG_FETCH;
+#ifndef NDEBUG
+  if( yyTraceFILE ){
+    fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);
+  }
+#endif
+#ifndef YYNOERRORRECOVERY
+  yypParser->yyerrcnt = -1;
+#endif
+  assert( yypParser->yytos==yypParser->yystack );
+  /* Here code is inserted which will be executed whenever the
+  ** parser accepts */
+/*********** Begin %parse_accept code *****************************************/
+/*********** End %parse_accept code *******************************************/
+  sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+}
+
+/* The main parser program.
+** The first argument is a pointer to a structure obtained from
+** "sqlite3ParserAlloc" which describes the current state of the parser.
+** The second argument is the major token number.  The third is
+** the minor token.  The fourth optional argument is whatever the
+** user wants (and specified in the grammar) and is available for
+** use by the action routines.
+**
+** Inputs:
+** <ul>
+** <li> A pointer to the parser (an opaque structure.)
+** <li> The major token number.
+** <li> The minor token number.
+** <li> An option argument of a grammar-specified type.
+** </ul>
+**
+** Outputs:
+** None.
+*/
+void sqlite3Parser(
+  void *yyp,                   /* The parser */
+  int yymajor,                 /* The major token code number */
+  sqlite3ParserTOKENTYPE yyminor       /* The value for the token */
+  sqlite3ParserARG_PDECL               /* Optional %extra_argument parameter */
+){
+  YYMINORTYPE yyminorunion;
+  unsigned int yyact;   /* The parser action. */
+#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
+  int yyendofinput;     /* True if we are at the end of input */
+#endif
+#ifdef YYERRORSYMBOL
+  int yyerrorhit = 0;   /* True if yymajor has invoked an error */
+#endif
+  yyParser *yypParser;  /* The parser */
+
+  yypParser = (yyParser*)yyp;
+  assert( yypParser->yytos!=0 );
+#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
+  yyendofinput = (yymajor==0);
+#endif
+  sqlite3ParserARG_STORE;
+
+#ifndef NDEBUG
+  if( yyTraceFILE ){
+    fprintf(yyTraceFILE,"%sInput '%s'\n",yyTracePrompt,yyTokenName[yymajor]);
+  }
+#endif
+
+  do{
+    yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
+    if( yyact <= YY_MAX_SHIFTREDUCE ){
+      yy_shift(yypParser,yyact,yymajor,yyminor);
+#ifndef YYNOERRORRECOVERY
+      yypParser->yyerrcnt--;
+#endif
+      yymajor = YYNOCODE;
+    }else if( yyact <= YY_MAX_REDUCE ){
+      yy_reduce(yypParser,yyact-YY_MIN_REDUCE);
+    }else{
+      assert( yyact == YY_ERROR_ACTION );
+      yyminorunion.yy0 = yyminor;
+#ifdef YYERRORSYMBOL
+      int yymx;
+#endif
+#ifndef NDEBUG
+      if( yyTraceFILE ){
+        fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt);
+      }
+#endif
+#ifdef YYERRORSYMBOL
+      /* A syntax error has occurred.
+      ** The response to an error depends upon whether or not the
+      ** grammar defines an error token "ERROR".  
+      **
+      ** This is what we do if the grammar does define ERROR:
+      **
+      **  * Call the %syntax_error function.
+      **
+      **  * Begin popping the stack until we enter a state where
+      **    it is legal to shift the error symbol, then shift
+      **    the error symbol.
+      **
+      **  * Set the error count to three.
+      **
+      **  * Begin accepting and shifting new tokens.  No new error
+      **    processing will occur until three tokens have been
+      **    shifted successfully.
+      **
+      */
+      if( yypParser->yyerrcnt<0 ){
+        yy_syntax_error(yypParser,yymajor,yyminor);
+      }
+      yymx = yypParser->yytos->major;
+      if( yymx==YYERRORSYMBOL || yyerrorhit ){
+#ifndef NDEBUG
+        if( yyTraceFILE ){
+          fprintf(yyTraceFILE,"%sDiscard input token %s\n",
+             yyTracePrompt,yyTokenName[yymajor]);
+        }
+#endif
+        yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion);
+        yymajor = YYNOCODE;
+      }else{
+        while( yypParser->yytos >= yypParser->yystack
+            && yymx != YYERRORSYMBOL
+            && (yyact = yy_find_reduce_action(
+                        yypParser->yytos->stateno,
+                        YYERRORSYMBOL)) >= YY_MIN_REDUCE
+        ){
+          yy_pop_parser_stack(yypParser);
+        }
+        if( yypParser->yytos < yypParser->yystack || yymajor==0 ){
+          yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
+          yy_parse_failed(yypParser);
+#ifndef YYNOERRORRECOVERY
+          yypParser->yyerrcnt = -1;
+#endif
+          yymajor = YYNOCODE;
+        }else if( yymx!=YYERRORSYMBOL ){
+          yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor);
+        }
+      }
+      yypParser->yyerrcnt = 3;
+      yyerrorhit = 1;
+#elif defined(YYNOERRORRECOVERY)
+      /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
+      ** do any kind of error recovery.  Instead, simply invoke the syntax
+      ** error routine and continue going as if nothing had happened.
+      **
+      ** Applications can set this macro (for example inside %include) if
+      ** they intend to abandon the parse upon the first syntax error seen.
+      */
+      yy_syntax_error(yypParser,yymajor, yyminor);
+      yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
+      yymajor = YYNOCODE;
+      
+#else  /* YYERRORSYMBOL is not defined */
+      /* This is what we do if the grammar does not define ERROR:
+      **
+      **  * Report an error message, and throw away the input token.
+      **
+      **  * If the input token is $, then fail the parse.
+      **
+      ** As before, subsequent error messages are suppressed until
+      ** three input tokens have been successfully shifted.
+      */
+      if( yypParser->yyerrcnt<=0 ){
+        yy_syntax_error(yypParser,yymajor, yyminor);
+      }
+      yypParser->yyerrcnt = 3;
+      yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
+      if( yyendofinput ){
+        yy_parse_failed(yypParser);
+#ifndef YYNOERRORRECOVERY
+        yypParser->yyerrcnt = -1;
+#endif
+      }
+      yymajor = YYNOCODE;
+#endif
+    }
+  }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack );
+#ifndef NDEBUG
+  if( yyTraceFILE ){
+    yyStackEntry *i;
+    char cDiv = '[';
+    fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt);
+    for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){
+      fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]);
+      cDiv = ' ';
+    }
+    fprintf(yyTraceFILE,"]\n");
+  }
+#endif
+  return;
+}
diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
index b078e20..e0b5a2e 100644
--- a/src/box/sql/parse.y
+++ b/src/box/sql/parse.y
@@ -1241,10 +1241,10 @@ paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
 ///////////////////////////// The CREATE INDEX command ///////////////////////
 //
 cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X)
-        ON nm(Y) LP sortlist(Z) RP where_opt(W). {
+        ON nm(Y) LP sortlist(Z) RP. {
   sqlite3CreateIndex(pParse, &X, 
                      sqlite3SrcListAppend(pParse->db,0,&Y), Z, U,
-                      &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
+                      &S, 0, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
 }
 
 %type uniqueflag {int}
diff --git a/test/sql-tap/analyze9.test.lua b/test/sql-tap/analyze9.test.lua
index 4ce575e..3668211 100755
--- a/test/sql-tap/analyze9.test.lua
+++ b/test/sql-tap/analyze9.test.lua
@@ -1111,7 +1111,7 @@ test:do_test(
         test:execsql([[
             DROP TABLE IF EXISTS t1;
             CREATE TABLE t1(id INTEGER PRIMARY KEY AUTOINCREMENT, a, b, c, d);
-            CREATE INDEX i1 ON t1(a, b) WHERE d IS NOT NULL;
+            CREATE INDEX i1 ON t1(a, b);
             INSERT INTO t1 VALUES(null, -1, -1, -1, NULL);
             INSERT INTO t1 SELECT null, 2*a,2*b,2*c,d FROM t1;
             INSERT INTO t1 SELECT null, 2*a,2*b,2*c,d FROM t1;
diff --git a/test/sql-tap/autoindex4.test.lua b/test/sql-tap/autoindex4.test.lua
index 45bae48..a567c5e 100755
--- a/test/sql-tap/autoindex4.test.lua
+++ b/test/sql-tap/autoindex4.test.lua
@@ -111,7 +111,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     "autoindex4-3.1",
     [[
-        CREATE INDEX Items_x1 ON Items(ItemName,Name) WHERE ItemName = 'dummy';
+        CREATE INDEX Items_x1 ON Items(ItemName,Name);
 
         SELECT Items.ItemName
           FROM Items
diff --git a/test/sql-tap/fkey1.test.lua b/test/sql-tap/fkey1.test.lua
index 8749e1f..bca82d9 100755
--- a/test/sql-tap/fkey1.test.lua
+++ b/test/sql-tap/fkey1.test.lua
@@ -212,7 +212,7 @@ test:do_execsql_test(
     "fkey1-6.1",
     [[
         CREATE TABLE p1(id PRIMARY KEY, x, y);
-        CREATE UNIQUE INDEX p1x ON p1(x) WHERE y<2;
+        CREATE INDEX p1x ON p1(x);
         INSERT INTO p1 VALUES(1, 1, 1);
         CREATE TABLE c1(a PRIMARY KEY REFERENCES p1(x));
     ]], {
diff --git a/test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua b/test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua
new file mode 100644
index 0000000..d8210fc
--- /dev/null
+++ b/test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua
@@ -0,0 +1,17 @@
+#!/usr/bin/env tarantool
+test = require("sqltester")
+
+test:plan(1)
+
+
+test:do_catchsql_test(
+    "partial-index-1",
+    [[
+        CREATE TABLE t1 (a INTEGER PRIMARY KEY, b INTEGER)
+        CREATE UNIQUE INDEX i ON t1 (a) WHERE a = 3;
+    ]], {
+        1, "keyword \"CREATE\" is reserved"
+    })
+
+--This test intended to be deleted in #2626
+test:finish_test()
diff --git a/test/sql-tap/index6.test.lua b/test/sql-tap/index6.test.lua
index 2aa97e8..069623f 100755
--- a/test/sql-tap/index6.test.lua
+++ b/test/sql-tap/index6.test.lua
@@ -225,7 +225,7 @@ test:do_execsql_test(
     "index6-6.0",
     [[
         CREATE TABLE t6(a,b, PRIMARY KEY (a,b));
-        CREATE INDEX t6b ON t6(b) WHERE b=1;
+        CREATE INDEX t6b ON t6(b);
         INSERT INTO t6(a,b) VALUES(123,456);
         SELECT * FROM t6;
     ]], {
@@ -262,7 +262,7 @@ test:do_execsql_test(
         CREATE TABLE t7a(id primary key, x);
         CREATE TABLE t7b(id primary key, y);
         INSERT INTO t7a VALUES(1, 1);
-        CREATE INDEX t7ax ON t7a(x) WHERE x=99;
+        CREATE INDEX t7ax ON t7a(x);
         SELECT x,y FROM t7a LEFT JOIN t7b ON (x=99) ORDER BY x;
     ]], {
         -- <index6-7.0>
@@ -318,7 +318,7 @@ test:do_execsql_test(
     [[
         CREATE TABLE t8a(id primary key, a,b);
         CREATE TABLE t8b(id primary key, x,y);
-        CREATE INDEX i8c ON t8b(y) WHERE x = 'value';
+        CREATE INDEX i8c ON t8b(y);
 
         INSERT INTO t8a VALUES(1, 1, 'one');
         INSERT INTO t8a VALUES(2, 2, 'two');
@@ -364,7 +364,7 @@ if (0 > 0)
         "index6-9.1",
         [[
             CREATE TABLE t9(a int, b int, c int);
-            CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20);
+            CREATE INDEX t9ca ON t9(c,a);
             INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5),(NULL,7,3);
             UPDATE t9 SET b=c WHERE a in (10,12,20);
             SELECT a,b,c,'|' FROM t9 ORDER BY a;
@@ -379,7 +379,7 @@ test:do_execsql_test(
     [[
         --DROP TABLE t9;
         CREATE TABLE t9(a int, b int, c int, PRIMARY KEY(a));
-        CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20);
+        CREATE INDEX t9ca ON t9(c,a);
         INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5);
         UPDATE t9 SET b=c WHERE a in (10,12,20);
         SELECT a,b,c,'|' FROM t9 ORDER BY a;
@@ -400,7 +400,7 @@ test:do_execsql_test(
           (2,3,4,5,6),
           (3,4,5,6,7),
           (1,2,3,8,9);
-        CREATE INDEX t10x ON t10(d) WHERE a=1 AND b=2 AND c=3;
+        CREATE INDEX t10x ON t10(d);
         SELECT e FROM t10 WHERE a=1 AND b=2 AND c=3 ORDER BY d;
     ]], {
         -- <index6-10.1>
diff --git a/test/sql-tap/index7.test.lua b/test/sql-tap/index7.test.lua
index c8f56eb..c194859 100755
--- a/test/sql-tap/index7.test.lua
+++ b/test/sql-tap/index7.test.lua
@@ -1,6 +1,6 @@
 #!/usr/bin/env tarantool
 test = require("sqltester")
-test:plan(5)
+test:plan(4)
 
 --!./tcltestrunner.lua
 -- 2013-11-04
@@ -261,7 +261,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     "index7-6.2",
     [[
-        CREATE INDEX i4 ON t4(c) WHERE d='xyz';
+        CREATE INDEX i4 ON t4(c);
         SELECT a,b,c,d FROM (SELECT a,b FROM t5 WHERE a=1 AND b='xyz'), t4 WHERE c='abc';
     ]], {
         -- <index7-6.2>
@@ -291,14 +291,15 @@ test:do_eqp_test(
         -- </index7-6.4>
     })
 
-test:do_catchsql_test(
-    "index7-6.5",
-    [[
-        CREATE INDEX t5a ON t5(a) WHERE a=#1;
-    ]], {
-        -- <index7-6.5>
-        1, [[near "#1": syntax error]]
-        -- </index7-6.5>
-    })
-
+--test:do_catchsql_test(
+--    "index7-6.5",
+--    [[
+--        CREATE INDEX t5a ON t5(a) WHERE a=#1;
+--    ]], {
+--        -- <index7-6.5>
+--        1, [[near "#1": syntax error]]
+--        -- </index7-6.5>
+--    })
+-- this test checks incorrect syntax of partial indexes
+-- to be enabled after #2626
 test:finish_test()
-- 
2.7.4

^ permalink raw reply	[flat|nested] 4+ messages in thread
* [tarantool-patches] [PATCH v3] sql: remove support of partial indexes
@ 2018-04-25 11:00 Redacted sender "gleb-skiba" for DMARC
  0 siblings, 0 replies; 4+ messages in thread
From: Redacted sender "gleb-skiba" for DMARC @ 2018-04-25 11:00 UTC (permalink / raw)
  To: alexander.turenko; +Cc: tarantool-patches, Gleb

From: Gleb <gleb-skiba@mail.ru>

Remove support of partial indexes.
Add test which checks inaccessibility of partial index syntax.
Delete usage of partial index from tests.
They can be enabled after #2626.

Fixes #2165
---
Issue from https://github.com/tarantool/tarantool/issues/2165.
Source from https://github.com/tarantool/tarantool/tree/gh-2165-remove-support-partial-indexes.
Changes in v3:
 -return tests which use partial.
 -delete "WHERE" from returned tests.
 -correct syntax errors in commit

 src/box/sql/parse.y                                |  4 ++--
 test/sql-tap/analyze9.test.lua                     |  2 +-
 test/sql-tap/autoindex4.test.lua                   |  2 +-
 test/sql-tap/fkey1.test.lua                        |  2 +-
 ...gh-2165-remove-support-partial-indexes.test.lua | 17 +++++++++++++++
 test/sql-tap/index6.test.lua                       | 12 +++++------
 test/sql-tap/index7.test.lua                       | 25 +++++++++++-----------
 7 files changed, 41 insertions(+), 23 deletions(-)
 create mode 100644 test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua

diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
index b078e20..e0b5a2e 100644
--- a/src/box/sql/parse.y
+++ b/src/box/sql/parse.y
@@ -1241,10 +1241,10 @@ paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
 ///////////////////////////// The CREATE INDEX command ///////////////////////
 //
 cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X)
-        ON nm(Y) LP sortlist(Z) RP where_opt(W). {
+        ON nm(Y) LP sortlist(Z) RP. {
   sqlite3CreateIndex(pParse, &X, 
                      sqlite3SrcListAppend(pParse->db,0,&Y), Z, U,
-                      &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
+                      &S, 0, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
 }
 
 %type uniqueflag {int}
diff --git a/test/sql-tap/analyze9.test.lua b/test/sql-tap/analyze9.test.lua
index 4ce575e..3668211 100755
--- a/test/sql-tap/analyze9.test.lua
+++ b/test/sql-tap/analyze9.test.lua
@@ -1111,7 +1111,7 @@ test:do_test(
         test:execsql([[
             DROP TABLE IF EXISTS t1;
             CREATE TABLE t1(id INTEGER PRIMARY KEY AUTOINCREMENT, a, b, c, d);
-            CREATE INDEX i1 ON t1(a, b) WHERE d IS NOT NULL;
+            CREATE INDEX i1 ON t1(a, b);
             INSERT INTO t1 VALUES(null, -1, -1, -1, NULL);
             INSERT INTO t1 SELECT null, 2*a,2*b,2*c,d FROM t1;
             INSERT INTO t1 SELECT null, 2*a,2*b,2*c,d FROM t1;
diff --git a/test/sql-tap/autoindex4.test.lua b/test/sql-tap/autoindex4.test.lua
index 45bae48..a567c5e 100755
--- a/test/sql-tap/autoindex4.test.lua
+++ b/test/sql-tap/autoindex4.test.lua
@@ -111,7 +111,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     "autoindex4-3.1",
     [[
-        CREATE INDEX Items_x1 ON Items(ItemName,Name) WHERE ItemName = 'dummy';
+        CREATE INDEX Items_x1 ON Items(ItemName,Name);
 
         SELECT Items.ItemName
           FROM Items
diff --git a/test/sql-tap/fkey1.test.lua b/test/sql-tap/fkey1.test.lua
index 8749e1f..bca82d9 100755
--- a/test/sql-tap/fkey1.test.lua
+++ b/test/sql-tap/fkey1.test.lua
@@ -212,7 +212,7 @@ test:do_execsql_test(
     "fkey1-6.1",
     [[
         CREATE TABLE p1(id PRIMARY KEY, x, y);
-        CREATE UNIQUE INDEX p1x ON p1(x) WHERE y<2;
+        CREATE INDEX p1x ON p1(x);
         INSERT INTO p1 VALUES(1, 1, 1);
         CREATE TABLE c1(a PRIMARY KEY REFERENCES p1(x));
     ]], {
diff --git a/test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua b/test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua
new file mode 100644
index 0000000..d8210fc
--- /dev/null
+++ b/test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua
@@ -0,0 +1,17 @@
+#!/usr/bin/env tarantool
+test = require("sqltester")
+
+test:plan(1)
+
+
+test:do_catchsql_test(
+    "partial-index-1",
+    [[
+        CREATE TABLE t1 (a INTEGER PRIMARY KEY, b INTEGER)
+        CREATE UNIQUE INDEX i ON t1 (a) WHERE a = 3;
+    ]], {
+        1, "keyword \"CREATE\" is reserved"
+    })
+
+--This test intended to be deleted in #2626
+test:finish_test()
diff --git a/test/sql-tap/index6.test.lua b/test/sql-tap/index6.test.lua
index 2aa97e8..069623f 100755
--- a/test/sql-tap/index6.test.lua
+++ b/test/sql-tap/index6.test.lua
@@ -225,7 +225,7 @@ test:do_execsql_test(
     "index6-6.0",
     [[
         CREATE TABLE t6(a,b, PRIMARY KEY (a,b));
-        CREATE INDEX t6b ON t6(b) WHERE b=1;
+        CREATE INDEX t6b ON t6(b);
         INSERT INTO t6(a,b) VALUES(123,456);
         SELECT * FROM t6;
     ]], {
@@ -262,7 +262,7 @@ test:do_execsql_test(
         CREATE TABLE t7a(id primary key, x);
         CREATE TABLE t7b(id primary key, y);
         INSERT INTO t7a VALUES(1, 1);
-        CREATE INDEX t7ax ON t7a(x) WHERE x=99;
+        CREATE INDEX t7ax ON t7a(x);
         SELECT x,y FROM t7a LEFT JOIN t7b ON (x=99) ORDER BY x;
     ]], {
         -- <index6-7.0>
@@ -318,7 +318,7 @@ test:do_execsql_test(
     [[
         CREATE TABLE t8a(id primary key, a,b);
         CREATE TABLE t8b(id primary key, x,y);
-        CREATE INDEX i8c ON t8b(y) WHERE x = 'value';
+        CREATE INDEX i8c ON t8b(y);
 
         INSERT INTO t8a VALUES(1, 1, 'one');
         INSERT INTO t8a VALUES(2, 2, 'two');
@@ -364,7 +364,7 @@ if (0 > 0)
         "index6-9.1",
         [[
             CREATE TABLE t9(a int, b int, c int);
-            CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20);
+            CREATE INDEX t9ca ON t9(c,a);
             INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5),(NULL,7,3);
             UPDATE t9 SET b=c WHERE a in (10,12,20);
             SELECT a,b,c,'|' FROM t9 ORDER BY a;
@@ -379,7 +379,7 @@ test:do_execsql_test(
     [[
         --DROP TABLE t9;
         CREATE TABLE t9(a int, b int, c int, PRIMARY KEY(a));
-        CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20);
+        CREATE INDEX t9ca ON t9(c,a);
         INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5);
         UPDATE t9 SET b=c WHERE a in (10,12,20);
         SELECT a,b,c,'|' FROM t9 ORDER BY a;
@@ -400,7 +400,7 @@ test:do_execsql_test(
           (2,3,4,5,6),
           (3,4,5,6,7),
           (1,2,3,8,9);
-        CREATE INDEX t10x ON t10(d) WHERE a=1 AND b=2 AND c=3;
+        CREATE INDEX t10x ON t10(d);
         SELECT e FROM t10 WHERE a=1 AND b=2 AND c=3 ORDER BY d;
     ]], {
         -- <index6-10.1>
diff --git a/test/sql-tap/index7.test.lua b/test/sql-tap/index7.test.lua
index c8f56eb..c194859 100755
--- a/test/sql-tap/index7.test.lua
+++ b/test/sql-tap/index7.test.lua
@@ -1,6 +1,6 @@
 #!/usr/bin/env tarantool
 test = require("sqltester")
-test:plan(5)
+test:plan(4)
 
 --!./tcltestrunner.lua
 -- 2013-11-04
@@ -261,7 +261,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     "index7-6.2",
     [[
-        CREATE INDEX i4 ON t4(c) WHERE d='xyz';
+        CREATE INDEX i4 ON t4(c);
         SELECT a,b,c,d FROM (SELECT a,b FROM t5 WHERE a=1 AND b='xyz'), t4 WHERE c='abc';
     ]], {
         -- <index7-6.2>
@@ -291,14 +291,15 @@ test:do_eqp_test(
         -- </index7-6.4>
     })
 
-test:do_catchsql_test(
-    "index7-6.5",
-    [[
-        CREATE INDEX t5a ON t5(a) WHERE a=#1;
-    ]], {
-        -- <index7-6.5>
-        1, [[near "#1": syntax error]]
-        -- </index7-6.5>
-    })
-
+--test:do_catchsql_test(
+--    "index7-6.5",
+--    [[
+--        CREATE INDEX t5a ON t5(a) WHERE a=#1;
+--    ]], {
+--        -- <index7-6.5>
+--        1, [[near "#1": syntax error]]
+--        -- </index7-6.5>
+--    })
+-- this test checks incorrect syntax of partial indexes
+-- to be enabled after #2626
 test:finish_test()
-- 
2.7.4

^ permalink raw reply	[flat|nested] 4+ messages in thread
* [tarantool-patches] [PATCH v3] sql: remove support of partial indexes
@ 2018-04-26 13:04 Redacted sender "gleb-skiba" for DMARC
  0 siblings, 0 replies; 4+ messages in thread
From: Redacted sender "gleb-skiba" for DMARC @ 2018-04-26 13:04 UTC (permalink / raw)
  To: alexander.turenko; +Cc: tarantool-patches, korablev, kyukhin, Gleb

From: Gleb <gleb-skiba@mail.ru>

Remove support of partial indexes.
Add test which checks inaccessibility of partial index syntax.
Delete usage of partial index from tests.
They can be enabled after #2626.

Fixes #2165
---
Issue from https://github.com/tarantool/tarantool/issues/2165.
Source from https://github.com/tarantool/tarantool/tree/gh-2165-remove-support-partial-indexes.
Changes in v3:
 -return tests which use partial.
 -delete "WHERE" from returned tests.
 -correct syntax errors in commit

 src/box/sql/parse.y                                |  4 ++--
 test/sql-tap/analyze9.test.lua                     |  2 +-
 test/sql-tap/autoindex4.test.lua                   |  2 +-
 test/sql-tap/fkey1.test.lua                        |  2 +-
 ...gh-2165-remove-support-partial-indexes.test.lua | 17 +++++++++++++++
 test/sql-tap/index6.test.lua                       | 12 +++++------
 test/sql-tap/index7.test.lua                       | 25 +++++++++++-----------
 7 files changed, 41 insertions(+), 23 deletions(-)
 create mode 100755 test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua

diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
index b078e20..e0b5a2e 100644
--- a/src/box/sql/parse.y
+++ b/src/box/sql/parse.y
@@ -1241,10 +1241,10 @@ paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
 ///////////////////////////// The CREATE INDEX command ///////////////////////
 //
 cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X)
-        ON nm(Y) LP sortlist(Z) RP where_opt(W). {
+        ON nm(Y) LP sortlist(Z) RP. {
   sqlite3CreateIndex(pParse, &X, 
                      sqlite3SrcListAppend(pParse->db,0,&Y), Z, U,
-                      &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
+                      &S, 0, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
 }
 
 %type uniqueflag {int}
diff --git a/test/sql-tap/analyze9.test.lua b/test/sql-tap/analyze9.test.lua
index 4ce575e..3668211 100755
--- a/test/sql-tap/analyze9.test.lua
+++ b/test/sql-tap/analyze9.test.lua
@@ -1111,7 +1111,7 @@ test:do_test(
         test:execsql([[
             DROP TABLE IF EXISTS t1;
             CREATE TABLE t1(id INTEGER PRIMARY KEY AUTOINCREMENT, a, b, c, d);
-            CREATE INDEX i1 ON t1(a, b) WHERE d IS NOT NULL;
+            CREATE INDEX i1 ON t1(a, b);
             INSERT INTO t1 VALUES(null, -1, -1, -1, NULL);
             INSERT INTO t1 SELECT null, 2*a,2*b,2*c,d FROM t1;
             INSERT INTO t1 SELECT null, 2*a,2*b,2*c,d FROM t1;
diff --git a/test/sql-tap/autoindex4.test.lua b/test/sql-tap/autoindex4.test.lua
index 45bae48..a567c5e 100755
--- a/test/sql-tap/autoindex4.test.lua
+++ b/test/sql-tap/autoindex4.test.lua
@@ -111,7 +111,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     "autoindex4-3.1",
     [[
-        CREATE INDEX Items_x1 ON Items(ItemName,Name) WHERE ItemName = 'dummy';
+        CREATE INDEX Items_x1 ON Items(ItemName,Name);
 
         SELECT Items.ItemName
           FROM Items
diff --git a/test/sql-tap/fkey1.test.lua b/test/sql-tap/fkey1.test.lua
index 8749e1f..bca82d9 100755
--- a/test/sql-tap/fkey1.test.lua
+++ b/test/sql-tap/fkey1.test.lua
@@ -212,7 +212,7 @@ test:do_execsql_test(
     "fkey1-6.1",
     [[
         CREATE TABLE p1(id PRIMARY KEY, x, y);
-        CREATE UNIQUE INDEX p1x ON p1(x) WHERE y<2;
+        CREATE INDEX p1x ON p1(x);
         INSERT INTO p1 VALUES(1, 1, 1);
         CREATE TABLE c1(a PRIMARY KEY REFERENCES p1(x));
     ]], {
diff --git a/test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua b/test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua
new file mode 100755
index 0000000..d8210fc
--- /dev/null
+++ b/test/sql-tap/gh-2165-remove-support-partial-indexes.test.lua
@@ -0,0 +1,17 @@
+#!/usr/bin/env tarantool
+test = require("sqltester")
+
+test:plan(1)
+
+
+test:do_catchsql_test(
+    "partial-index-1",
+    [[
+        CREATE TABLE t1 (a INTEGER PRIMARY KEY, b INTEGER)
+        CREATE UNIQUE INDEX i ON t1 (a) WHERE a = 3;
+    ]], {
+        1, "keyword \"CREATE\" is reserved"
+    })
+
+--This test intended to be deleted in #2626
+test:finish_test()
diff --git a/test/sql-tap/index6.test.lua b/test/sql-tap/index6.test.lua
index 2aa97e8..069623f 100755
--- a/test/sql-tap/index6.test.lua
+++ b/test/sql-tap/index6.test.lua
@@ -225,7 +225,7 @@ test:do_execsql_test(
     "index6-6.0",
     [[
         CREATE TABLE t6(a,b, PRIMARY KEY (a,b));
-        CREATE INDEX t6b ON t6(b) WHERE b=1;
+        CREATE INDEX t6b ON t6(b);
         INSERT INTO t6(a,b) VALUES(123,456);
         SELECT * FROM t6;
     ]], {
@@ -262,7 +262,7 @@ test:do_execsql_test(
         CREATE TABLE t7a(id primary key, x);
         CREATE TABLE t7b(id primary key, y);
         INSERT INTO t7a VALUES(1, 1);
-        CREATE INDEX t7ax ON t7a(x) WHERE x=99;
+        CREATE INDEX t7ax ON t7a(x);
         SELECT x,y FROM t7a LEFT JOIN t7b ON (x=99) ORDER BY x;
     ]], {
         -- <index6-7.0>
@@ -318,7 +318,7 @@ test:do_execsql_test(
     [[
         CREATE TABLE t8a(id primary key, a,b);
         CREATE TABLE t8b(id primary key, x,y);
-        CREATE INDEX i8c ON t8b(y) WHERE x = 'value';
+        CREATE INDEX i8c ON t8b(y);
 
         INSERT INTO t8a VALUES(1, 1, 'one');
         INSERT INTO t8a VALUES(2, 2, 'two');
@@ -364,7 +364,7 @@ if (0 > 0)
         "index6-9.1",
         [[
             CREATE TABLE t9(a int, b int, c int);
-            CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20);
+            CREATE INDEX t9ca ON t9(c,a);
             INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5),(NULL,7,3);
             UPDATE t9 SET b=c WHERE a in (10,12,20);
             SELECT a,b,c,'|' FROM t9 ORDER BY a;
@@ -379,7 +379,7 @@ test:do_execsql_test(
     [[
         --DROP TABLE t9;
         CREATE TABLE t9(a int, b int, c int, PRIMARY KEY(a));
-        CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20);
+        CREATE INDEX t9ca ON t9(c,a);
         INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5);
         UPDATE t9 SET b=c WHERE a in (10,12,20);
         SELECT a,b,c,'|' FROM t9 ORDER BY a;
@@ -400,7 +400,7 @@ test:do_execsql_test(
           (2,3,4,5,6),
           (3,4,5,6,7),
           (1,2,3,8,9);
-        CREATE INDEX t10x ON t10(d) WHERE a=1 AND b=2 AND c=3;
+        CREATE INDEX t10x ON t10(d);
         SELECT e FROM t10 WHERE a=1 AND b=2 AND c=3 ORDER BY d;
     ]], {
         -- <index6-10.1>
diff --git a/test/sql-tap/index7.test.lua b/test/sql-tap/index7.test.lua
index c8f56eb..c194859 100755
--- a/test/sql-tap/index7.test.lua
+++ b/test/sql-tap/index7.test.lua
@@ -1,6 +1,6 @@
 #!/usr/bin/env tarantool
 test = require("sqltester")
-test:plan(5)
+test:plan(4)
 
 --!./tcltestrunner.lua
 -- 2013-11-04
@@ -261,7 +261,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     "index7-6.2",
     [[
-        CREATE INDEX i4 ON t4(c) WHERE d='xyz';
+        CREATE INDEX i4 ON t4(c);
         SELECT a,b,c,d FROM (SELECT a,b FROM t5 WHERE a=1 AND b='xyz'), t4 WHERE c='abc';
     ]], {
         -- <index7-6.2>
@@ -291,14 +291,15 @@ test:do_eqp_test(
         -- </index7-6.4>
     })
 
-test:do_catchsql_test(
-    "index7-6.5",
-    [[
-        CREATE INDEX t5a ON t5(a) WHERE a=#1;
-    ]], {
-        -- <index7-6.5>
-        1, [[near "#1": syntax error]]
-        -- </index7-6.5>
-    })
-
+--test:do_catchsql_test(
+--    "index7-6.5",
+--    [[
+--        CREATE INDEX t5a ON t5(a) WHERE a=#1;
+--    ]], {
+--        -- <index7-6.5>
+--        1, [[near "#1": syntax error]]
+--        -- </index7-6.5>
+--    })
+-- this test checks incorrect syntax of partial indexes
+-- to be enabled after #2626
 test:finish_test()
-- 
2.7.4

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-04-26 13:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-24 18:39 [tarantool-patches] [PATCH v3] sql: remove support of partial indexes Gleb
2018-04-25  9:22 ` [tarantool-patches] " Alexander Turenko
2018-04-25 11:00 [tarantool-patches] " Redacted sender "gleb-skiba" for DMARC
2018-04-26 13:04 Redacted sender "gleb-skiba" for DMARC

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox