From fc8e768c8e458f735802f3a28c7da212620b7d2f Mon Sep 17 00:00:00 2001
From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
Date: Fri, 7 Jul 2017 23:10:51 +0300
Subject: [PATCH] sql: forbid empty requests

Raise syntax error in a case of empty requests. Update sql-tokenizer
to support exising tests.
---
 src/box/lua/sql.c               |    4 +-
 src/box/sql/parse.c             | 2302 ++++++++++++++++---------------
 src/box/sql/parse.y             |    8 +-
 test/sql/lua/sql_tokenizer.lua  |  208 ++-
 test/sql/misc.result            |   16 +
 test/sql/misc.test.lua          |    4 +
 test/sql/sql-tokenizer.result   |   10 +-
 test/sql/sql-tokenizer.test.lua |    2 +
 8 files changed, 1324 insertions(+), 1230 deletions(-)

diff --git a/src/box/lua/sql.c b/src/box/lua/sql.c
index ec66fe464f..d11a324dd9 100644
--- a/src/box/lua/sql.c
+++ b/src/box/lua/sql.c
@@ -210,7 +210,7 @@ lua_sql_execute(struct lua_State *L)
 	sql_end = sql + length;
 
 	l = prep_stmt_list_init(&stock_l);
-	while (sql != sql_end) {
+	do {
 
 		struct prep_stmt *ps = prep_stmt_list_push(&l);
 		if (ps == NULL)
@@ -262,7 +262,7 @@ lua_sql_execute(struct lua_State *L)
 		}
         if (rc != SQLITE_OK && rc != SQLITE_DONE)
             goto sqlerror;
-	}
+	} while (sql != sql_end);
 	prep_stmt_list_free(l);
 	return lua_gettop(L) - 1;
 sqlerror:
diff --git a/src/box/sql/parse.c b/src/box/sql/parse.c
index aada3984f9..daf95128aa 100644
--- a/src/box/sql/parse.c
+++ b/src/box/sql/parse.c
@@ -80,7 +80,7 @@ static void disableLookaside(Parse *pParse){
   pParse->db->lookaside.bDisable++;
 }
 
-#line 400 "parse.y"
+#line 402 "parse.y"
 
   /*
   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
@@ -103,7 +103,7 @@ static void disableLookaside(Parse *pParse){
       }
     }
   }
-#line 829 "parse.y"
+#line 831 "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
@@ -140,7 +140,7 @@ static void disableLookaside(Parse *pParse){
     pOut->zStart = t.z;
     pOut->zEnd = &t.z[t.n];
   }
-#line 946 "parse.y"
+#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.
@@ -163,7 +163,7 @@ static void disableLookaside(Parse *pParse){
       pSpan->pExpr = sqlite3PExpr(pParse, TK_NOT, pSpan->pExpr, 0);
     }
   }
-#line 1020 "parse.y"
+#line 1022 "parse.y"
 
   /* Construct an expression node for a unary postfix operator
   */
@@ -176,7 +176,7 @@ static void disableLookaside(Parse *pParse){
     pOperand->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0);
     pOperand->zEnd = &pPostOp->z[pPostOp->n];
   }                           
-#line 1037 "parse.y"
+#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. */
@@ -188,7 +188,7 @@ static void disableLookaside(Parse *pParse){
       pA->pRight = 0;
     }
   }
-#line 1065 "parse.y"
+#line 1067 "parse.y"
 
   /* Construct an expression node for a unary prefix operator
   */
@@ -203,7 +203,7 @@ static void disableLookaside(Parse *pParse){
     pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0);
     pOut->zEnd = pOperand->zEnd;
   }
-#line 1277 "parse.y"
+#line 1279 "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
@@ -398,162 +398,162 @@ typedef union {
 *********** Begin parsing tables **********************************************/
 #define YY_ACTTAB_COUNT (1559)
 static const YYACTIONTYPE yy_action[] = {
- /*     0 */   323,  828,  349,  821,    5,  201,  201,  815,   99,  100,
- /*    10 */    90,  838,  838,  850,  853,  842,  842,   97,   97,   98,
+ /*     0 */   323,  829,  349,  822,    5,  201,  201,  816,   99,  100,
+ /*    10 */    90,  839,  839,  851,  854,  843,  843,   97,   97,   98,
  /*    20 */    98,   98,   98,  299,   96,   96,   96,   96,   95,   95,
- /*    30 */    94,   94,   94,   93,  349,  323,  969,  969,  820,  820,
- /*    40 */   822,  938,  352,   99,  100,   90,  838,  838,  850,  853,
- /*    50 */   842,  842,   97,   97,   98,   98,   98,   98,  336,   96,
+ /*    30 */    94,   94,   94,   93,  349,  323,  969,  969,  821,  821,
+ /*    40 */   823,  665,  352,   99,  100,   90,  839,  839,  851,  854,
+ /*    50 */   843,  843,   97,   97,   98,   98,   98,   98,  336,   96,
  /*    60 */    96,   96,   96,   95,   95,   94,   94,   94,   93,  349,
- /*    70 */    95,   95,   94,   94,   94,   93,  349,  787,  969,  969,
- /*    80 */   323,   94,   94,   94,   93,  349,  788,   75,   99,  100,
- /*    90 */    90,  838,  838,  850,  853,  842,  842,   97,   97,   98,
+ /*    70 */    95,   95,   94,   94,   94,   93,  349,  788,  969,  969,
+ /*    80 */   323,   94,   94,   94,   93,  349,  789,   75,   99,  100,
+ /*    90 */    90,  839,  839,  851,  854,  843,  843,   97,   97,   98,
  /*   100 */    98,   98,   98,  448,   96,   96,   96,   96,   95,   95,
  /*   110 */    94,   94,   94,   93,  349, 1321,  454,    2,  132,  323,
- /*   120 */   417,  146,  694,   52,   52,   93,  349,   99,  100,   90,
- /*   130 */   838,  838,  850,  853,  842,  842,   97,   97,   98,   98,
+ /*   120 */   417,  146,  695,   52,   52,   93,  349,   99,  100,   90,
+ /*   130 */   839,  839,  851,  854,  843,  843,   97,   97,   98,   98,
  /*   140 */    98,   98,  101,   96,   96,   96,   96,   95,   95,   94,
  /*   150 */    94,   94,   93,  349,  950,  950,  323,  418,  426,  411,
- /*   160 */   409,   61,  748,  748,   99,  100,   90,  838,  838,  850,
- /*   170 */   853,  842,  842,   97,   97,   98,   98,   98,   98,   60,
+ /*   160 */   409,   61,  749,  749,   99,  100,   90,  839,  839,  851,
+ /*   170 */   854,  843,  843,   97,   97,   98,   98,   98,   98,   60,
  /*   180 */    96,   96,   96,   96,   95,   95,   94,   94,   94,   93,
  /*   190 */   349,  323,   92,   89,  177,  275,  951,  952,  371,   99,
- /*   200 */   100,   90,  838,  838,  850,  853,  842,  842,   97,   97,
+ /*   200 */   100,   90,  839,  839,  851,  854,  843,  843,   97,   97,
  /*   210 */    98,   98,   98,   98,  299,   96,   96,   96,   96,   95,
- /*   220 */    95,   94,   94,   94,   93,  349,  323,  932, 1314,  697,
- /*   230 */   702, 1314,  240,  410,   99,  100,   90,  838,  838,  850,
- /*   240 */   853,  842,  842,   97,   97,   98,   98,   98,   98,  345,
+ /*   220 */    95,   94,   94,   94,   93,  349,  323,  933, 1314,  698,
+ /*   230 */   703, 1314,  240,  410,   99,  100,   90,  839,  839,  851,
+ /*   240 */   854,  843,  843,   97,   97,   98,   98,   98,   98,  345,
  /*   250 */    96,   96,   96,   96,   95,   95,   94,   94,   94,   93,
- /*   260 */   349,  323,  932, 1315,  225,  695, 1315,  813,  371,   99,
- /*   270 */   100,   90,  838,  838,  850,  853,  842,  842,   97,   97,
+ /*   260 */   349,  323,  933, 1315,  225,  696, 1315,  814,  371,   99,
+ /*   270 */   100,   90,  839,  839,  851,  854,  843,  843,   97,   97,
  /*   280 */    98,   98,   98,   98,  373,   96,   96,   96,   96,   95,
  /*   290 */    95,   94,   94,   94,   93,  349,  323,  445,  445,  445,
- /*   300 */   829,  930,  988,  316,   99,  100,   90,  838,  838,  850,
- /*   310 */   853,  842,  842,   97,   97,   98,   98,   98,   98,  377,
+ /*   300 */   830,  931,  988,  316,   99,  100,   90,  839,  839,  851,
+ /*   310 */   854,  843,  843,   97,   97,   98,   98,   98,   98,  377,
  /*   320 */    96,   96,   96,   96,   95,   95,   94,   94,   94,   93,
- /*   330 */   349,  323,  332,  327,  229,  814,  930,  735,  735,   99,
- /*   340 */   100,   90,  838,  838,  850,  853,  842,  842,   97,   97,
- /*   350 */    98,   98,   98,   98,  696,   96,   96,   96,   96,   95,
- /*   360 */    95,   94,   94,   94,   93,  349,  323,  733,  733,   92,
- /*   370 */    89,  177,  813,  298,   99,  100,   90,  838,  838,  850,
- /*   380 */   853,  842,  842,   97,   97,   98,   98,   98,   98,  915,
+ /*   330 */   349,  323,  332,  327,  229,  815,  931,  736,  736,   99,
+ /*   340 */   100,   90,  839,  839,  851,  854,  843,  843,   97,   97,
+ /*   350 */    98,   98,   98,   98,  697,   96,   96,   96,   96,   95,
+ /*   360 */    95,   94,   94,   94,   93,  349,  323,  734,  734,   92,
+ /*   370 */    89,  177,  814,  298,   99,  100,   90,  839,  839,  851,
+ /*   380 */   854,  843,  843,   97,   97,   98,   98,   98,   98,  916,
  /*   390 */    96,   96,   96,   96,   95,   95,   94,   94,   94,   93,
  /*   400 */   349,  323,  266,  961,  382,  228,  147,  379,  447,   99,
- /*   410 */   100,   90,  838,  838,  850,  853,  842,  842,   97,   97,
+ /*   410 */   100,   90,  839,  839,  851,  854,  843,  843,   97,   97,
  /*   420 */    98,   98,   98,   98,  294,   96,   96,   96,   96,   95,
  /*   430 */    95,   94,   94,   94,   93,  349,  323,  333,  298,  950,
- /*   440 */   950,  157,   25,  248,   99,  100,   90,  838,  838,  850,
- /*   450 */   853,  842,  842,   97,   97,   98,   98,   98,   98,  448,
+ /*   440 */   950,  157,   25,  248,   99,  100,   90,  839,  839,  851,
+ /*   450 */   854,  843,  843,   97,   97,   98,   98,   98,   98,  448,
  /*   460 */    96,   96,   96,   96,   95,   95,   94,   94,   94,   93,
  /*   470 */   349,  441,  348,  348,  348,  950,  950,  954,  323,   52,
- /*   480 */    52,  951,  952,  806,  171,   78,   99,  100,   90,  838,
- /*   490 */   838,  850,  853,  842,  842,   97,   97,   98,   98,   98,
+ /*   480 */    52,  951,  952,  807,  171,   78,   99,  100,   90,  839,
+ /*   490 */   839,  851,  854,  843,  843,   97,   97,   98,   98,   98,
  /*   500 */    98,  377,   96,   96,   96,   96,   95,   95,   94,   94,
  /*   510 */    94,   93,  349,  323,  426,  416,  120,  951,  952,  954,
- /*   520 */    81,   99,   88,   90,  838,  838,  850,  853,  842,  842,
+ /*   520 */    81,   99,   88,   90,  839,  839,  851,  854,  843,  843,
  /*   530 */    97,   97,   98,   98,   98,   98,  437,   96,   96,   96,
- /*   540 */    96,   95,   95,   94,   94,   94,   93,  349,  323,  839,
- /*   550 */   839,  851,  854,  688,  329,  341,  377,  100,   90,  838,
- /*   560 */   838,  850,  853,  842,  842,   97,   97,   98,   98,   98,
- /*   570 */    98,  713,   96,   96,   96,   96,   95,   95,   94,   94,
- /*   580 */    94,   93,  349,  323,  895,  895,  385,  258,   72,  338,
- /*   590 */   669,  670,  671,   90,  838,  838,  850,  853,  842,  842,
+ /*   540 */    96,   95,   95,   94,   94,   94,   93,  349,  323,  840,
+ /*   550 */   840,  852,  855,  689,  329,  341,  377,  100,   90,  839,
+ /*   560 */   839,  851,  854,  843,  843,   97,   97,   98,   98,   98,
+ /*   570 */    98,  714,   96,   96,   96,   96,   95,   95,   94,   94,
+ /*   580 */    94,   93,  349,  323,  896,  896,  385,  258,   72,  338,
+ /*   590 */   670,  671,  672,   90,  839,  839,  851,  854,  843,  843,
  /*   600 */    97,   97,   98,   98,   98,   98,  359,   96,   96,   96,
  /*   610 */    96,   95,   95,   94,   94,   94,   93,  349,   86,  443,
- /*   620 */   843,    3, 1195,  359,  358,  132,  420,  809,  950,  950,
- /*   630 */   772,   86,  443,  360,    3,  210,  168,  285,  403,  280,
- /*   640 */   402,  197,  230,  448,  175,  756,   83,   84,  278,  813,
+ /*   620 */   844,    3, 1196,  359,  358,  132,  420,  810,  950,  950,
+ /*   630 */   773,   86,  443,  360,    3,  210,  168,  285,  403,  280,
+ /*   640 */   402,  197,  230,  448,  175,  757,   83,   84,  278,  814,
  /*   650 */   260,  363,  249,   85,  350,  350,   92,   89,  177,   83,
  /*   660 */    84,  240,  410,   52,   52,  446,   85,  350,  350,  448,
  /*   670 */   951,  952,  192,  453,  453,  400,  397,  396,  446,  241,
- /*   680 */   219,  114,  432,  772,  359,  448,  395,  712,  743,   10,
- /*   690 */    10,  132,  132,  957,  828,  432,  450,  449,  426,  425,
- /*   700 */   815,  704,  176,  335,  132,   52,   52,  828,  266,  450,
- /*   710 */   449,  813,  192,  815,  334,  400,  397,  396,  448, 1261,
- /*   720 */  1261,   23,  950,  950,   86,  443,  395,    3,  772,  427,
- /*   730 */   889,  820,  820,  822,  823,   19,  296,  716,   52,   52,
- /*   740 */   426,  406,  444,  329,  820,  820,  822,  823,   19,  265,
- /*   750 */   401,  153,   83,   84,  757,  176,  745,  448,  717,   85,
- /*   760 */   350,  350,  120, 1288,  951,  952,  725,  413,  407,  353,
- /*   770 */   923,  446,  786,  426,  428,  785,  384,   32,   32,   86,
- /*   780 */   443,  772,    3,  339,   98,   98,   98,   98,  432,   96,
+ /*   680 */   219,  114,  432,  773,  359,  448,  395,  713,  744,   10,
+ /*   690 */    10,  132,  132,  957,  829,  432,  450,  449,  426,  425,
+ /*   700 */   816,  705,  176,  335,  132,   52,   52,  829,  266,  450,
+ /*   710 */   449,  814,  192,  816,  334,  400,  397,  396,  448, 1262,
+ /*   720 */  1262,   23,  950,  950,   86,  443,  395,    3,  773,  427,
+ /*   730 */   890,  821,  821,  823,  824,   19,  296,  717,   52,   52,
+ /*   740 */   426,  406,  444,  329,  821,  821,  823,  824,   19,  265,
+ /*   750 */   401,  153,   83,   84,  758,  176,  746,  448,  718,   85,
+ /*   760 */   350,  350,  120, 1288,  951,  952,  726,  413,  407,  353,
+ /*   770 */   924,  446,  787,  426,  428,  786,  384,   32,   32,   86,
+ /*   780 */   443,  773,    3,  339,   98,   98,   98,   98,  432,   96,
  /*   790 */    96,   96,   96,   95,   95,   94,   94,   94,   93,  349,
- /*   800 */   828,  120,  450,  449,  809,  813,  815,   83,   84,  243,
- /*   810 */   809,  132,  408,  883,   85,  350,  350,  132,   92,   89,
- /*   820 */   177,   92,   89,  177,  911,  244,  446,  260,  368,  259,
- /*   830 */   883,  885,  415,  260,  368,  259,  266,  820,  820,  822,
- /*   840 */   823,   19,  201,  432,   96,   96,   96,   96,   95,   95,
- /*   850 */    94,   94,   94,   93,  349,  828,  711,  450,  449,  682,
- /*   860 */   758,  815,  448,  347,  346,  120,  950,  950,  908,  912,
+ /*   800 */   829,  120,  450,  449,  810,  814,  816,   83,   84,  243,
+ /*   810 */   810,  132,  408,  884,   85,  350,  350,  132,   92,   89,
+ /*   820 */   177,   92,   89,  177,  912,  244,  446,  260,  368,  259,
+ /*   830 */   884,  886,  415,  260,  368,  259,  266,  821,  821,  823,
+ /*   840 */   824,   19,  201,  432,   96,   96,   96,   96,   95,   95,
+ /*   850 */    94,   94,   94,   93,  349,  829,  712,  450,  449,  683,
+ /*   860 */   759,  816,  448,  347,  346,  120,  950,  950,  909,  913,
  /*   870 */   343,  950,  950,  969,  247,   76,  443,  356,    3,  448,
- /*   880 */   198,  174,   51,   51,  892,  913,  448,  736,  891,  950,
- /*   890 */   950,  883,  820,  820,  822,  823,   19,  737,  928,   52,
- /*   900 */    52,  120,  383,   83,   84,  906,   10,   10,  951,  952,
- /*   910 */    85,  350,  350,  951,  952,  969,  976,  950,  950,  741,
- /*   920 */   337,  156,  446,  974,  369,  975,  354,  730,  709,  366,
- /*   930 */   239,  951,  952,  318,  342,  297,  730,   24,  120,  432,
- /*   940 */    58,  873,  367,  347,  346,   82,    1,   80,  977,  908,
- /*   950 */   977,  828,  120,  450,  449,  950,  950,  815,  774,  951,
+ /*   880 */   198,  174,   51,   51,  893,  914,  448,  737,  892,  950,
+ /*   890 */   950,  884,  821,  821,  823,  824,   19,  738,  929,   52,
+ /*   900 */    52,  120,  383,   83,   84,  907,   10,   10,  951,  952,
+ /*   910 */    85,  350,  350,  951,  952,  969,  976,  950,  950,  742,
+ /*   920 */   337,  156,  446,  974,  369,  975,  354,  731,  710,  366,
+ /*   930 */   239,  951,  952,  318,  342,  297,  731,   24,  120,  432,
+ /*   940 */    58,  874,  367,  347,  346,   82,    1,   80,  977,  909,
+ /*   950 */   977,  829,  120,  450,  449,  950,  950,  816,  775,  951,
  /*   960 */   952,   98,   98,   98,   98,   91,   96,   96,   96,   96,
- /*   970 */    95,   95,   94,   94,   94,   93,  349,  255, 1202,  950,
- /*   980 */   950,  254,  120,  763,  103,  392,  773,  448,  820,  820,
- /*   990 */   822,  823,   19,  448,  224,  448,  196,  951,  952,  313,
- /*  1000 */   312,  311,  213,  309,  903,  369,  679,   52,   52,  170,
- /*  1010 */   169,  911,  156,   10,   10,   10,   10,  698,  698,  414,
+ /*   970 */    95,   95,   94,   94,   94,   93,  349,  255, 1203,  950,
+ /*   980 */   950,  254,  120,  764,  103,  392,  774,  448,  821,  821,
+ /*   990 */   823,  824,   19,  448,  224,  448,  196,  951,  952,  313,
+ /*  1000 */   312,  311,  213,  309,  904,  369,  680,   52,   52,  170,
+ /*  1010 */   169,  912,  156,   10,   10,   10,   10,  699,  699,  414,
  /*  1020 */   405,  951,  952,  378,  322,  222,  222,  231,  977,  423,
- /*  1030 */   977,  753,  330,  133,  266,  902,  752,  413,  266,    9,
- /*  1040 */     9,  448,  421,  232,  448,  232,  448,  685,  448,  179,
- /*  1050 */   361,  246,  380,  251,   74,  253,  912,  828,  266,  821,
- /*  1060 */   245,   36,   36,  815,   37,   37,   12,   12,   27,   27,
- /*  1070 */   448,  181,  913,  328,  431,  226,  156,  448,  278,  227,
- /*  1080 */   120,  132,  180,  434,  308,  262,  448,  753,  319,  448,
- /*  1090 */    38,   38,  752,  448,  820,  820,  822,   39,   39,  914,
+ /*  1030 */   977,  754,  330,  133,  266,  903,  753,  413,  266,    9,
+ /*  1040 */     9,  448,  421,  232,  448,  232,  448,  686,  448,  179,
+ /*  1050 */   361,  246,  380,  251,   74,  253,  913,  829,  266,  822,
+ /*  1060 */   245,   36,   36,  816,   37,   37,   12,   12,   27,   27,
+ /*  1070 */   448,  181,  914,  328,  431,  226,  156,  448,  278,  227,
+ /*  1080 */   120,  132,  180,  434,  308,  262,  448,  754,  319,  448,
+ /*  1090 */    38,   38,  753,  448,  821,  821,  823,   39,   39,  915,
  /*  1100 */   448,  266,  448,  324,  267,  252,   40,   40,  448,   41,
  /*  1110 */    41,  448,  270,   42,   42,  448,  120,  438,  448,  266,
  /*  1120 */    28,   28,   29,   29,  448,  272,  448,  196,   31,   31,
- /*  1130 */   357,   43,   43,  448,  707,   44,   44,  448,   45,   45,
- /*  1140 */   787,  448,  881,  448,   11,   11,   46,   46,  448,  788,
- /*  1150 */   120,  448,  274,  105,  105,  448,  726,   47,   47,  448,
- /*  1160 */   742,   48,   48,   33,   33,  448,  117,  448,   49,   49,
- /*  1170 */   448,   50,   50,  448,  968,   34,   34,  448,  710,  122,
+ /*  1130 */   357,   43,   43,  448,  708,   44,   44,  448,   45,   45,
+ /*  1140 */   788,  448,  882,  448,   11,   11,   46,   46,  448,  789,
+ /*  1150 */   120,  448,  274,  105,  105,  448,  727,   47,   47,  448,
+ /*  1160 */   743,   48,   48,   33,   33,  448,  117,  448,   49,   49,
+ /*  1170 */   448,   50,   50,  448,  968,   34,   34,  448,  711,  122,
  /*  1180 */   122,  448,  195,  194,  193,  123,  123,  124,  124,  448,
- /*  1190 */    56,   56,  448,   35,   35,  448,  273,  106,  106,  692,
+ /*  1190 */    56,   56,  448,   35,   35,  448,  273,  106,  106,  693,
  /*  1200 */   448,   53,   53,  448,  328,  448,  118,  448,  161,  107,
  /*  1210 */   107,  448,  108,  108,  448,  104,  104,  448,  266,  448,
  /*  1220 */   121,  121,  448,  119,  119,  112,  112,  111,  111,  448,
  /*  1230 */   375,  109,  109,  448,  110,  110,  223,   55,   55,   57,
- /*  1240 */    57,  692,   54,   54,  222,  222,  315,  990,   20,   26,
- /*  1250 */    26,  315,  931,   30,   30,  442,  413,  221,  174,  738,
- /*  1260 */   705,  927,  811,   21,  317,  200,  370,  376,  268,  200,
- /*  1270 */   271,  166,  372,  261,  393,  200,   74,  206,  276,  722,
- /*  1280 */   723,   74,  715,  714,  284,  880,  750,  781,  120,   77,
- /*  1290 */   200,  876,  279,  779,  206,  283,  888,  887,  888,  887,
- /*  1300 */   690,  824,  705,  116,  812,  759,  770,  235,  429,  430,
- /*  1310 */   300,  301,  819,  693,  687,  287,  388,  676,  675,  677,
- /*  1320 */   991,  944,  216,  289,  291,  991,  158,  880,    7,  801,
- /*  1330 */   314,  362,  257,  250,  905,  172, 1278,  374,  293,  433,
- /*  1340 */   947,  985,  306,  824,  398,  135,  282,  878,  877,  203,
- /*  1350 */   709,  922,  920,  167,  982,   59,   62,  331,  144,  155,
+ /*  1240 */    57,  693,   54,   54,  222,  222,  315,  990,   20,   26,
+ /*  1250 */    26,  315,  932,   30,   30,  442,  413,  221,  174,  739,
+ /*  1260 */   706,  928,  812,   21,  317,  200,  370,  376,  268,  200,
+ /*  1270 */   271,  166,  372,  261,  393,  200,   74,  206,  276,  723,
+ /*  1280 */   724,   74,  716,  715,  284,  881,  751,  782,  120,   77,
+ /*  1290 */   200,  877,  279,  780,  206,  283,  889,  888,  889,  888,
+ /*  1300 */   691,  825,  706,  116,  813,  760,  771,  235,  429,  430,
+ /*  1310 */   300,  301,  820,  694,  688,  287,  388,  677,  676,  678,
+ /*  1320 */   991,  944,  216,  289,  291,  991,  158,  881,    7,  802,
+ /*  1330 */   314,  362,  257,  250,  906,  172, 1278,  374,  293,  433,
+ /*  1340 */   947,  985,  306,  825,  398,  135,  282,  879,  878,  203,
+ /*  1350 */   710,  923,  921,  167,  982,   59,   62,  331,  144,  155,
  /*  1360 */   130,   72,  364,  137,  365,  391,  183,  187,  139,  140,
- /*  1370 */   141,  381,   67,  890,  387,  771,  798,  159,  142,  148,
- /*  1380 */   808,  264,  154,  217,  389,  907,  269,  404,  872,  188,
- /*  1390 */   189,  320,  678,  190,  729,  728,  727,  340,  707,  720,
- /*  1400 */   719,  419,   71,    6,  767,  768,  202,   79,  344,  286,
- /*  1410 */   288,  295,  766,  321,  701,  700,  290,  281,  699,  765,
- /*  1420 */   959,  292,  102,  858,  749,  424,  236,  211,  436,   73,
- /*  1430 */   440,  237,  422,   22,  684,  451,  945,  215,  212,  214,
- /*  1440 */   238,  452,  125,  134,  673,  302,  672,  667,  126,  666,
+ /*  1370 */   141,  381,   67,  891,  387,  772,  799,  159,  142,  148,
+ /*  1380 */   809,  264,  154,  217,  389,  908,  269,  404,  873,  188,
+ /*  1390 */   189,  320,  679,  190,  730,  729,  728,  340,  708,  721,
+ /*  1400 */   720,  419,   71,    6,  768,  769,  202,   79,  344,  286,
+ /*  1410 */   288,  295,  767,  321,  702,  701,  290,  281,  700,  766,
+ /*  1420 */   959,  292,  102,  859,  750,  424,  236,  211,  436,   73,
+ /*  1430 */   440,  237,  422,   22,  685,  451,  945,  215,  212,  214,
+ /*  1440 */   238,  452,  125,  134,  674,  302,  673,  668,  126,  667,
  /*  1450 */   351,  165,  127,  242,  178,  355,  115,  305,  303,  304,
- /*  1460 */   233,  886,  113,  884,  325,  807,  136,  128,  739,  138,
- /*  1470 */   256,  901,  143,  182,  145,  129,  904,  184,   63,   64,
- /*  1480 */    65,   66,  900,    8,  185,   13,  186,  200,  893,  149,
- /*  1490 */   263,  979,  150,  386,  681,  160,  390,  191,  283,  277,
- /*  1500 */   747,  151,   68,  394,   14,   15,  399,  326,  718,   69,
- /*  1510 */    70,  234,  827,  826,  856,   16,    4,  131,  751,  173,
- /*  1520 */   218,  220,  412,  780,  199,  152,   77,  775,   17,   18,
- /*  1530 */    74,  871,  857,  855,  910,  860,  909,  205,  204,  936,
- /*  1540 */   162,  435,  939,  937,  163,  207,  992,  439,  859,  164,
- /*  1550 */   208,  825,  691,   87,  310,  209, 1280, 1279,  307,
+ /*  1460 */   233,  887,  113,  885,  325,  808,  136,  128,  740,  138,
+ /*  1470 */   256,  902,  143,  182,  145,  129,  905,  184,   63,   64,
+ /*  1480 */    65,   66,  901,    8,  185,   13,  186,  200,  894,  149,
+ /*  1490 */   263,  979,  150,  386,  682,  160,  390,  191,  283,  277,
+ /*  1500 */   748,  151,   68,  394,   14,   15,  399,  326,  719,   69,
+ /*  1510 */    70,  234,  828,  827,  857,   16,    4,  131,  752,  173,
+ /*  1520 */   218,  220,  412,  781,  199,  152,   77,  776,   17,   18,
+ /*  1530 */    74,  872,  858,  856,  911,  861,  910,  205,  204,  937,
+ /*  1540 */   162,  435,  664,  938,  163,  207, 1267,  439,  860,  164,
+ /*  1550 */   208,  826,  692,   87,  310,  209, 1280, 1279,  307,
 };
 static const YYCODETYPE yy_lookahead[] = {
  /*     0 */    19,   95,   53,   97,   22,   24,   24,  101,   27,   28,
@@ -805,52 +805,52 @@ static const short yy_reduce_ofst[] = {
  /*   320 */  1279, 1283, 1288,
 };
 static const YYACTIONTYPE yy_default[] = {
- /*     0 */  1268, 1261, 1261, 1261, 1195, 1195, 1195, 1195, 1261, 1088,
- /*    10 */  1117, 1117, 1245, 1320, 1320, 1320, 1320, 1320, 1320, 1194,
- /*    20 */  1320, 1320, 1320, 1320, 1261, 1092, 1123, 1320, 1320, 1320,
- /*    30 */  1320, 1196, 1197, 1320, 1320, 1320, 1244, 1246, 1133, 1132,
- /*    40 */  1131, 1130, 1227, 1104, 1128, 1121, 1125, 1196, 1190, 1191,
- /*    50 */  1189, 1193, 1197, 1320, 1124, 1159, 1174, 1158, 1320, 1320,
+ /*     0 */  1268, 1262, 1262, 1262, 1196, 1196, 1196, 1196, 1262, 1089,
+ /*    10 */  1118, 1118, 1246, 1320, 1320, 1320, 1320, 1320, 1320, 1195,
+ /*    20 */  1320, 1320, 1320, 1320, 1262, 1093, 1124, 1320, 1320, 1320,
+ /*    30 */  1320, 1197, 1198, 1320, 1320, 1320, 1245, 1247, 1134, 1133,
+ /*    40 */  1132, 1131, 1228, 1105, 1129, 1122, 1126, 1197, 1191, 1192,
+ /*    50 */  1190, 1194, 1198, 1320, 1125, 1160, 1175, 1159, 1320, 1320,
  /*    60 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
  /*    70 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
  /*    80 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
  /*    90 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
- /*   100 */  1320, 1320, 1320, 1320, 1168, 1173, 1180, 1172, 1169, 1161,
- /*   110 */  1160, 1162, 1163, 1320, 1011, 1059, 1320, 1320, 1320, 1164,
- /*   120 */  1320, 1165, 1177, 1176, 1175, 1252, 1277, 1276, 1320, 1320,
+ /*   100 */  1320, 1320, 1320, 1320, 1169, 1174, 1181, 1173, 1170, 1162,
+ /*   110 */  1161, 1163, 1164, 1320, 1012, 1060, 1320, 1320, 1320, 1165,
+ /*   120 */  1320, 1166, 1178, 1177, 1176, 1253, 1277, 1276, 1320, 1320,
  /*   130 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
  /*   140 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
- /*   150 */  1320, 1320, 1320, 1320, 1320, 1261, 1017, 1017, 1320, 1261,
- /*   160 */  1261, 1261, 1261, 1261, 1261, 1257, 1092, 1083, 1320, 1320,
- /*   170 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1249,
- /*   180 */  1247, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
+ /*   150 */  1320, 1320, 1320, 1320, 1320, 1262, 1018, 1018, 1320, 1262,
+ /*   160 */  1262, 1262, 1262, 1262, 1262, 1258, 1093, 1084, 1320, 1320,
+ /*   170 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1250,
+ /*   180 */  1248, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
  /*   190 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
- /*   200 */  1320, 1320, 1088, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
- /*   210 */  1320, 1320, 1320, 1320, 1320, 1271, 1320, 1222, 1088, 1088,
- /*   220 */  1088, 1090, 1072, 1082,  996, 1127, 1106, 1106, 1309, 1127,
- /*   230 */  1309, 1034, 1291, 1031, 1117, 1106, 1192, 1117, 1117, 1089,
- /*   240 */  1082, 1320, 1312, 1097, 1097, 1311, 1311, 1097, 1138, 1062,
- /*   250 */  1127, 1068, 1068, 1068, 1068, 1097, 1008, 1127, 1138, 1062,
- /*   260 */  1062, 1127, 1097, 1008, 1226, 1306, 1097, 1097, 1008, 1203,
- /*   270 */  1097, 1008, 1097, 1008, 1203, 1060, 1060, 1060, 1049, 1203,
- /*   280 */  1060, 1034, 1060, 1049, 1060, 1060, 1110, 1105, 1110, 1105,
- /*   290 */  1110, 1105, 1110, 1105, 1097, 1198, 1097, 1320, 1203, 1207,
- /*   300 */  1207, 1203, 1122, 1111, 1120, 1118, 1127, 1014, 1052, 1274,
- /*   310 */  1274, 1270, 1270, 1270, 1270, 1317, 1317, 1257, 1286, 1286,
- /*   320 */  1036, 1036, 1286, 1320, 1320, 1320, 1320, 1320, 1320, 1281,
- /*   330 */  1320, 1210, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
+ /*   200 */  1320, 1320, 1089, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
+ /*   210 */  1320, 1320, 1320, 1320, 1320, 1271, 1320, 1223, 1089, 1089,
+ /*   220 */  1089, 1091, 1073, 1083,  997, 1128, 1107, 1107, 1309, 1128,
+ /*   230 */  1309, 1035, 1291, 1032, 1118, 1107, 1193, 1118, 1118, 1090,
+ /*   240 */  1083, 1320, 1312, 1098, 1098, 1311, 1311, 1098, 1139, 1063,
+ /*   250 */  1128, 1069, 1069, 1069, 1069, 1098, 1009, 1128, 1139, 1063,
+ /*   260 */  1063, 1128, 1098, 1009, 1227, 1306, 1098, 1098, 1009, 1204,
+ /*   270 */  1098, 1009, 1098, 1009, 1204, 1061, 1061, 1061, 1050, 1204,
+ /*   280 */  1061, 1035, 1061, 1050, 1061, 1061, 1111, 1106, 1111, 1106,
+ /*   290 */  1111, 1106, 1111, 1106, 1098, 1199, 1098, 1320, 1204, 1208,
+ /*   300 */  1208, 1204, 1123, 1112, 1121, 1119, 1128, 1015, 1053, 1274,
+ /*   310 */  1274, 1270, 1270, 1270, 1270, 1317, 1317, 1258, 1286, 1286,
+ /*   320 */  1037, 1037, 1286, 1320, 1320, 1320, 1320, 1320, 1320, 1281,
+ /*   330 */  1320, 1211, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
  /*   340 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
- /*   350 */  1144, 1320,  993, 1254, 1320, 1320, 1253, 1320, 1320, 1320,
+ /*   350 */  1145, 1320,  994, 1255, 1320, 1320, 1254, 1320, 1320, 1320,
  /*   360 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
  /*   370 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1308, 1320, 1320,
- /*   380 */  1320, 1320, 1320, 1320, 1225, 1224, 1320, 1320, 1320, 1320,
+ /*   380 */  1320, 1320, 1320, 1320, 1226, 1225, 1320, 1320, 1320, 1320,
  /*   390 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
- /*   400 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1074,
+ /*   400 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1075,
  /*   410 */  1320, 1320, 1320, 1295, 1320, 1320, 1320, 1320, 1320, 1320,
- /*   420 */  1320, 1119, 1320, 1112, 1320, 1320, 1299, 1320, 1320, 1320,
- /*   430 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1263, 1320, 1320,
- /*   440 */  1320, 1262, 1320, 1320, 1320, 1320, 1320, 1146, 1320, 1145,
- /*   450 */  1149, 1320, 1002, 1320, 1320,
+ /*   420 */  1320, 1120, 1320, 1113, 1320, 1320, 1299, 1320, 1320, 1320,
+ /*   430 */  1320, 1320, 1320, 1320, 1320, 1320, 1320, 1264, 1320, 1320,
+ /*   440 */  1320, 1263, 1320, 1320, 1320, 1320, 1320, 1147, 1320, 1146,
+ /*   450 */  1150, 1320, 1003, 1320, 1320,
 };
 /********** End of lemon-generated parsing tables *****************************/
 
@@ -1121,282 +1121,282 @@ static const char *const yyTokenName[] = {
 /* For tracing reduce actions, the names of all rules are required.
 */
 static const char *const yyRuleName[] = {
- /*   0 */ "input ::= ecmd",
- /*   1 */ "explain ::= EXPLAIN",
- /*   2 */ "explain ::= EXPLAIN QUERY PLAN",
- /*   3 */ "cmd ::= BEGIN transtype trans_opt",
- /*   4 */ "transtype ::=",
- /*   5 */ "transtype ::= DEFERRED",
- /*   6 */ "transtype ::= IMMEDIATE",
- /*   7 */ "transtype ::= EXCLUSIVE",
- /*   8 */ "cmd ::= COMMIT trans_opt",
- /*   9 */ "cmd ::= END trans_opt",
- /*  10 */ "cmd ::= ROLLBACK trans_opt",
- /*  11 */ "cmd ::= SAVEPOINT nm",
- /*  12 */ "cmd ::= RELEASE savepoint_opt nm",
- /*  13 */ "cmd ::= ROLLBACK trans_opt TO savepoint_opt nm",
- /*  14 */ "create_table ::= createkw temp TABLE ifnotexists nm dbnm",
- /*  15 */ "createkw ::= CREATE",
- /*  16 */ "ifnotexists ::=",
- /*  17 */ "ifnotexists ::= IF NOT EXISTS",
- /*  18 */ "temp ::= TEMP",
- /*  19 */ "temp ::=",
- /*  20 */ "create_table_args ::= LP columnlist conslist_opt RP table_options",
- /*  21 */ "create_table_args ::= AS select",
- /*  22 */ "table_options ::=",
- /*  23 */ "table_options ::= WITHOUT nm",
- /*  24 */ "columnname ::= nm typetoken",
- /*  25 */ "typetoken ::=",
- /*  26 */ "typetoken ::= typename LP signed RP",
- /*  27 */ "typetoken ::= typename LP signed COMMA signed RP",
- /*  28 */ "typename ::= typename ID|STRING",
- /*  29 */ "ccons ::= CONSTRAINT nm",
- /*  30 */ "ccons ::= DEFAULT term",
- /*  31 */ "ccons ::= DEFAULT LP expr RP",
- /*  32 */ "ccons ::= DEFAULT PLUS term",
- /*  33 */ "ccons ::= DEFAULT MINUS term",
- /*  34 */ "ccons ::= DEFAULT ID|INDEXED",
- /*  35 */ "ccons ::= NOT NULL onconf",
- /*  36 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
- /*  37 */ "ccons ::= UNIQUE onconf",
- /*  38 */ "ccons ::= CHECK LP expr RP",
- /*  39 */ "ccons ::= REFERENCES nm eidlist_opt refargs",
- /*  40 */ "ccons ::= defer_subclause",
- /*  41 */ "ccons ::= COLLATE ID|STRING",
- /*  42 */ "autoinc ::=",
- /*  43 */ "autoinc ::= AUTOINCR",
- /*  44 */ "refargs ::=",
- /*  45 */ "refargs ::= refargs refarg",
- /*  46 */ "refarg ::= MATCH nm",
- /*  47 */ "refarg ::= ON INSERT refact",
- /*  48 */ "refarg ::= ON DELETE refact",
- /*  49 */ "refarg ::= ON UPDATE refact",
- /*  50 */ "refact ::= SET NULL",
- /*  51 */ "refact ::= SET DEFAULT",
- /*  52 */ "refact ::= CASCADE",
- /*  53 */ "refact ::= RESTRICT",
- /*  54 */ "refact ::= NO ACTION",
- /*  55 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
- /*  56 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
- /*  57 */ "init_deferred_pred_opt ::=",
- /*  58 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
- /*  59 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
- /*  60 */ "conslist_opt ::=",
- /*  61 */ "tconscomma ::= COMMA",
- /*  62 */ "tcons ::= CONSTRAINT nm",
- /*  63 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf",
- /*  64 */ "tcons ::= UNIQUE LP sortlist RP onconf",
- /*  65 */ "tcons ::= CHECK LP expr RP onconf",
- /*  66 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt",
- /*  67 */ "defer_subclause_opt ::=",
- /*  68 */ "onconf ::=",
- /*  69 */ "onconf ::= ON CONFLICT resolvetype",
- /*  70 */ "orconf ::=",
- /*  71 */ "orconf ::= OR resolvetype",
- /*  72 */ "resolvetype ::= IGNORE",
- /*  73 */ "resolvetype ::= REPLACE",
- /*  74 */ "cmd ::= DROP TABLE ifexists fullname",
- /*  75 */ "ifexists ::= IF EXISTS",
- /*  76 */ "ifexists ::=",
- /*  77 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select",
- /*  78 */ "cmd ::= DROP VIEW ifexists fullname",
- /*  79 */ "cmd ::= select",
- /*  80 */ "select ::= with selectnowith",
- /*  81 */ "selectnowith ::= selectnowith multiselect_op oneselect",
- /*  82 */ "multiselect_op ::= UNION",
- /*  83 */ "multiselect_op ::= UNION ALL",
- /*  84 */ "multiselect_op ::= EXCEPT|INTERSECT",
- /*  85 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
- /*  86 */ "values ::= VALUES LP nexprlist RP",
- /*  87 */ "values ::= values COMMA LP exprlist RP",
- /*  88 */ "distinct ::= DISTINCT",
- /*  89 */ "distinct ::= ALL",
- /*  90 */ "distinct ::=",
- /*  91 */ "sclp ::=",
- /*  92 */ "selcollist ::= sclp expr as",
- /*  93 */ "selcollist ::= sclp STAR",
- /*  94 */ "selcollist ::= sclp nm DOT STAR",
- /*  95 */ "as ::= AS nm",
- /*  96 */ "as ::=",
- /*  97 */ "from ::=",
- /*  98 */ "from ::= FROM seltablist",
- /*  99 */ "stl_prefix ::= seltablist joinop",
- /* 100 */ "stl_prefix ::=",
- /* 101 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
- /* 102 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt",
- /* 103 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
- /* 104 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
- /* 105 */ "dbnm ::=",
- /* 106 */ "dbnm ::= DOT nm",
- /* 107 */ "fullname ::= nm dbnm",
- /* 108 */ "joinop ::= COMMA|JOIN",
- /* 109 */ "joinop ::= JOIN_KW JOIN",
- /* 110 */ "joinop ::= JOIN_KW nm JOIN",
- /* 111 */ "joinop ::= JOIN_KW nm nm JOIN",
- /* 112 */ "on_opt ::= ON expr",
- /* 113 */ "on_opt ::=",
- /* 114 */ "indexed_opt ::=",
- /* 115 */ "indexed_opt ::= INDEXED BY nm",
- /* 116 */ "indexed_opt ::= NOT INDEXED",
- /* 117 */ "using_opt ::= USING LP idlist RP",
- /* 118 */ "using_opt ::=",
- /* 119 */ "orderby_opt ::=",
- /* 120 */ "orderby_opt ::= ORDER BY sortlist",
- /* 121 */ "sortlist ::= sortlist COMMA expr sortorder",
- /* 122 */ "sortlist ::= expr sortorder",
- /* 123 */ "sortorder ::= ASC",
- /* 124 */ "sortorder ::= DESC",
- /* 125 */ "sortorder ::=",
- /* 126 */ "groupby_opt ::=",
- /* 127 */ "groupby_opt ::= GROUP BY nexprlist",
- /* 128 */ "having_opt ::=",
- /* 129 */ "having_opt ::= HAVING expr",
- /* 130 */ "limit_opt ::=",
- /* 131 */ "limit_opt ::= LIMIT expr",
- /* 132 */ "limit_opt ::= LIMIT expr OFFSET expr",
- /* 133 */ "limit_opt ::= LIMIT expr COMMA expr",
- /* 134 */ "cmd ::= with DELETE FROM fullname indexed_opt where_opt",
- /* 135 */ "where_opt ::=",
- /* 136 */ "where_opt ::= WHERE expr",
- /* 137 */ "cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt",
- /* 138 */ "setlist ::= setlist COMMA nm EQ expr",
- /* 139 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
- /* 140 */ "setlist ::= nm EQ expr",
- /* 141 */ "setlist ::= LP idlist RP EQ expr",
- /* 142 */ "cmd ::= with insert_cmd INTO fullname idlist_opt select",
- /* 143 */ "cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES",
- /* 144 */ "insert_cmd ::= INSERT orconf",
- /* 145 */ "insert_cmd ::= REPLACE",
- /* 146 */ "idlist_opt ::=",
- /* 147 */ "idlist_opt ::= LP idlist RP",
- /* 148 */ "idlist ::= idlist COMMA nm",
- /* 149 */ "idlist ::= nm",
- /* 150 */ "expr ::= LP expr RP",
- /* 151 */ "term ::= NULL",
- /* 152 */ "expr ::= ID|INDEXED",
- /* 153 */ "expr ::= JOIN_KW",
- /* 154 */ "expr ::= nm DOT nm",
- /* 155 */ "expr ::= nm DOT nm DOT nm",
- /* 156 */ "term ::= FLOAT|BLOB",
- /* 157 */ "term ::= STRING",
- /* 158 */ "term ::= INTEGER",
- /* 159 */ "expr ::= VARIABLE",
- /* 160 */ "expr ::= expr COLLATE ID|STRING",
- /* 161 */ "expr ::= CAST LP expr AS typetoken RP",
- /* 162 */ "expr ::= ID|INDEXED LP distinct exprlist RP",
- /* 163 */ "expr ::= ID|INDEXED LP STAR RP",
- /* 164 */ "term ::= CTIME_KW",
- /* 165 */ "expr ::= LP nexprlist COMMA expr RP",
- /* 166 */ "expr ::= expr AND expr",
- /* 167 */ "expr ::= expr OR expr",
- /* 168 */ "expr ::= expr LT|GT|GE|LE expr",
- /* 169 */ "expr ::= expr EQ|NE expr",
- /* 170 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
- /* 171 */ "expr ::= expr PLUS|MINUS expr",
- /* 172 */ "expr ::= expr STAR|SLASH|REM expr",
- /* 173 */ "expr ::= expr CONCAT expr",
- /* 174 */ "likeop ::= LIKE_KW|MATCH",
- /* 175 */ "likeop ::= NOT LIKE_KW|MATCH",
- /* 176 */ "expr ::= expr likeop expr",
- /* 177 */ "expr ::= expr likeop expr ESCAPE expr",
- /* 178 */ "expr ::= expr ISNULL|NOTNULL",
- /* 179 */ "expr ::= expr NOT NULL",
- /* 180 */ "expr ::= expr IS expr",
- /* 181 */ "expr ::= expr IS NOT expr",
- /* 182 */ "expr ::= NOT expr",
- /* 183 */ "expr ::= BITNOT expr",
- /* 184 */ "expr ::= MINUS expr",
- /* 185 */ "expr ::= PLUS expr",
- /* 186 */ "between_op ::= BETWEEN",
- /* 187 */ "between_op ::= NOT BETWEEN",
- /* 188 */ "expr ::= expr between_op expr AND expr",
- /* 189 */ "in_op ::= IN",
- /* 190 */ "in_op ::= NOT IN",
- /* 191 */ "expr ::= expr in_op LP exprlist RP",
- /* 192 */ "expr ::= LP select RP",
- /* 193 */ "expr ::= expr in_op LP select RP",
- /* 194 */ "expr ::= expr in_op nm dbnm paren_exprlist",
- /* 195 */ "expr ::= EXISTS LP select RP",
- /* 196 */ "expr ::= CASE case_operand case_exprlist case_else END",
- /* 197 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
- /* 198 */ "case_exprlist ::= WHEN expr THEN expr",
- /* 199 */ "case_else ::= ELSE expr",
- /* 200 */ "case_else ::=",
- /* 201 */ "case_operand ::= expr",
- /* 202 */ "case_operand ::=",
- /* 203 */ "exprlist ::=",
- /* 204 */ "nexprlist ::= nexprlist COMMA expr",
- /* 205 */ "nexprlist ::= expr",
- /* 206 */ "paren_exprlist ::=",
- /* 207 */ "paren_exprlist ::= LP exprlist RP",
- /* 208 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt",
- /* 209 */ "uniqueflag ::= UNIQUE",
- /* 210 */ "uniqueflag ::=",
- /* 211 */ "eidlist_opt ::=",
- /* 212 */ "eidlist_opt ::= LP eidlist RP",
- /* 213 */ "eidlist ::= eidlist COMMA nm collate sortorder",
- /* 214 */ "eidlist ::= nm collate sortorder",
- /* 215 */ "collate ::=",
- /* 216 */ "collate ::= COLLATE ID|STRING",
- /* 217 */ "cmd ::= DROP INDEX ifexists fullname",
- /* 218 */ "cmd ::= PRAGMA nm dbnm",
- /* 219 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
- /* 220 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
- /* 221 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
- /* 222 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
- /* 223 */ "plus_num ::= PLUS INTEGER|FLOAT",
- /* 224 */ "minus_num ::= MINUS INTEGER|FLOAT",
- /* 225 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
- /* 226 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
- /* 227 */ "trigger_time ::= BEFORE",
- /* 228 */ "trigger_time ::= AFTER",
- /* 229 */ "trigger_time ::= INSTEAD OF",
- /* 230 */ "trigger_time ::=",
- /* 231 */ "trigger_event ::= DELETE|INSERT",
- /* 232 */ "trigger_event ::= UPDATE",
- /* 233 */ "trigger_event ::= UPDATE OF idlist",
- /* 234 */ "when_clause ::=",
- /* 235 */ "when_clause ::= WHEN expr",
- /* 236 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
- /* 237 */ "trigger_cmd_list ::= trigger_cmd SEMI",
- /* 238 */ "trnm ::= nm DOT nm",
- /* 239 */ "tridxby ::= INDEXED BY nm",
- /* 240 */ "tridxby ::= NOT INDEXED",
- /* 241 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt",
- /* 242 */ "trigger_cmd ::= insert_cmd INTO trnm idlist_opt select",
- /* 243 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt",
- /* 244 */ "trigger_cmd ::= select",
- /* 245 */ "expr ::= RAISE LP IGNORE RP",
- /* 246 */ "expr ::= RAISE LP raisetype COMMA nm RP",
- /* 247 */ "raisetype ::= ROLLBACK",
- /* 248 */ "raisetype ::= ABORT",
- /* 249 */ "raisetype ::= FAIL",
- /* 250 */ "cmd ::= DROP TRIGGER ifexists fullname",
- /* 251 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
- /* 252 */ "cmd ::= DETACH database_kw_opt expr",
- /* 253 */ "key_opt ::=",
- /* 254 */ "key_opt ::= KEY expr",
- /* 255 */ "cmd ::= REINDEX",
- /* 256 */ "cmd ::= REINDEX nm dbnm",
- /* 257 */ "cmd ::= ANALYZE",
- /* 258 */ "cmd ::= ANALYZE nm dbnm",
- /* 259 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
- /* 260 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist",
- /* 261 */ "add_column_fullname ::= fullname",
- /* 262 */ "cmd ::= create_vtab",
- /* 263 */ "cmd ::= create_vtab LP vtabarglist RP",
- /* 264 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm",
- /* 265 */ "vtabarg ::=",
- /* 266 */ "vtabargtoken ::= ANY",
- /* 267 */ "vtabargtoken ::= lp anylist RP",
- /* 268 */ "lp ::= LP",
- /* 269 */ "with ::=",
- /* 270 */ "with ::= WITH wqlist",
- /* 271 */ "with ::= WITH RECURSIVE wqlist",
- /* 272 */ "wqlist ::= nm eidlist_opt AS LP select RP",
- /* 273 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP",
- /* 274 */ "ecmd ::= SEMI",
- /* 275 */ "ecmd ::= explain cmdx SEMI",
+ /*   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 */ "transtype ::= IMMEDIATE",
+ /*   8 */ "transtype ::= EXCLUSIVE",
+ /*   9 */ "cmd ::= COMMIT trans_opt",
+ /*  10 */ "cmd ::= END trans_opt",
+ /*  11 */ "cmd ::= ROLLBACK trans_opt",
+ /*  12 */ "cmd ::= SAVEPOINT nm",
+ /*  13 */ "cmd ::= RELEASE savepoint_opt nm",
+ /*  14 */ "cmd ::= ROLLBACK trans_opt TO savepoint_opt nm",
+ /*  15 */ "create_table ::= createkw temp TABLE ifnotexists nm dbnm",
+ /*  16 */ "createkw ::= CREATE",
+ /*  17 */ "ifnotexists ::=",
+ /*  18 */ "ifnotexists ::= IF NOT EXISTS",
+ /*  19 */ "temp ::= TEMP",
+ /*  20 */ "temp ::=",
+ /*  21 */ "create_table_args ::= LP columnlist conslist_opt RP table_options",
+ /*  22 */ "create_table_args ::= AS select",
+ /*  23 */ "table_options ::=",
+ /*  24 */ "table_options ::= WITHOUT nm",
+ /*  25 */ "columnname ::= nm typetoken",
+ /*  26 */ "typetoken ::=",
+ /*  27 */ "typetoken ::= typename LP signed RP",
+ /*  28 */ "typetoken ::= typename LP signed COMMA signed RP",
+ /*  29 */ "typename ::= typename ID|STRING",
+ /*  30 */ "ccons ::= CONSTRAINT nm",
+ /*  31 */ "ccons ::= DEFAULT term",
+ /*  32 */ "ccons ::= DEFAULT LP expr RP",
+ /*  33 */ "ccons ::= DEFAULT PLUS term",
+ /*  34 */ "ccons ::= DEFAULT MINUS term",
+ /*  35 */ "ccons ::= DEFAULT ID|INDEXED",
+ /*  36 */ "ccons ::= NOT NULL onconf",
+ /*  37 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
+ /*  38 */ "ccons ::= UNIQUE onconf",
+ /*  39 */ "ccons ::= CHECK LP expr RP",
+ /*  40 */ "ccons ::= REFERENCES nm eidlist_opt refargs",
+ /*  41 */ "ccons ::= defer_subclause",
+ /*  42 */ "ccons ::= COLLATE ID|STRING",
+ /*  43 */ "autoinc ::=",
+ /*  44 */ "autoinc ::= AUTOINCR",
+ /*  45 */ "refargs ::=",
+ /*  46 */ "refargs ::= refargs refarg",
+ /*  47 */ "refarg ::= MATCH nm",
+ /*  48 */ "refarg ::= ON INSERT refact",
+ /*  49 */ "refarg ::= ON DELETE refact",
+ /*  50 */ "refarg ::= ON UPDATE refact",
+ /*  51 */ "refact ::= SET NULL",
+ /*  52 */ "refact ::= SET DEFAULT",
+ /*  53 */ "refact ::= CASCADE",
+ /*  54 */ "refact ::= RESTRICT",
+ /*  55 */ "refact ::= NO ACTION",
+ /*  56 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
+ /*  57 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
+ /*  58 */ "init_deferred_pred_opt ::=",
+ /*  59 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
+ /*  60 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
+ /*  61 */ "conslist_opt ::=",
+ /*  62 */ "tconscomma ::= COMMA",
+ /*  63 */ "tcons ::= CONSTRAINT nm",
+ /*  64 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf",
+ /*  65 */ "tcons ::= UNIQUE LP sortlist RP onconf",
+ /*  66 */ "tcons ::= CHECK LP expr RP onconf",
+ /*  67 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt",
+ /*  68 */ "defer_subclause_opt ::=",
+ /*  69 */ "onconf ::=",
+ /*  70 */ "onconf ::= ON CONFLICT resolvetype",
+ /*  71 */ "orconf ::=",
+ /*  72 */ "orconf ::= OR resolvetype",
+ /*  73 */ "resolvetype ::= IGNORE",
+ /*  74 */ "resolvetype ::= REPLACE",
+ /*  75 */ "cmd ::= DROP TABLE ifexists fullname",
+ /*  76 */ "ifexists ::= IF EXISTS",
+ /*  77 */ "ifexists ::=",
+ /*  78 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select",
+ /*  79 */ "cmd ::= DROP VIEW ifexists fullname",
+ /*  80 */ "cmd ::= select",
+ /*  81 */ "select ::= with selectnowith",
+ /*  82 */ "selectnowith ::= selectnowith multiselect_op oneselect",
+ /*  83 */ "multiselect_op ::= UNION",
+ /*  84 */ "multiselect_op ::= UNION ALL",
+ /*  85 */ "multiselect_op ::= EXCEPT|INTERSECT",
+ /*  86 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
+ /*  87 */ "values ::= VALUES LP nexprlist RP",
+ /*  88 */ "values ::= values COMMA LP exprlist RP",
+ /*  89 */ "distinct ::= DISTINCT",
+ /*  90 */ "distinct ::= ALL",
+ /*  91 */ "distinct ::=",
+ /*  92 */ "sclp ::=",
+ /*  93 */ "selcollist ::= sclp expr as",
+ /*  94 */ "selcollist ::= sclp STAR",
+ /*  95 */ "selcollist ::= sclp nm DOT STAR",
+ /*  96 */ "as ::= AS nm",
+ /*  97 */ "as ::=",
+ /*  98 */ "from ::=",
+ /*  99 */ "from ::= FROM seltablist",
+ /* 100 */ "stl_prefix ::= seltablist joinop",
+ /* 101 */ "stl_prefix ::=",
+ /* 102 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
+ /* 103 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt",
+ /* 104 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
+ /* 105 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
+ /* 106 */ "dbnm ::=",
+ /* 107 */ "dbnm ::= DOT nm",
+ /* 108 */ "fullname ::= nm dbnm",
+ /* 109 */ "joinop ::= COMMA|JOIN",
+ /* 110 */ "joinop ::= JOIN_KW JOIN",
+ /* 111 */ "joinop ::= JOIN_KW nm JOIN",
+ /* 112 */ "joinop ::= JOIN_KW nm nm JOIN",
+ /* 113 */ "on_opt ::= ON expr",
+ /* 114 */ "on_opt ::=",
+ /* 115 */ "indexed_opt ::=",
+ /* 116 */ "indexed_opt ::= INDEXED BY nm",
+ /* 117 */ "indexed_opt ::= NOT INDEXED",
+ /* 118 */ "using_opt ::= USING LP idlist RP",
+ /* 119 */ "using_opt ::=",
+ /* 120 */ "orderby_opt ::=",
+ /* 121 */ "orderby_opt ::= ORDER BY sortlist",
+ /* 122 */ "sortlist ::= sortlist COMMA expr sortorder",
+ /* 123 */ "sortlist ::= expr sortorder",
+ /* 124 */ "sortorder ::= ASC",
+ /* 125 */ "sortorder ::= DESC",
+ /* 126 */ "sortorder ::=",
+ /* 127 */ "groupby_opt ::=",
+ /* 128 */ "groupby_opt ::= GROUP BY nexprlist",
+ /* 129 */ "having_opt ::=",
+ /* 130 */ "having_opt ::= HAVING expr",
+ /* 131 */ "limit_opt ::=",
+ /* 132 */ "limit_opt ::= LIMIT expr",
+ /* 133 */ "limit_opt ::= LIMIT expr OFFSET expr",
+ /* 134 */ "limit_opt ::= LIMIT expr COMMA expr",
+ /* 135 */ "cmd ::= with DELETE FROM fullname indexed_opt where_opt",
+ /* 136 */ "where_opt ::=",
+ /* 137 */ "where_opt ::= WHERE expr",
+ /* 138 */ "cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt",
+ /* 139 */ "setlist ::= setlist COMMA nm EQ expr",
+ /* 140 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
+ /* 141 */ "setlist ::= nm EQ expr",
+ /* 142 */ "setlist ::= LP idlist RP EQ expr",
+ /* 143 */ "cmd ::= with insert_cmd INTO fullname idlist_opt select",
+ /* 144 */ "cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES",
+ /* 145 */ "insert_cmd ::= INSERT orconf",
+ /* 146 */ "insert_cmd ::= REPLACE",
+ /* 147 */ "idlist_opt ::=",
+ /* 148 */ "idlist_opt ::= LP idlist RP",
+ /* 149 */ "idlist ::= idlist COMMA nm",
+ /* 150 */ "idlist ::= nm",
+ /* 151 */ "expr ::= LP expr RP",
+ /* 152 */ "term ::= NULL",
+ /* 153 */ "expr ::= ID|INDEXED",
+ /* 154 */ "expr ::= JOIN_KW",
+ /* 155 */ "expr ::= nm DOT nm",
+ /* 156 */ "expr ::= nm DOT nm DOT nm",
+ /* 157 */ "term ::= FLOAT|BLOB",
+ /* 158 */ "term ::= STRING",
+ /* 159 */ "term ::= INTEGER",
+ /* 160 */ "expr ::= VARIABLE",
+ /* 161 */ "expr ::= expr COLLATE ID|STRING",
+ /* 162 */ "expr ::= CAST LP expr AS typetoken RP",
+ /* 163 */ "expr ::= ID|INDEXED LP distinct exprlist RP",
+ /* 164 */ "expr ::= ID|INDEXED LP STAR RP",
+ /* 165 */ "term ::= CTIME_KW",
+ /* 166 */ "expr ::= LP nexprlist COMMA expr RP",
+ /* 167 */ "expr ::= expr AND expr",
+ /* 168 */ "expr ::= expr OR expr",
+ /* 169 */ "expr ::= expr LT|GT|GE|LE expr",
+ /* 170 */ "expr ::= expr EQ|NE expr",
+ /* 171 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
+ /* 172 */ "expr ::= expr PLUS|MINUS expr",
+ /* 173 */ "expr ::= expr STAR|SLASH|REM expr",
+ /* 174 */ "expr ::= expr CONCAT expr",
+ /* 175 */ "likeop ::= LIKE_KW|MATCH",
+ /* 176 */ "likeop ::= NOT LIKE_KW|MATCH",
+ /* 177 */ "expr ::= expr likeop expr",
+ /* 178 */ "expr ::= expr likeop expr ESCAPE expr",
+ /* 179 */ "expr ::= expr ISNULL|NOTNULL",
+ /* 180 */ "expr ::= expr NOT NULL",
+ /* 181 */ "expr ::= expr IS expr",
+ /* 182 */ "expr ::= expr IS NOT expr",
+ /* 183 */ "expr ::= NOT expr",
+ /* 184 */ "expr ::= BITNOT expr",
+ /* 185 */ "expr ::= MINUS expr",
+ /* 186 */ "expr ::= PLUS expr",
+ /* 187 */ "between_op ::= BETWEEN",
+ /* 188 */ "between_op ::= NOT BETWEEN",
+ /* 189 */ "expr ::= expr between_op expr AND expr",
+ /* 190 */ "in_op ::= IN",
+ /* 191 */ "in_op ::= NOT IN",
+ /* 192 */ "expr ::= expr in_op LP exprlist RP",
+ /* 193 */ "expr ::= LP select RP",
+ /* 194 */ "expr ::= expr in_op LP select RP",
+ /* 195 */ "expr ::= expr in_op nm dbnm paren_exprlist",
+ /* 196 */ "expr ::= EXISTS LP select RP",
+ /* 197 */ "expr ::= CASE case_operand case_exprlist case_else END",
+ /* 198 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
+ /* 199 */ "case_exprlist ::= WHEN expr THEN expr",
+ /* 200 */ "case_else ::= ELSE expr",
+ /* 201 */ "case_else ::=",
+ /* 202 */ "case_operand ::= expr",
+ /* 203 */ "case_operand ::=",
+ /* 204 */ "exprlist ::=",
+ /* 205 */ "nexprlist ::= nexprlist COMMA expr",
+ /* 206 */ "nexprlist ::= expr",
+ /* 207 */ "paren_exprlist ::=",
+ /* 208 */ "paren_exprlist ::= LP exprlist RP",
+ /* 209 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt",
+ /* 210 */ "uniqueflag ::= UNIQUE",
+ /* 211 */ "uniqueflag ::=",
+ /* 212 */ "eidlist_opt ::=",
+ /* 213 */ "eidlist_opt ::= LP eidlist RP",
+ /* 214 */ "eidlist ::= eidlist COMMA nm collate sortorder",
+ /* 215 */ "eidlist ::= nm collate sortorder",
+ /* 216 */ "collate ::=",
+ /* 217 */ "collate ::= COLLATE ID|STRING",
+ /* 218 */ "cmd ::= DROP INDEX ifexists fullname",
+ /* 219 */ "cmd ::= PRAGMA nm dbnm",
+ /* 220 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
+ /* 221 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
+ /* 222 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
+ /* 223 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
+ /* 224 */ "plus_num ::= PLUS INTEGER|FLOAT",
+ /* 225 */ "minus_num ::= MINUS INTEGER|FLOAT",
+ /* 226 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
+ /* 227 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
+ /* 228 */ "trigger_time ::= BEFORE",
+ /* 229 */ "trigger_time ::= AFTER",
+ /* 230 */ "trigger_time ::= INSTEAD OF",
+ /* 231 */ "trigger_time ::=",
+ /* 232 */ "trigger_event ::= DELETE|INSERT",
+ /* 233 */ "trigger_event ::= UPDATE",
+ /* 234 */ "trigger_event ::= UPDATE OF idlist",
+ /* 235 */ "when_clause ::=",
+ /* 236 */ "when_clause ::= WHEN expr",
+ /* 237 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
+ /* 238 */ "trigger_cmd_list ::= trigger_cmd SEMI",
+ /* 239 */ "trnm ::= nm DOT nm",
+ /* 240 */ "tridxby ::= INDEXED BY nm",
+ /* 241 */ "tridxby ::= NOT INDEXED",
+ /* 242 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt",
+ /* 243 */ "trigger_cmd ::= insert_cmd INTO trnm idlist_opt select",
+ /* 244 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt",
+ /* 245 */ "trigger_cmd ::= select",
+ /* 246 */ "expr ::= RAISE LP IGNORE RP",
+ /* 247 */ "expr ::= RAISE LP raisetype COMMA nm RP",
+ /* 248 */ "raisetype ::= ROLLBACK",
+ /* 249 */ "raisetype ::= ABORT",
+ /* 250 */ "raisetype ::= FAIL",
+ /* 251 */ "cmd ::= DROP TRIGGER ifexists fullname",
+ /* 252 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
+ /* 253 */ "cmd ::= DETACH database_kw_opt expr",
+ /* 254 */ "key_opt ::=",
+ /* 255 */ "key_opt ::= KEY expr",
+ /* 256 */ "cmd ::= REINDEX",
+ /* 257 */ "cmd ::= REINDEX nm dbnm",
+ /* 258 */ "cmd ::= ANALYZE",
+ /* 259 */ "cmd ::= ANALYZE nm dbnm",
+ /* 260 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
+ /* 261 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist",
+ /* 262 */ "add_column_fullname ::= fullname",
+ /* 263 */ "cmd ::= create_vtab",
+ /* 264 */ "cmd ::= create_vtab LP vtabarglist RP",
+ /* 265 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm",
+ /* 266 */ "vtabarg ::=",
+ /* 267 */ "vtabargtoken ::= ANY",
+ /* 268 */ "vtabargtoken ::= lp anylist RP",
+ /* 269 */ "lp ::= LP",
+ /* 270 */ "with ::=",
+ /* 271 */ "with ::= WITH wqlist",
+ /* 272 */ "with ::= WITH RECURSIVE wqlist",
+ /* 273 */ "wqlist ::= nm eidlist_opt AS LP select RP",
+ /* 274 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP",
+ /* 275 */ "input ::= ecmd",
  /* 276 */ "explain ::=",
  /* 277 */ "cmdx ::= cmd",
  /* 278 */ "trans_opt ::=",
@@ -1563,7 +1563,7 @@ static void yy_destructor(
     case 194: /* oneselect */
     case 205: /* values */
 {
-#line 394 "parse.y"
+#line 396 "parse.y"
 sqlite3SelectDelete(pParse->db, (yypminor->yy159));
 #line 1569 "parse.c"
 }
@@ -1571,7 +1571,7 @@ sqlite3SelectDelete(pParse->db, (yypminor->yy159));
     case 171: /* term */
     case 172: /* expr */
 {
-#line 827 "parse.y"
+#line 829 "parse.y"
 sqlite3ExprDelete(pParse->db, (yypminor->yy342).pExpr);
 #line 1577 "parse.c"
 }
@@ -1589,7 +1589,7 @@ sqlite3ExprDelete(pParse->db, (yypminor->yy342).pExpr);
     case 223: /* paren_exprlist */
     case 225: /* case_exprlist */
 {
-#line 1275 "parse.y"
+#line 1277 "parse.y"
 sqlite3ExprListDelete(pParse->db, (yypminor->yy442));
 #line 1595 "parse.c"
 }
@@ -1599,7 +1599,7 @@ sqlite3ExprListDelete(pParse->db, (yypminor->yy442));
     case 210: /* seltablist */
     case 211: /* stl_prefix */
 {
-#line 626 "parse.y"
+#line 628 "parse.y"
 sqlite3SrcListDelete(pParse->db, (yypminor->yy347));
 #line 1605 "parse.c"
 }
@@ -1607,7 +1607,7 @@ sqlite3SrcListDelete(pParse->db, (yypminor->yy347));
     case 195: /* with */
     case 249: /* wqlist */
 {
-#line 1552 "parse.y"
+#line 1554 "parse.y"
 sqlite3WithDelete(pParse->db, (yypminor->yy331));
 #line 1613 "parse.c"
 }
@@ -1620,7 +1620,7 @@ sqlite3WithDelete(pParse->db, (yypminor->yy331));
     case 235: /* when_clause */
     case 240: /* key_opt */
 {
-#line 744 "parse.y"
+#line 746 "parse.y"
 sqlite3ExprDelete(pParse->db, (yypminor->yy122));
 #line 1626 "parse.c"
 }
@@ -1629,7 +1629,7 @@ sqlite3ExprDelete(pParse->db, (yypminor->yy122));
     case 216: /* idlist */
     case 219: /* idlist_opt */
 {
-#line 660 "parse.y"
+#line 662 "parse.y"
 sqlite3IdListDelete(pParse->db, (yypminor->yy180));
 #line 1635 "parse.c"
 }
@@ -1637,14 +1637,14 @@ sqlite3IdListDelete(pParse->db, (yypminor->yy180));
     case 231: /* trigger_cmd_list */
     case 236: /* trigger_cmd */
 {
-#line 1389 "parse.y"
+#line 1391 "parse.y"
 sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy327));
 #line 1643 "parse.c"
 }
       break;
     case 233: /* trigger_event */
 {
-#line 1375 "parse.y"
+#line 1377 "parse.y"
 sqlite3IdListDelete(pParse->db, (yypminor->yy410).b);
 #line 1650 "parse.c"
 }
@@ -1893,7 +1893,8 @@ 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[] = {
-  { 144, 1 },
+  { 145, 3 },
+  { 145, 1 },
   { 146, 1 },
   { 146, 3 },
   { 148, 3 },
@@ -2167,8 +2168,7 @@ static const struct {
   { 195, 3 },
   { 249, 6 },
   { 249, 8 },
-  { 145, 1 },
-  { 145, 3 },
+  { 144, 1 },
   { 146, 0 },
   { 147, 1 },
   { 150, 0 },
@@ -2284,123 +2284,130 @@ static void yy_reduce(
   */
 /********** Begin reduce actions **********************************************/
         YYMINORTYPE yylhsminor;
-      case 0: /* input ::= ecmd */
-#line 106 "parse.y"
+      case 0: /* ecmd ::= explain cmdx SEMI */
+#line 107 "parse.y"
 { sqlite3FinishCoding(pParse); }
 #line 2291 "parse.c"
         break;
-      case 1: /* explain ::= EXPLAIN */
-#line 111 "parse.y"
+      case 1: /* ecmd ::= SEMI */
+#line 108 "parse.y"
+{
+  sqlite3ErrorMsg(pParse, "syntax error: empty request");
+}
+#line 2298 "parse.c"
+        break;
+      case 2: /* explain ::= EXPLAIN */
+#line 113 "parse.y"
 { pParse->explain = 1; }
-#line 2296 "parse.c"
+#line 2303 "parse.c"
         break;
-      case 2: /* explain ::= EXPLAIN QUERY PLAN */
-#line 112 "parse.y"
+      case 3: /* explain ::= EXPLAIN QUERY PLAN */
+#line 114 "parse.y"
 { pParse->explain = 2; }
-#line 2301 "parse.c"
+#line 2308 "parse.c"
         break;
-      case 3: /* cmd ::= BEGIN transtype trans_opt */
-#line 119 "parse.y"
+      case 4: /* cmd ::= BEGIN transtype trans_opt */
+#line 121 "parse.y"
 {sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy392);}
-#line 2306 "parse.c"
+#line 2313 "parse.c"
         break;
-      case 4: /* transtype ::= */
-#line 124 "parse.y"
+      case 5: /* transtype ::= */
+#line 126 "parse.y"
 {yymsp[1].minor.yy392 = TK_DEFERRED;}
-#line 2311 "parse.c"
+#line 2318 "parse.c"
         break;
-      case 5: /* transtype ::= DEFERRED */
-      case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6);
-      case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7);
-#line 125 "parse.y"
+      case 6: /* transtype ::= DEFERRED */
+      case 7: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==7);
+      case 8: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==8);
+#line 127 "parse.y"
 {yymsp[0].minor.yy392 = yymsp[0].major; /*A-overwrites-X*/}
-#line 2318 "parse.c"
+#line 2325 "parse.c"
         break;
-      case 8: /* cmd ::= COMMIT trans_opt */
-      case 9: /* cmd ::= END trans_opt */ yytestcase(yyruleno==9);
-#line 128 "parse.y"
+      case 9: /* cmd ::= COMMIT trans_opt */
+      case 10: /* cmd ::= END trans_opt */ yytestcase(yyruleno==10);
+#line 130 "parse.y"
 {sqlite3CommitTransaction(pParse);}
-#line 2324 "parse.c"
+#line 2331 "parse.c"
         break;
-      case 10: /* cmd ::= ROLLBACK trans_opt */
-#line 130 "parse.y"
+      case 11: /* cmd ::= ROLLBACK trans_opt */
+#line 132 "parse.y"
 {sqlite3RollbackTransaction(pParse);}
-#line 2329 "parse.c"
+#line 2336 "parse.c"
         break;
-      case 11: /* cmd ::= SAVEPOINT nm */
-#line 134 "parse.y"
+      case 12: /* cmd ::= SAVEPOINT nm */
+#line 136 "parse.y"
 {
   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &yymsp[0].minor.yy0);
 }
-#line 2336 "parse.c"
+#line 2343 "parse.c"
         break;
-      case 12: /* cmd ::= RELEASE savepoint_opt nm */
-#line 137 "parse.y"
+      case 13: /* cmd ::= RELEASE savepoint_opt nm */
+#line 139 "parse.y"
 {
   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &yymsp[0].minor.yy0);
 }
-#line 2343 "parse.c"
+#line 2350 "parse.c"
         break;
-      case 13: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */
-#line 140 "parse.y"
+      case 14: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */
+#line 142 "parse.y"
 {
   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &yymsp[0].minor.yy0);
 }
-#line 2350 "parse.c"
+#line 2357 "parse.c"
         break;
-      case 14: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */
-#line 147 "parse.y"
+      case 15: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */
+#line 149 "parse.y"
 {
    sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy392,0,0,yymsp[-2].minor.yy392);
 }
-#line 2357 "parse.c"
+#line 2364 "parse.c"
         break;
-      case 15: /* createkw ::= CREATE */
-#line 150 "parse.y"
+      case 16: /* createkw ::= CREATE */
+#line 152 "parse.y"
 {disableLookaside(pParse);}
-#line 2362 "parse.c"
-        break;
-      case 16: /* ifnotexists ::= */
-      case 19: /* temp ::= */ yytestcase(yyruleno==19);
-      case 22: /* table_options ::= */ yytestcase(yyruleno==22);
-      case 42: /* autoinc ::= */ yytestcase(yyruleno==42);
-      case 57: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==57);
-      case 67: /* defer_subclause_opt ::= */ yytestcase(yyruleno==67);
-      case 76: /* ifexists ::= */ yytestcase(yyruleno==76);
-      case 90: /* distinct ::= */ yytestcase(yyruleno==90);
-      case 215: /* collate ::= */ yytestcase(yyruleno==215);
-#line 153 "parse.y"
+#line 2369 "parse.c"
+        break;
+      case 17: /* ifnotexists ::= */
+      case 20: /* temp ::= */ yytestcase(yyruleno==20);
+      case 23: /* table_options ::= */ yytestcase(yyruleno==23);
+      case 43: /* autoinc ::= */ yytestcase(yyruleno==43);
+      case 58: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==58);
+      case 68: /* defer_subclause_opt ::= */ yytestcase(yyruleno==68);
+      case 77: /* ifexists ::= */ yytestcase(yyruleno==77);
+      case 91: /* distinct ::= */ yytestcase(yyruleno==91);
+      case 216: /* collate ::= */ yytestcase(yyruleno==216);
+#line 155 "parse.y"
 {yymsp[1].minor.yy392 = 0;}
-#line 2375 "parse.c"
+#line 2382 "parse.c"
         break;
-      case 17: /* ifnotexists ::= IF NOT EXISTS */
-#line 154 "parse.y"
+      case 18: /* ifnotexists ::= IF NOT EXISTS */
+#line 156 "parse.y"
 {yymsp[-2].minor.yy392 = 1;}
-#line 2380 "parse.c"
+#line 2387 "parse.c"
         break;
-      case 18: /* temp ::= TEMP */
-      case 43: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==43);
-#line 157 "parse.y"
+      case 19: /* temp ::= TEMP */
+      case 44: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==44);
+#line 159 "parse.y"
 {yymsp[0].minor.yy392 = 1;}
-#line 2386 "parse.c"
+#line 2393 "parse.c"
         break;
-      case 20: /* create_table_args ::= LP columnlist conslist_opt RP table_options */
-#line 160 "parse.y"
+      case 21: /* create_table_args ::= LP columnlist conslist_opt RP table_options */
+#line 162 "parse.y"
 {
   sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy392,0);
 }
-#line 2393 "parse.c"
+#line 2400 "parse.c"
         break;
-      case 21: /* create_table_args ::= AS select */
-#line 163 "parse.y"
+      case 22: /* create_table_args ::= AS select */
+#line 165 "parse.y"
 {
   sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy159);
   sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy159);
 }
-#line 2401 "parse.c"
+#line 2408 "parse.c"
         break;
-      case 23: /* table_options ::= WITHOUT nm */
-#line 169 "parse.y"
+      case 24: /* table_options ::= WITHOUT nm */
+#line 171 "parse.y"
 {
   if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){
     yymsp[-1].minor.yy392 = TF_WithoutRowid | TF_NoVisibleRowid;
@@ -2409,58 +2416,58 @@ static void yy_reduce(
     sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z);
   }
 }
-#line 2413 "parse.c"
+#line 2420 "parse.c"
         break;
-      case 24: /* columnname ::= nm typetoken */
-#line 179 "parse.y"
+      case 25: /* columnname ::= nm typetoken */
+#line 181 "parse.y"
 {sqlite3AddColumn(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
-#line 2418 "parse.c"
-        break;
-      case 25: /* typetoken ::= */
-      case 60: /* conslist_opt ::= */ yytestcase(yyruleno==60);
-      case 96: /* as ::= */ yytestcase(yyruleno==96);
-#line 244 "parse.y"
-{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;}
 #line 2425 "parse.c"
         break;
-      case 26: /* typetoken ::= typename LP signed RP */
+      case 26: /* typetoken ::= */
+      case 61: /* conslist_opt ::= */ yytestcase(yyruleno==61);
+      case 97: /* as ::= */ yytestcase(yyruleno==97);
 #line 246 "parse.y"
+{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;}
+#line 2432 "parse.c"
+        break;
+      case 27: /* typetoken ::= typename LP signed RP */
+#line 248 "parse.y"
 {
   yymsp[-3].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z);
 }
-#line 2432 "parse.c"
+#line 2439 "parse.c"
         break;
-      case 27: /* typetoken ::= typename LP signed COMMA signed RP */
-#line 249 "parse.y"
+      case 28: /* typetoken ::= typename LP signed COMMA signed RP */
+#line 251 "parse.y"
 {
   yymsp[-5].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z);
 }
-#line 2439 "parse.c"
+#line 2446 "parse.c"
         break;
-      case 28: /* typename ::= typename ID|STRING */
-#line 254 "parse.y"
+      case 29: /* typename ::= typename ID|STRING */
+#line 256 "parse.y"
 {yymsp[-1].minor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);}
-#line 2444 "parse.c"
+#line 2451 "parse.c"
         break;
-      case 29: /* ccons ::= CONSTRAINT nm */
-      case 62: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==62);
-#line 263 "parse.y"
+      case 30: /* ccons ::= CONSTRAINT nm */
+      case 63: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==63);
+#line 265 "parse.y"
 {pParse->constraintName = yymsp[0].minor.yy0;}
-#line 2450 "parse.c"
+#line 2457 "parse.c"
         break;
-      case 30: /* ccons ::= DEFAULT term */
-      case 32: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==32);
-#line 264 "parse.y"
+      case 31: /* ccons ::= DEFAULT term */
+      case 33: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==33);
+#line 266 "parse.y"
 {sqlite3AddDefaultValue(pParse,&yymsp[0].minor.yy342);}
-#line 2456 "parse.c"
+#line 2463 "parse.c"
         break;
-      case 31: /* ccons ::= DEFAULT LP expr RP */
-#line 265 "parse.y"
+      case 32: /* ccons ::= DEFAULT LP expr RP */
+#line 267 "parse.y"
 {sqlite3AddDefaultValue(pParse,&yymsp[-1].minor.yy342);}
-#line 2461 "parse.c"
+#line 2468 "parse.c"
         break;
-      case 33: /* ccons ::= DEFAULT MINUS term */
-#line 267 "parse.y"
+      case 34: /* ccons ::= DEFAULT MINUS term */
+#line 269 "parse.y"
 {
   ExprSpan v;
   v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy342.pExpr, 0);
@@ -2468,217 +2475,217 @@ static void yy_reduce(
   v.zEnd = yymsp[0].minor.yy342.zEnd;
   sqlite3AddDefaultValue(pParse,&v);
 }
-#line 2472 "parse.c"
+#line 2479 "parse.c"
         break;
-      case 34: /* ccons ::= DEFAULT ID|INDEXED */
-#line 274 "parse.y"
+      case 35: /* ccons ::= DEFAULT ID|INDEXED */
+#line 276 "parse.y"
 {
   ExprSpan v;
   spanExpr(&v, pParse, TK_STRING, yymsp[0].minor.yy0);
   sqlite3AddDefaultValue(pParse,&v);
 }
-#line 2481 "parse.c"
+#line 2488 "parse.c"
         break;
-      case 35: /* ccons ::= NOT NULL onconf */
-#line 284 "parse.y"
+      case 36: /* ccons ::= NOT NULL onconf */
+#line 286 "parse.y"
 {sqlite3AddNotNull(pParse, yymsp[0].minor.yy392);}
-#line 2486 "parse.c"
+#line 2493 "parse.c"
         break;
-      case 36: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
-#line 286 "parse.y"
+      case 37: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
+#line 288 "parse.y"
 {sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy392,yymsp[0].minor.yy392,yymsp[-2].minor.yy392);}
-#line 2491 "parse.c"
+#line 2498 "parse.c"
         break;
-      case 37: /* ccons ::= UNIQUE onconf */
-#line 287 "parse.y"
+      case 38: /* ccons ::= UNIQUE onconf */
+#line 289 "parse.y"
 {sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy392,0,0,0,0,
                                    SQLITE_IDXTYPE_UNIQUE);}
-#line 2497 "parse.c"
+#line 2504 "parse.c"
         break;
-      case 38: /* ccons ::= CHECK LP expr RP */
-#line 289 "parse.y"
+      case 39: /* ccons ::= CHECK LP expr RP */
+#line 291 "parse.y"
 {sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy342.pExpr);}
-#line 2502 "parse.c"
+#line 2509 "parse.c"
         break;
-      case 39: /* ccons ::= REFERENCES nm eidlist_opt refargs */
-#line 291 "parse.y"
+      case 40: /* ccons ::= REFERENCES nm eidlist_opt refargs */
+#line 293 "parse.y"
 {sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy442,yymsp[0].minor.yy392);}
-#line 2507 "parse.c"
+#line 2514 "parse.c"
         break;
-      case 40: /* ccons ::= defer_subclause */
-#line 292 "parse.y"
+      case 41: /* ccons ::= defer_subclause */
+#line 294 "parse.y"
 {sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy392);}
-#line 2512 "parse.c"
+#line 2519 "parse.c"
         break;
-      case 41: /* ccons ::= COLLATE ID|STRING */
-#line 293 "parse.y"
+      case 42: /* ccons ::= COLLATE ID|STRING */
+#line 295 "parse.y"
 {sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);}
-#line 2517 "parse.c"
+#line 2524 "parse.c"
         break;
-      case 44: /* refargs ::= */
-#line 306 "parse.y"
+      case 45: /* refargs ::= */
+#line 308 "parse.y"
 { yymsp[1].minor.yy392 = OE_None*0x0101; /* EV: R-19803-45884 */}
-#line 2522 "parse.c"
+#line 2529 "parse.c"
         break;
-      case 45: /* refargs ::= refargs refarg */
-#line 307 "parse.y"
+      case 46: /* refargs ::= refargs refarg */
+#line 309 "parse.y"
 { yymsp[-1].minor.yy392 = (yymsp[-1].minor.yy392 & ~yymsp[0].minor.yy207.mask) | yymsp[0].minor.yy207.value; }
-#line 2527 "parse.c"
+#line 2534 "parse.c"
         break;
-      case 46: /* refarg ::= MATCH nm */
-#line 309 "parse.y"
+      case 47: /* refarg ::= MATCH nm */
+#line 311 "parse.y"
 { yymsp[-1].minor.yy207.value = 0;     yymsp[-1].minor.yy207.mask = 0x000000; }
-#line 2532 "parse.c"
+#line 2539 "parse.c"
         break;
-      case 47: /* refarg ::= ON INSERT refact */
-#line 310 "parse.y"
+      case 48: /* refarg ::= ON INSERT refact */
+#line 312 "parse.y"
 { yymsp[-2].minor.yy207.value = 0;     yymsp[-2].minor.yy207.mask = 0x000000; }
-#line 2537 "parse.c"
+#line 2544 "parse.c"
         break;
-      case 48: /* refarg ::= ON DELETE refact */
-#line 311 "parse.y"
+      case 49: /* refarg ::= ON DELETE refact */
+#line 313 "parse.y"
 { yymsp[-2].minor.yy207.value = yymsp[0].minor.yy392;     yymsp[-2].minor.yy207.mask = 0x0000ff; }
-#line 2542 "parse.c"
+#line 2549 "parse.c"
         break;
-      case 49: /* refarg ::= ON UPDATE refact */
-#line 312 "parse.y"
+      case 50: /* refarg ::= ON UPDATE refact */
+#line 314 "parse.y"
 { yymsp[-2].minor.yy207.value = yymsp[0].minor.yy392<<8;  yymsp[-2].minor.yy207.mask = 0x00ff00; }
-#line 2547 "parse.c"
+#line 2554 "parse.c"
         break;
-      case 50: /* refact ::= SET NULL */
-#line 314 "parse.y"
+      case 51: /* refact ::= SET NULL */
+#line 316 "parse.y"
 { yymsp[-1].minor.yy392 = OE_SetNull;  /* EV: R-33326-45252 */}
-#line 2552 "parse.c"
+#line 2559 "parse.c"
         break;
-      case 51: /* refact ::= SET DEFAULT */
-#line 315 "parse.y"
+      case 52: /* refact ::= SET DEFAULT */
+#line 317 "parse.y"
 { yymsp[-1].minor.yy392 = OE_SetDflt;  /* EV: R-33326-45252 */}
-#line 2557 "parse.c"
+#line 2564 "parse.c"
         break;
-      case 52: /* refact ::= CASCADE */
-#line 316 "parse.y"
+      case 53: /* refact ::= CASCADE */
+#line 318 "parse.y"
 { yymsp[0].minor.yy392 = OE_Cascade;  /* EV: R-33326-45252 */}
-#line 2562 "parse.c"
+#line 2569 "parse.c"
         break;
-      case 53: /* refact ::= RESTRICT */
-#line 317 "parse.y"
+      case 54: /* refact ::= RESTRICT */
+#line 319 "parse.y"
 { yymsp[0].minor.yy392 = OE_Restrict; /* EV: R-33326-45252 */}
-#line 2567 "parse.c"
+#line 2574 "parse.c"
         break;
-      case 54: /* refact ::= NO ACTION */
-#line 318 "parse.y"
+      case 55: /* refact ::= NO ACTION */
+#line 320 "parse.y"
 { yymsp[-1].minor.yy392 = OE_None;     /* EV: R-33326-45252 */}
-#line 2572 "parse.c"
+#line 2579 "parse.c"
         break;
-      case 55: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
-#line 320 "parse.y"
+      case 56: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
+#line 322 "parse.y"
 {yymsp[-2].minor.yy392 = 0;}
-#line 2577 "parse.c"
-        break;
-      case 56: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
-      case 71: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==71);
-      case 144: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==144);
-#line 321 "parse.y"
-{yymsp[-1].minor.yy392 = yymsp[0].minor.yy392;}
 #line 2584 "parse.c"
         break;
-      case 58: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
-      case 75: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==75);
-      case 187: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==187);
-      case 190: /* in_op ::= NOT IN */ yytestcase(yyruleno==190);
-      case 216: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==216);
-#line 324 "parse.y"
+      case 57: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
+      case 72: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==72);
+      case 145: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==145);
+#line 323 "parse.y"
+{yymsp[-1].minor.yy392 = yymsp[0].minor.yy392;}
+#line 2591 "parse.c"
+        break;
+      case 59: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
+      case 76: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==76);
+      case 188: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==188);
+      case 191: /* in_op ::= NOT IN */ yytestcase(yyruleno==191);
+      case 217: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==217);
+#line 326 "parse.y"
 {yymsp[-1].minor.yy392 = 1;}
-#line 2593 "parse.c"
+#line 2600 "parse.c"
         break;
-      case 59: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
-#line 325 "parse.y"
+      case 60: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
+#line 327 "parse.y"
 {yymsp[-1].minor.yy392 = 0;}
-#line 2598 "parse.c"
+#line 2605 "parse.c"
         break;
-      case 61: /* tconscomma ::= COMMA */
-#line 331 "parse.y"
+      case 62: /* tconscomma ::= COMMA */
+#line 333 "parse.y"
 {pParse->constraintName.n = 0;}
-#line 2603 "parse.c"
+#line 2610 "parse.c"
         break;
-      case 63: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
-#line 335 "parse.y"
+      case 64: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
+#line 337 "parse.y"
 {sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy442,yymsp[0].minor.yy392,yymsp[-2].minor.yy392,0);}
-#line 2608 "parse.c"
+#line 2615 "parse.c"
         break;
-      case 64: /* tcons ::= UNIQUE LP sortlist RP onconf */
-#line 337 "parse.y"
+      case 65: /* tcons ::= UNIQUE LP sortlist RP onconf */
+#line 339 "parse.y"
 {sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy442,yymsp[0].minor.yy392,0,0,0,0,
                                        SQLITE_IDXTYPE_UNIQUE);}
-#line 2614 "parse.c"
+#line 2621 "parse.c"
         break;
-      case 65: /* tcons ::= CHECK LP expr RP onconf */
-#line 340 "parse.y"
+      case 66: /* tcons ::= CHECK LP expr RP onconf */
+#line 342 "parse.y"
 {sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy342.pExpr);}
-#line 2619 "parse.c"
+#line 2626 "parse.c"
         break;
-      case 66: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
-#line 342 "parse.y"
+      case 67: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
+#line 344 "parse.y"
 {
     sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy442, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy442, yymsp[-1].minor.yy392);
     sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy392);
 }
-#line 2627 "parse.c"
+#line 2634 "parse.c"
         break;
-      case 68: /* onconf ::= */
-      case 70: /* orconf ::= */ yytestcase(yyruleno==70);
-#line 356 "parse.y"
+      case 69: /* onconf ::= */
+      case 71: /* orconf ::= */ yytestcase(yyruleno==71);
+#line 358 "parse.y"
 {yymsp[1].minor.yy392 = OE_Default;}
-#line 2633 "parse.c"
+#line 2640 "parse.c"
         break;
-      case 69: /* onconf ::= ON CONFLICT resolvetype */
-#line 357 "parse.y"
+      case 70: /* onconf ::= ON CONFLICT resolvetype */
+#line 359 "parse.y"
 {yymsp[-2].minor.yy392 = yymsp[0].minor.yy392;}
-#line 2638 "parse.c"
+#line 2645 "parse.c"
         break;
-      case 72: /* resolvetype ::= IGNORE */
-#line 361 "parse.y"
+      case 73: /* resolvetype ::= IGNORE */
+#line 363 "parse.y"
 {yymsp[0].minor.yy392 = OE_Ignore;}
-#line 2643 "parse.c"
+#line 2650 "parse.c"
         break;
-      case 73: /* resolvetype ::= REPLACE */
-      case 145: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==145);
-#line 362 "parse.y"
+      case 74: /* resolvetype ::= REPLACE */
+      case 146: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==146);
+#line 364 "parse.y"
 {yymsp[0].minor.yy392 = OE_Replace;}
-#line 2649 "parse.c"
+#line 2656 "parse.c"
         break;
-      case 74: /* cmd ::= DROP TABLE ifexists fullname */
-#line 366 "parse.y"
+      case 75: /* cmd ::= DROP TABLE ifexists fullname */
+#line 368 "parse.y"
 {
   sqlite3DropTable(pParse, yymsp[0].minor.yy347, 0, yymsp[-1].minor.yy392);
 }
-#line 2656 "parse.c"
+#line 2663 "parse.c"
         break;
-      case 77: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
-#line 377 "parse.y"
+      case 78: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
+#line 379 "parse.y"
 {
   sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy442, yymsp[0].minor.yy159, yymsp[-7].minor.yy392, yymsp[-5].minor.yy392);
 }
-#line 2663 "parse.c"
+#line 2670 "parse.c"
         break;
-      case 78: /* cmd ::= DROP VIEW ifexists fullname */
-#line 380 "parse.y"
+      case 79: /* cmd ::= DROP VIEW ifexists fullname */
+#line 382 "parse.y"
 {
   sqlite3DropTable(pParse, yymsp[0].minor.yy347, 1, yymsp[-1].minor.yy392);
 }
-#line 2670 "parse.c"
+#line 2677 "parse.c"
         break;
-      case 79: /* cmd ::= select */
-#line 387 "parse.y"
+      case 80: /* cmd ::= select */
+#line 389 "parse.y"
 {
   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
   sqlite3Select(pParse, yymsp[0].minor.yy159, &dest);
   sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy159);
 }
-#line 2679 "parse.c"
+#line 2686 "parse.c"
         break;
-      case 80: /* select ::= with selectnowith */
-#line 424 "parse.y"
+      case 81: /* select ::= with selectnowith */
+#line 426 "parse.y"
 {
   Select *p = yymsp[0].minor.yy159;
   if( p ){
@@ -2689,10 +2696,10 @@ static void yy_reduce(
   }
   yymsp[-1].minor.yy159 = p; /*A-overwrites-W*/
 }
-#line 2693 "parse.c"
+#line 2700 "parse.c"
         break;
-      case 81: /* selectnowith ::= selectnowith multiselect_op oneselect */
-#line 437 "parse.y"
+      case 82: /* selectnowith ::= selectnowith multiselect_op oneselect */
+#line 439 "parse.y"
 {
   Select *pRhs = yymsp[0].minor.yy159;
   Select *pLhs = yymsp[-2].minor.yy159;
@@ -2715,21 +2722,21 @@ static void yy_reduce(
   }
   yymsp[-2].minor.yy159 = pRhs;
 }
-#line 2719 "parse.c"
+#line 2726 "parse.c"
         break;
-      case 82: /* multiselect_op ::= UNION */
-      case 84: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==84);
-#line 460 "parse.y"
+      case 83: /* multiselect_op ::= UNION */
+      case 85: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==85);
+#line 462 "parse.y"
 {yymsp[0].minor.yy392 = yymsp[0].major; /*A-overwrites-OP*/}
-#line 2725 "parse.c"
+#line 2732 "parse.c"
         break;
-      case 83: /* multiselect_op ::= UNION ALL */
-#line 461 "parse.y"
+      case 84: /* multiselect_op ::= UNION ALL */
+#line 463 "parse.y"
 {yymsp[-1].minor.yy392 = TK_ALL;}
-#line 2730 "parse.c"
+#line 2737 "parse.c"
         break;
-      case 85: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
-#line 465 "parse.y"
+      case 86: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+#line 467 "parse.y"
 {
 #if SELECTTRACE_ENABLED
   Token s = yymsp[-8].minor.yy0; /*A-overwrites-S*/
@@ -2760,17 +2767,17 @@ static void yy_reduce(
   }
 #endif /* SELECTRACE_ENABLED */
 }
-#line 2764 "parse.c"
+#line 2771 "parse.c"
         break;
-      case 86: /* values ::= VALUES LP nexprlist RP */
-#line 499 "parse.y"
+      case 87: /* values ::= VALUES LP nexprlist RP */
+#line 501 "parse.y"
 {
   yymsp[-3].minor.yy159 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy442,0,0,0,0,0,SF_Values,0,0);
 }
-#line 2771 "parse.c"
+#line 2778 "parse.c"
         break;
-      case 87: /* values ::= values COMMA LP exprlist RP */
-#line 502 "parse.y"
+      case 88: /* values ::= values COMMA LP exprlist RP */
+#line 504 "parse.y"
 {
   Select *pRight, *pLeft = yymsp[-4].minor.yy159;
   pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy442,0,0,0,0,0,SF_Values|SF_MultiValue,0,0);
@@ -2783,113 +2790,113 @@ static void yy_reduce(
     yymsp[-4].minor.yy159 = pLeft;
   }
 }
-#line 2787 "parse.c"
+#line 2794 "parse.c"
         break;
-      case 88: /* distinct ::= DISTINCT */
-#line 519 "parse.y"
+      case 89: /* distinct ::= DISTINCT */
+#line 521 "parse.y"
 {yymsp[0].minor.yy392 = SF_Distinct;}
-#line 2792 "parse.c"
+#line 2799 "parse.c"
         break;
-      case 89: /* distinct ::= ALL */
-#line 520 "parse.y"
+      case 90: /* distinct ::= ALL */
+#line 522 "parse.y"
 {yymsp[0].minor.yy392 = SF_All;}
-#line 2797 "parse.c"
-        break;
-      case 91: /* sclp ::= */
-      case 119: /* orderby_opt ::= */ yytestcase(yyruleno==119);
-      case 126: /* groupby_opt ::= */ yytestcase(yyruleno==126);
-      case 203: /* exprlist ::= */ yytestcase(yyruleno==203);
-      case 206: /* paren_exprlist ::= */ yytestcase(yyruleno==206);
-      case 211: /* eidlist_opt ::= */ yytestcase(yyruleno==211);
-#line 533 "parse.y"
+#line 2804 "parse.c"
+        break;
+      case 92: /* sclp ::= */
+      case 120: /* orderby_opt ::= */ yytestcase(yyruleno==120);
+      case 127: /* groupby_opt ::= */ yytestcase(yyruleno==127);
+      case 204: /* exprlist ::= */ yytestcase(yyruleno==204);
+      case 207: /* paren_exprlist ::= */ yytestcase(yyruleno==207);
+      case 212: /* eidlist_opt ::= */ yytestcase(yyruleno==212);
+#line 535 "parse.y"
 {yymsp[1].minor.yy442 = 0;}
-#line 2807 "parse.c"
+#line 2814 "parse.c"
         break;
-      case 92: /* selcollist ::= sclp expr as */
-#line 534 "parse.y"
+      case 93: /* selcollist ::= sclp expr as */
+#line 536 "parse.y"
 {
    yymsp[-2].minor.yy442 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy442, yymsp[-1].minor.yy342.pExpr);
    if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-2].minor.yy442, &yymsp[0].minor.yy0, 1);
    sqlite3ExprListSetSpan(pParse,yymsp[-2].minor.yy442,&yymsp[-1].minor.yy342);
 }
-#line 2816 "parse.c"
+#line 2823 "parse.c"
         break;
-      case 93: /* selcollist ::= sclp STAR */
-#line 539 "parse.y"
+      case 94: /* selcollist ::= sclp STAR */
+#line 541 "parse.y"
 {
   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
   yymsp[-1].minor.yy442 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy442, p);
 }
-#line 2824 "parse.c"
+#line 2831 "parse.c"
         break;
-      case 94: /* selcollist ::= sclp nm DOT STAR */
-#line 543 "parse.y"
+      case 95: /* selcollist ::= sclp nm DOT STAR */
+#line 545 "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.yy442 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy442, pDot);
 }
-#line 2834 "parse.c"
+#line 2841 "parse.c"
         break;
-      case 95: /* as ::= AS nm */
-      case 106: /* dbnm ::= DOT nm */ yytestcase(yyruleno==106);
-      case 223: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==223);
-      case 224: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==224);
-#line 554 "parse.y"
+      case 96: /* as ::= AS nm */
+      case 107: /* dbnm ::= DOT nm */ yytestcase(yyruleno==107);
+      case 224: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==224);
+      case 225: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==225);
+#line 556 "parse.y"
 {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;}
-#line 2842 "parse.c"
+#line 2849 "parse.c"
         break;
-      case 97: /* from ::= */
-#line 568 "parse.y"
+      case 98: /* from ::= */
+#line 570 "parse.y"
 {yymsp[1].minor.yy347 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy347));}
-#line 2847 "parse.c"
+#line 2854 "parse.c"
         break;
-      case 98: /* from ::= FROM seltablist */
-#line 569 "parse.y"
+      case 99: /* from ::= FROM seltablist */
+#line 571 "parse.y"
 {
   yymsp[-1].minor.yy347 = yymsp[0].minor.yy347;
   sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy347);
 }
-#line 2855 "parse.c"
+#line 2862 "parse.c"
         break;
-      case 99: /* stl_prefix ::= seltablist joinop */
-#line 577 "parse.y"
+      case 100: /* stl_prefix ::= seltablist joinop */
+#line 579 "parse.y"
 {
    if( ALWAYS(yymsp[-1].minor.yy347 && yymsp[-1].minor.yy347->nSrc>0) ) yymsp[-1].minor.yy347->a[yymsp[-1].minor.yy347->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy392;
 }
-#line 2862 "parse.c"
+#line 2869 "parse.c"
         break;
-      case 100: /* stl_prefix ::= */
-#line 580 "parse.y"
+      case 101: /* stl_prefix ::= */
+#line 582 "parse.y"
 {yymsp[1].minor.yy347 = 0;}
-#line 2867 "parse.c"
+#line 2874 "parse.c"
         break;
-      case 101: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
-#line 582 "parse.y"
+      case 102: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
+#line 584 "parse.y"
 {
   yymsp[-6].minor.yy347 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy347,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy122,yymsp[0].minor.yy180);
   sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy347, &yymsp[-2].minor.yy0);
 }
-#line 2875 "parse.c"
+#line 2882 "parse.c"
         break;
-      case 102: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
-#line 587 "parse.y"
+      case 103: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
+#line 589 "parse.y"
 {
   yymsp[-8].minor.yy347 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy347,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy122,yymsp[0].minor.yy180);
   sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy347, yymsp[-4].minor.yy442);
 }
-#line 2883 "parse.c"
+#line 2890 "parse.c"
         break;
-      case 103: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
-#line 593 "parse.y"
+      case 104: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
+#line 595 "parse.y"
 {
     yymsp[-6].minor.yy347 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy347,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy159,yymsp[-1].minor.yy122,yymsp[0].minor.yy180);
   }
-#line 2890 "parse.c"
+#line 2897 "parse.c"
         break;
-      case 104: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
-#line 597 "parse.y"
+      case 105: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
+#line 599 "parse.y"
 {
     if( yymsp[-6].minor.yy347==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy122==0 && yymsp[0].minor.yy180==0 ){
       yymsp[-6].minor.yy347 = yymsp[-4].minor.yy347;
@@ -2912,146 +2919,146 @@ static void yy_reduce(
       yymsp[-6].minor.yy347 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy347,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy122,yymsp[0].minor.yy180);
     }
   }
-#line 2916 "parse.c"
+#line 2923 "parse.c"
         break;
-      case 105: /* dbnm ::= */
-      case 114: /* indexed_opt ::= */ yytestcase(yyruleno==114);
-#line 622 "parse.y"
+      case 106: /* dbnm ::= */
+      case 115: /* indexed_opt ::= */ yytestcase(yyruleno==115);
+#line 624 "parse.y"
 {yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;}
-#line 2922 "parse.c"
+#line 2929 "parse.c"
         break;
-      case 107: /* fullname ::= nm dbnm */
-#line 628 "parse.y"
+      case 108: /* fullname ::= nm dbnm */
+#line 630 "parse.y"
 {yymsp[-1].minor.yy347 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/}
-#line 2927 "parse.c"
+#line 2934 "parse.c"
         break;
-      case 108: /* joinop ::= COMMA|JOIN */
-#line 631 "parse.y"
+      case 109: /* joinop ::= COMMA|JOIN */
+#line 633 "parse.y"
 { yymsp[0].minor.yy392 = JT_INNER; }
-#line 2932 "parse.c"
+#line 2939 "parse.c"
         break;
-      case 109: /* joinop ::= JOIN_KW JOIN */
-#line 633 "parse.y"
+      case 110: /* joinop ::= JOIN_KW JOIN */
+#line 635 "parse.y"
 {yymsp[-1].minor.yy392 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0);  /*X-overwrites-A*/}
-#line 2937 "parse.c"
+#line 2944 "parse.c"
         break;
-      case 110: /* joinop ::= JOIN_KW nm JOIN */
-#line 635 "parse.y"
+      case 111: /* joinop ::= JOIN_KW nm JOIN */
+#line 637 "parse.y"
 {yymsp[-2].minor.yy392 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/}
-#line 2942 "parse.c"
+#line 2949 "parse.c"
         break;
-      case 111: /* joinop ::= JOIN_KW nm nm JOIN */
-#line 637 "parse.y"
+      case 112: /* joinop ::= JOIN_KW nm nm JOIN */
+#line 639 "parse.y"
 {yymsp[-3].minor.yy392 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/}
-#line 2947 "parse.c"
+#line 2954 "parse.c"
         break;
-      case 112: /* on_opt ::= ON expr */
-      case 129: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==129);
-      case 136: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==136);
-      case 199: /* case_else ::= ELSE expr */ yytestcase(yyruleno==199);
-#line 641 "parse.y"
+      case 113: /* on_opt ::= ON expr */
+      case 130: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==130);
+      case 137: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==137);
+      case 200: /* case_else ::= ELSE expr */ yytestcase(yyruleno==200);
+#line 643 "parse.y"
 {yymsp[-1].minor.yy122 = yymsp[0].minor.yy342.pExpr;}
-#line 2955 "parse.c"
-        break;
-      case 113: /* on_opt ::= */
-      case 128: /* having_opt ::= */ yytestcase(yyruleno==128);
-      case 135: /* where_opt ::= */ yytestcase(yyruleno==135);
-      case 200: /* case_else ::= */ yytestcase(yyruleno==200);
-      case 202: /* case_operand ::= */ yytestcase(yyruleno==202);
-#line 642 "parse.y"
+#line 2962 "parse.c"
+        break;
+      case 114: /* on_opt ::= */
+      case 129: /* having_opt ::= */ yytestcase(yyruleno==129);
+      case 136: /* where_opt ::= */ yytestcase(yyruleno==136);
+      case 201: /* case_else ::= */ yytestcase(yyruleno==201);
+      case 203: /* case_operand ::= */ yytestcase(yyruleno==203);
+#line 644 "parse.y"
 {yymsp[1].minor.yy122 = 0;}
-#line 2964 "parse.c"
+#line 2971 "parse.c"
         break;
-      case 115: /* indexed_opt ::= INDEXED BY nm */
-#line 656 "parse.y"
+      case 116: /* indexed_opt ::= INDEXED BY nm */
+#line 658 "parse.y"
 {yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;}
-#line 2969 "parse.c"
+#line 2976 "parse.c"
         break;
-      case 116: /* indexed_opt ::= NOT INDEXED */
-#line 657 "parse.y"
+      case 117: /* indexed_opt ::= NOT INDEXED */
+#line 659 "parse.y"
 {yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;}
-#line 2974 "parse.c"
+#line 2981 "parse.c"
         break;
-      case 117: /* using_opt ::= USING LP idlist RP */
-#line 661 "parse.y"
+      case 118: /* using_opt ::= USING LP idlist RP */
+#line 663 "parse.y"
 {yymsp[-3].minor.yy180 = yymsp[-1].minor.yy180;}
-#line 2979 "parse.c"
+#line 2986 "parse.c"
         break;
-      case 118: /* using_opt ::= */
-      case 146: /* idlist_opt ::= */ yytestcase(yyruleno==146);
-#line 662 "parse.y"
+      case 119: /* using_opt ::= */
+      case 147: /* idlist_opt ::= */ yytestcase(yyruleno==147);
+#line 664 "parse.y"
 {yymsp[1].minor.yy180 = 0;}
-#line 2985 "parse.c"
+#line 2992 "parse.c"
         break;
-      case 120: /* orderby_opt ::= ORDER BY sortlist */
-      case 127: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==127);
-#line 676 "parse.y"
+      case 121: /* orderby_opt ::= ORDER BY sortlist */
+      case 128: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==128);
+#line 678 "parse.y"
 {yymsp[-2].minor.yy442 = yymsp[0].minor.yy442;}
-#line 2991 "parse.c"
+#line 2998 "parse.c"
         break;
-      case 121: /* sortlist ::= sortlist COMMA expr sortorder */
-#line 677 "parse.y"
+      case 122: /* sortlist ::= sortlist COMMA expr sortorder */
+#line 679 "parse.y"
 {
   yymsp[-3].minor.yy442 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy442,yymsp[-1].minor.yy342.pExpr);
   sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy442,yymsp[0].minor.yy392);
 }
-#line 2999 "parse.c"
+#line 3006 "parse.c"
         break;
-      case 122: /* sortlist ::= expr sortorder */
-#line 681 "parse.y"
+      case 123: /* sortlist ::= expr sortorder */
+#line 683 "parse.y"
 {
   yymsp[-1].minor.yy442 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy342.pExpr); /*A-overwrites-Y*/
   sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy442,yymsp[0].minor.yy392);
 }
-#line 3007 "parse.c"
+#line 3014 "parse.c"
         break;
-      case 123: /* sortorder ::= ASC */
-#line 688 "parse.y"
+      case 124: /* sortorder ::= ASC */
+#line 690 "parse.y"
 {yymsp[0].minor.yy392 = SQLITE_SO_ASC;}
-#line 3012 "parse.c"
+#line 3019 "parse.c"
         break;
-      case 124: /* sortorder ::= DESC */
-#line 689 "parse.y"
+      case 125: /* sortorder ::= DESC */
+#line 691 "parse.y"
 {yymsp[0].minor.yy392 = SQLITE_SO_DESC;}
-#line 3017 "parse.c"
+#line 3024 "parse.c"
         break;
-      case 125: /* sortorder ::= */
-#line 690 "parse.y"
+      case 126: /* sortorder ::= */
+#line 692 "parse.y"
 {yymsp[1].minor.yy392 = SQLITE_SO_UNDEFINED;}
-#line 3022 "parse.c"
+#line 3029 "parse.c"
         break;
-      case 130: /* limit_opt ::= */
-#line 715 "parse.y"
+      case 131: /* limit_opt ::= */
+#line 717 "parse.y"
 {yymsp[1].minor.yy64.pLimit = 0; yymsp[1].minor.yy64.pOffset = 0;}
-#line 3027 "parse.c"
+#line 3034 "parse.c"
         break;
-      case 131: /* limit_opt ::= LIMIT expr */
-#line 716 "parse.y"
+      case 132: /* limit_opt ::= LIMIT expr */
+#line 718 "parse.y"
 {yymsp[-1].minor.yy64.pLimit = yymsp[0].minor.yy342.pExpr; yymsp[-1].minor.yy64.pOffset = 0;}
-#line 3032 "parse.c"
+#line 3039 "parse.c"
         break;
-      case 132: /* limit_opt ::= LIMIT expr OFFSET expr */
-#line 718 "parse.y"
+      case 133: /* limit_opt ::= LIMIT expr OFFSET expr */
+#line 720 "parse.y"
 {yymsp[-3].minor.yy64.pLimit = yymsp[-2].minor.yy342.pExpr; yymsp[-3].minor.yy64.pOffset = yymsp[0].minor.yy342.pExpr;}
-#line 3037 "parse.c"
+#line 3044 "parse.c"
         break;
-      case 133: /* limit_opt ::= LIMIT expr COMMA expr */
-#line 720 "parse.y"
+      case 134: /* limit_opt ::= LIMIT expr COMMA expr */
+#line 722 "parse.y"
 {yymsp[-3].minor.yy64.pOffset = yymsp[-2].minor.yy342.pExpr; yymsp[-3].minor.yy64.pLimit = yymsp[0].minor.yy342.pExpr;}
-#line 3042 "parse.c"
+#line 3049 "parse.c"
         break;
-      case 134: /* cmd ::= with DELETE FROM fullname indexed_opt where_opt */
-#line 735 "parse.y"
+      case 135: /* cmd ::= with DELETE FROM fullname indexed_opt where_opt */
+#line 737 "parse.y"
 {
   sqlite3WithPush(pParse, yymsp[-5].minor.yy331, 1);
   sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy347, &yymsp[-1].minor.yy0);
   sqlSubProgramsRemaining = SQL_MAX_COMPILING_TRIGGERS;
   sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy347,yymsp[0].minor.yy122);
 }
-#line 3052 "parse.c"
+#line 3059 "parse.c"
         break;
-      case 137: /* cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */
-#line 764 "parse.y"
+      case 138: /* cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */
+#line 766 "parse.y"
 {
   sqlite3WithPush(pParse, yymsp[-7].minor.yy331, 1);
   sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy347, &yymsp[-3].minor.yy0);
@@ -3059,102 +3066,102 @@ static void yy_reduce(
   sqlSubProgramsRemaining = SQL_MAX_COMPILING_TRIGGERS;
   sqlite3Update(pParse,yymsp[-4].minor.yy347,yymsp[-1].minor.yy442,yymsp[0].minor.yy122,yymsp[-5].minor.yy392);
 }
-#line 3063 "parse.c"
+#line 3070 "parse.c"
         break;
-      case 138: /* setlist ::= setlist COMMA nm EQ expr */
-#line 776 "parse.y"
+      case 139: /* setlist ::= setlist COMMA nm EQ expr */
+#line 778 "parse.y"
 {
   yymsp[-4].minor.yy442 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy442, yymsp[0].minor.yy342.pExpr);
   sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy442, &yymsp[-2].minor.yy0, 1);
 }
-#line 3071 "parse.c"
+#line 3078 "parse.c"
         break;
-      case 139: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
-#line 780 "parse.y"
+      case 140: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
+#line 782 "parse.y"
 {
   yymsp[-6].minor.yy442 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy442, yymsp[-3].minor.yy180, yymsp[0].minor.yy342.pExpr);
 }
-#line 3078 "parse.c"
+#line 3085 "parse.c"
         break;
-      case 140: /* setlist ::= nm EQ expr */
-#line 783 "parse.y"
+      case 141: /* setlist ::= nm EQ expr */
+#line 785 "parse.y"
 {
   yylhsminor.yy442 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy342.pExpr);
   sqlite3ExprListSetName(pParse, yylhsminor.yy442, &yymsp[-2].minor.yy0, 1);
 }
-#line 3086 "parse.c"
+#line 3093 "parse.c"
   yymsp[-2].minor.yy442 = yylhsminor.yy442;
         break;
-      case 141: /* setlist ::= LP idlist RP EQ expr */
-#line 787 "parse.y"
+      case 142: /* setlist ::= LP idlist RP EQ expr */
+#line 789 "parse.y"
 {
   yymsp[-4].minor.yy442 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy180, yymsp[0].minor.yy342.pExpr);
 }
-#line 3094 "parse.c"
+#line 3101 "parse.c"
         break;
-      case 142: /* cmd ::= with insert_cmd INTO fullname idlist_opt select */
-#line 793 "parse.y"
+      case 143: /* cmd ::= with insert_cmd INTO fullname idlist_opt select */
+#line 795 "parse.y"
 {
   sqlite3WithPush(pParse, yymsp[-5].minor.yy331, 1);
   sqlSubProgramsRemaining = SQL_MAX_COMPILING_TRIGGERS;
   sqlite3Insert(pParse, yymsp[-2].minor.yy347, yymsp[0].minor.yy159, yymsp[-1].minor.yy180, yymsp[-4].minor.yy392);
 }
-#line 3103 "parse.c"
+#line 3110 "parse.c"
         break;
-      case 143: /* cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES */
-#line 799 "parse.y"
+      case 144: /* cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES */
+#line 801 "parse.y"
 {
   sqlite3WithPush(pParse, yymsp[-6].minor.yy331, 1);
   sqlSubProgramsRemaining = SQL_MAX_COMPILING_TRIGGERS;
   sqlite3Insert(pParse, yymsp[-3].minor.yy347, 0, yymsp[-2].minor.yy180, yymsp[-5].minor.yy392);
 }
-#line 3112 "parse.c"
+#line 3119 "parse.c"
         break;
-      case 147: /* idlist_opt ::= LP idlist RP */
-#line 815 "parse.y"
+      case 148: /* idlist_opt ::= LP idlist RP */
+#line 817 "parse.y"
 {yymsp[-2].minor.yy180 = yymsp[-1].minor.yy180;}
-#line 3117 "parse.c"
+#line 3124 "parse.c"
         break;
-      case 148: /* idlist ::= idlist COMMA nm */
-#line 817 "parse.y"
+      case 149: /* idlist ::= idlist COMMA nm */
+#line 819 "parse.y"
 {yymsp[-2].minor.yy180 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy180,&yymsp[0].minor.yy0);}
-#line 3122 "parse.c"
+#line 3129 "parse.c"
         break;
-      case 149: /* idlist ::= nm */
-#line 819 "parse.y"
+      case 150: /* idlist ::= nm */
+#line 821 "parse.y"
 {yymsp[0].minor.yy180 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/}
-#line 3127 "parse.c"
+#line 3134 "parse.c"
         break;
-      case 150: /* expr ::= LP expr RP */
-#line 869 "parse.y"
+      case 151: /* expr ::= LP expr RP */
+#line 871 "parse.y"
 {spanSet(&yymsp[-2].minor.yy342,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/  yymsp[-2].minor.yy342.pExpr = yymsp[-1].minor.yy342.pExpr;}
-#line 3132 "parse.c"
+#line 3139 "parse.c"
         break;
-      case 151: /* term ::= NULL */
-      case 156: /* term ::= FLOAT|BLOB */ yytestcase(yyruleno==156);
-      case 157: /* term ::= STRING */ yytestcase(yyruleno==157);
-#line 870 "parse.y"
+      case 152: /* term ::= NULL */
+      case 157: /* term ::= FLOAT|BLOB */ yytestcase(yyruleno==157);
+      case 158: /* term ::= STRING */ yytestcase(yyruleno==158);
+#line 872 "parse.y"
 {spanExpr(&yymsp[0].minor.yy342,pParse,yymsp[0].major,yymsp[0].minor.yy0);/*A-overwrites-X*/}
-#line 3139 "parse.c"
+#line 3146 "parse.c"
         break;
-      case 152: /* expr ::= ID|INDEXED */
-      case 153: /* expr ::= JOIN_KW */ yytestcase(yyruleno==153);
-#line 871 "parse.y"
+      case 153: /* expr ::= ID|INDEXED */
+      case 154: /* expr ::= JOIN_KW */ yytestcase(yyruleno==154);
+#line 873 "parse.y"
 {spanExpr(&yymsp[0].minor.yy342,pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/}
-#line 3145 "parse.c"
+#line 3152 "parse.c"
         break;
-      case 154: /* expr ::= nm DOT nm */
-#line 873 "parse.y"
+      case 155: /* expr ::= nm DOT nm */
+#line 875 "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.yy342,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
   yymsp[-2].minor.yy342.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
 }
-#line 3155 "parse.c"
+#line 3162 "parse.c"
         break;
-      case 155: /* expr ::= nm DOT nm DOT nm */
-#line 879 "parse.y"
+      case 156: /* expr ::= nm DOT nm DOT nm */
+#line 881 "parse.y"
 {
   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1);
   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
@@ -3163,21 +3170,21 @@ static void yy_reduce(
   spanSet(&yymsp[-4].minor.yy342,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
   yymsp[-4].minor.yy342.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
 }
-#line 3167 "parse.c"
+#line 3174 "parse.c"
         break;
-      case 158: /* term ::= INTEGER */
-#line 889 "parse.y"
+      case 159: /* term ::= INTEGER */
+#line 891 "parse.y"
 {
   yylhsminor.yy342.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1);
   yylhsminor.yy342.zStart = yymsp[0].minor.yy0.z;
   yylhsminor.yy342.zEnd = yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n;
   if( yylhsminor.yy342.pExpr ) yylhsminor.yy342.pExpr->flags |= EP_Leaf;
 }
-#line 3177 "parse.c"
+#line 3184 "parse.c"
   yymsp[0].minor.yy342 = yylhsminor.yy342;
         break;
-      case 159: /* expr ::= VARIABLE */
-#line 895 "parse.y"
+      case 160: /* 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;
@@ -3199,27 +3206,27 @@ static void yy_reduce(
     }
   }
 }
-#line 3203 "parse.c"
+#line 3210 "parse.c"
         break;
-      case 160: /* expr ::= expr COLLATE ID|STRING */
-#line 916 "parse.y"
+      case 161: /* expr ::= expr COLLATE ID|STRING */
+#line 918 "parse.y"
 {
   yymsp[-2].minor.yy342.pExpr = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy342.pExpr, &yymsp[0].minor.yy0, 1);
   yymsp[-2].minor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
 }
-#line 3211 "parse.c"
+#line 3218 "parse.c"
         break;
-      case 161: /* expr ::= CAST LP expr AS typetoken RP */
-#line 921 "parse.y"
+      case 162: /* expr ::= CAST LP expr AS typetoken RP */
+#line 923 "parse.y"
 {
   spanSet(&yymsp[-5].minor.yy342,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
   yymsp[-5].minor.yy342.pExpr = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1);
   sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy342.pExpr, yymsp[-3].minor.yy342.pExpr, 0);
 }
-#line 3220 "parse.c"
+#line 3227 "parse.c"
         break;
-      case 162: /* expr ::= ID|INDEXED LP distinct exprlist RP */
-#line 927 "parse.y"
+      case 163: /* expr ::= ID|INDEXED LP distinct exprlist RP */
+#line 929 "parse.y"
 {
   if( yymsp[-1].minor.yy442 && yymsp[-1].minor.yy442->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0);
@@ -3230,29 +3237,29 @@ static void yy_reduce(
     yylhsminor.yy342.pExpr->flags |= EP_Distinct;
   }
 }
-#line 3234 "parse.c"
+#line 3241 "parse.c"
   yymsp[-4].minor.yy342 = yylhsminor.yy342;
         break;
-      case 163: /* expr ::= ID|INDEXED LP STAR RP */
-#line 937 "parse.y"
+      case 164: /* expr ::= ID|INDEXED LP STAR RP */
+#line 939 "parse.y"
 {
   yylhsminor.yy342.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0);
   spanSet(&yylhsminor.yy342,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0);
 }
-#line 3243 "parse.c"
+#line 3250 "parse.c"
   yymsp[-3].minor.yy342 = yylhsminor.yy342;
         break;
-      case 164: /* term ::= CTIME_KW */
-#line 941 "parse.y"
+      case 165: /* term ::= CTIME_KW */
+#line 943 "parse.y"
 {
   yylhsminor.yy342.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0);
   spanSet(&yylhsminor.yy342, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0);
 }
-#line 3252 "parse.c"
+#line 3259 "parse.c"
   yymsp[0].minor.yy342 = yylhsminor.yy342;
         break;
-      case 165: /* expr ::= LP nexprlist COMMA expr RP */
-#line 970 "parse.y"
+      case 166: /* expr ::= LP nexprlist COMMA expr RP */
+#line 972 "parse.y"
 {
   ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy442, yymsp[-1].minor.yy342.pExpr);
   yylhsminor.yy342.pExpr = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
@@ -3263,33 +3270,33 @@ static void yy_reduce(
     sqlite3ExprListDelete(pParse->db, pList);
   }
 }
-#line 3267 "parse.c"
+#line 3274 "parse.c"
   yymsp[-4].minor.yy342 = yylhsminor.yy342;
         break;
-      case 166: /* expr ::= expr AND expr */
-      case 167: /* expr ::= expr OR expr */ yytestcase(yyruleno==167);
-      case 168: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==168);
-      case 169: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==169);
-      case 170: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==170);
-      case 171: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==171);
-      case 172: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==172);
-      case 173: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==173);
-#line 981 "parse.y"
+      case 167: /* expr ::= expr AND expr */
+      case 168: /* expr ::= expr OR expr */ yytestcase(yyruleno==168);
+      case 169: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==169);
+      case 170: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==170);
+      case 171: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==171);
+      case 172: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==172);
+      case 173: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==173);
+      case 174: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==174);
+#line 983 "parse.y"
 {spanBinaryExpr(pParse,yymsp[-1].major,&yymsp[-2].minor.yy342,&yymsp[0].minor.yy342);}
-#line 3280 "parse.c"
+#line 3287 "parse.c"
         break;
-      case 174: /* likeop ::= LIKE_KW|MATCH */
-#line 994 "parse.y"
+      case 175: /* likeop ::= LIKE_KW|MATCH */
+#line 996 "parse.y"
 {yymsp[0].minor.yy0=yymsp[0].minor.yy0;/*A-overwrites-X*/}
-#line 3285 "parse.c"
+#line 3292 "parse.c"
         break;
-      case 175: /* likeop ::= NOT LIKE_KW|MATCH */
-#line 995 "parse.y"
+      case 176: /* 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 3290 "parse.c"
+#line 3297 "parse.c"
         break;
-      case 176: /* expr ::= expr likeop expr */
-#line 996 "parse.y"
+      case 177: /* expr ::= expr likeop expr */
+#line 998 "parse.y"
 {
   ExprList *pList;
   int bNot = yymsp[-1].minor.yy0.n & 0x80000000;
@@ -3301,10 +3308,10 @@ static void yy_reduce(
   yymsp[-2].minor.yy342.zEnd = yymsp[0].minor.yy342.zEnd;
   if( yymsp[-2].minor.yy342.pExpr ) yymsp[-2].minor.yy342.pExpr->flags |= EP_InfixFunc;
 }
-#line 3305 "parse.c"
+#line 3312 "parse.c"
         break;
-      case 177: /* expr ::= expr likeop expr ESCAPE expr */
-#line 1007 "parse.y"
+      case 178: /* expr ::= expr likeop expr ESCAPE expr */
+#line 1009 "parse.y"
 {
   ExprList *pList;
   int bNot = yymsp[-3].minor.yy0.n & 0x80000000;
@@ -3317,58 +3324,58 @@ static void yy_reduce(
   yymsp[-4].minor.yy342.zEnd = yymsp[0].minor.yy342.zEnd;
   if( yymsp[-4].minor.yy342.pExpr ) yymsp[-4].minor.yy342.pExpr->flags |= EP_InfixFunc;
 }
-#line 3321 "parse.c"
+#line 3328 "parse.c"
         break;
-      case 178: /* expr ::= expr ISNULL|NOTNULL */
-#line 1034 "parse.y"
+      case 179: /* expr ::= expr ISNULL|NOTNULL */
+#line 1036 "parse.y"
 {spanUnaryPostfix(pParse,yymsp[0].major,&yymsp[-1].minor.yy342,&yymsp[0].minor.yy0);}
-#line 3326 "parse.c"
+#line 3333 "parse.c"
         break;
-      case 179: /* expr ::= expr NOT NULL */
-#line 1035 "parse.y"
+      case 180: /* expr ::= expr NOT NULL */
+#line 1037 "parse.y"
 {spanUnaryPostfix(pParse,TK_NOTNULL,&yymsp[-2].minor.yy342,&yymsp[0].minor.yy0);}
-#line 3331 "parse.c"
+#line 3338 "parse.c"
         break;
-      case 180: /* expr ::= expr IS expr */
-#line 1056 "parse.y"
+      case 181: /* expr ::= expr IS expr */
+#line 1058 "parse.y"
 {
   spanBinaryExpr(pParse,TK_IS,&yymsp[-2].minor.yy342,&yymsp[0].minor.yy342);
   binaryToUnaryIfNull(pParse, yymsp[0].minor.yy342.pExpr, yymsp[-2].minor.yy342.pExpr, TK_ISNULL);
 }
-#line 3339 "parse.c"
+#line 3346 "parse.c"
         break;
-      case 181: /* expr ::= expr IS NOT expr */
-#line 1060 "parse.y"
+      case 182: /* expr ::= expr IS NOT expr */
+#line 1062 "parse.y"
 {
   spanBinaryExpr(pParse,TK_ISNOT,&yymsp[-3].minor.yy342,&yymsp[0].minor.yy342);
   binaryToUnaryIfNull(pParse, yymsp[0].minor.yy342.pExpr, yymsp[-3].minor.yy342.pExpr, TK_NOTNULL);
 }
-#line 3347 "parse.c"
+#line 3354 "parse.c"
         break;
-      case 182: /* expr ::= NOT expr */
-      case 183: /* expr ::= BITNOT expr */ yytestcase(yyruleno==183);
-#line 1084 "parse.y"
+      case 183: /* expr ::= NOT expr */
+      case 184: /* expr ::= BITNOT expr */ yytestcase(yyruleno==184);
+#line 1086 "parse.y"
 {spanUnaryPrefix(&yymsp[-1].minor.yy342,pParse,yymsp[-1].major,&yymsp[0].minor.yy342,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
-#line 3353 "parse.c"
+#line 3360 "parse.c"
         break;
-      case 184: /* expr ::= MINUS expr */
-#line 1088 "parse.y"
+      case 185: /* expr ::= MINUS expr */
+#line 1090 "parse.y"
 {spanUnaryPrefix(&yymsp[-1].minor.yy342,pParse,TK_UMINUS,&yymsp[0].minor.yy342,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
-#line 3358 "parse.c"
+#line 3365 "parse.c"
         break;
-      case 185: /* expr ::= PLUS expr */
-#line 1090 "parse.y"
+      case 186: /* expr ::= PLUS expr */
+#line 1092 "parse.y"
 {spanUnaryPrefix(&yymsp[-1].minor.yy342,pParse,TK_UPLUS,&yymsp[0].minor.yy342,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
-#line 3363 "parse.c"
+#line 3370 "parse.c"
         break;
-      case 186: /* between_op ::= BETWEEN */
-      case 189: /* in_op ::= IN */ yytestcase(yyruleno==189);
-#line 1093 "parse.y"
+      case 187: /* between_op ::= BETWEEN */
+      case 190: /* in_op ::= IN */ yytestcase(yyruleno==190);
+#line 1095 "parse.y"
 {yymsp[0].minor.yy392 = 0;}
-#line 3369 "parse.c"
+#line 3376 "parse.c"
         break;
-      case 188: /* expr ::= expr between_op expr AND expr */
-#line 1095 "parse.y"
+      case 189: /* expr ::= expr between_op expr AND expr */
+#line 1097 "parse.y"
 {
   ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy342.pExpr);
   pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy342.pExpr);
@@ -3381,10 +3388,10 @@ static void yy_reduce(
   exprNot(pParse, yymsp[-3].minor.yy392, &yymsp[-4].minor.yy342);
   yymsp[-4].minor.yy342.zEnd = yymsp[0].minor.yy342.zEnd;
 }
-#line 3385 "parse.c"
+#line 3392 "parse.c"
         break;
-      case 191: /* expr ::= expr in_op LP exprlist RP */
-#line 1111 "parse.y"
+      case 192: /* expr ::= expr in_op LP exprlist RP */
+#line 1113 "parse.y"
 {
     if( yymsp[-1].minor.yy442==0 ){
       /* Expressions of the form
@@ -3436,29 +3443,29 @@ static void yy_reduce(
     }
     yymsp[-4].minor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
   }
-#line 3440 "parse.c"
+#line 3447 "parse.c"
         break;
-      case 192: /* expr ::= LP select RP */
-#line 1162 "parse.y"
+      case 193: /* expr ::= LP select RP */
+#line 1164 "parse.y"
 {
     spanSet(&yymsp[-2].minor.yy342,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/
     yymsp[-2].minor.yy342.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
     sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy342.pExpr, yymsp[-1].minor.yy159);
   }
-#line 3449 "parse.c"
+#line 3456 "parse.c"
         break;
-      case 193: /* expr ::= expr in_op LP select RP */
-#line 1167 "parse.y"
+      case 194: /* expr ::= expr in_op LP select RP */
+#line 1169 "parse.y"
 {
     yymsp[-4].minor.yy342.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy342.pExpr, 0);
     sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy342.pExpr, yymsp[-1].minor.yy159);
     exprNot(pParse, yymsp[-3].minor.yy392, &yymsp[-4].minor.yy342);
     yymsp[-4].minor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
   }
-#line 3459 "parse.c"
+#line 3466 "parse.c"
         break;
-      case 194: /* expr ::= expr in_op nm dbnm paren_exprlist */
-#line 1173 "parse.y"
+      case 195: /* expr ::= expr in_op nm dbnm paren_exprlist */
+#line 1175 "parse.y"
 {
     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);
     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
@@ -3468,20 +3475,20 @@ static void yy_reduce(
     exprNot(pParse, yymsp[-3].minor.yy392, &yymsp[-4].minor.yy342);
     yymsp[-4].minor.yy342.zEnd = yymsp[-1].minor.yy0.z ? &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n] : &yymsp[-2].minor.yy0.z[yymsp[-2].minor.yy0.n];
   }
-#line 3472 "parse.c"
+#line 3479 "parse.c"
         break;
-      case 195: /* expr ::= EXISTS LP select RP */
-#line 1182 "parse.y"
+      case 196: /* expr ::= EXISTS LP select RP */
+#line 1184 "parse.y"
 {
     Expr *p;
     spanSet(&yymsp[-3].minor.yy342,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/
     p = yymsp[-3].minor.yy342.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
     sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy159);
   }
-#line 3482 "parse.c"
+#line 3489 "parse.c"
         break;
-      case 196: /* expr ::= CASE case_operand case_exprlist case_else END */
-#line 1191 "parse.y"
+      case 197: /* expr ::= CASE case_operand case_exprlist case_else END */
+#line 1193 "parse.y"
 {
   spanSet(&yymsp[-4].minor.yy342,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0);  /*A-overwrites-C*/
   yymsp[-4].minor.yy342.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy122, 0);
@@ -3493,237 +3500,237 @@ static void yy_reduce(
     sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy122);
   }
 }
-#line 3497 "parse.c"
+#line 3504 "parse.c"
         break;
-      case 197: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
-#line 1204 "parse.y"
+      case 198: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
+#line 1206 "parse.y"
 {
   yymsp[-4].minor.yy442 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy442, yymsp[-2].minor.yy342.pExpr);
   yymsp[-4].minor.yy442 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy442, yymsp[0].minor.yy342.pExpr);
 }
-#line 3505 "parse.c"
+#line 3512 "parse.c"
         break;
-      case 198: /* case_exprlist ::= WHEN expr THEN expr */
-#line 1208 "parse.y"
+      case 199: /* case_exprlist ::= WHEN expr THEN expr */
+#line 1210 "parse.y"
 {
   yymsp[-3].minor.yy442 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy342.pExpr);
   yymsp[-3].minor.yy442 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy442, yymsp[0].minor.yy342.pExpr);
 }
-#line 3513 "parse.c"
+#line 3520 "parse.c"
         break;
-      case 201: /* case_operand ::= expr */
-#line 1218 "parse.y"
+      case 202: /* case_operand ::= expr */
+#line 1220 "parse.y"
 {yymsp[0].minor.yy122 = yymsp[0].minor.yy342.pExpr; /*A-overwrites-X*/}
-#line 3518 "parse.c"
+#line 3525 "parse.c"
         break;
-      case 204: /* nexprlist ::= nexprlist COMMA expr */
-#line 1229 "parse.y"
+      case 205: /* nexprlist ::= nexprlist COMMA expr */
+#line 1231 "parse.y"
 {yymsp[-2].minor.yy442 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy442,yymsp[0].minor.yy342.pExpr);}
-#line 3523 "parse.c"
+#line 3530 "parse.c"
         break;
-      case 205: /* nexprlist ::= expr */
-#line 1231 "parse.y"
+      case 206: /* nexprlist ::= expr */
+#line 1233 "parse.y"
 {yymsp[0].minor.yy442 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy342.pExpr); /*A-overwrites-Y*/}
-#line 3528 "parse.c"
+#line 3535 "parse.c"
         break;
-      case 207: /* paren_exprlist ::= LP exprlist RP */
-      case 212: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==212);
-#line 1239 "parse.y"
+      case 208: /* paren_exprlist ::= LP exprlist RP */
+      case 213: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==213);
+#line 1241 "parse.y"
 {yymsp[-2].minor.yy442 = yymsp[-1].minor.yy442;}
-#line 3534 "parse.c"
+#line 3541 "parse.c"
         break;
-      case 208: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
-#line 1246 "parse.y"
+      case 209: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
+#line 1248 "parse.y"
 {
   sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, 
                      sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy442, yymsp[-10].minor.yy392,
                       &yymsp[-11].minor.yy0, yymsp[0].minor.yy122, SQLITE_SO_ASC, yymsp[-8].minor.yy392, SQLITE_IDXTYPE_APPDEF);
 }
-#line 3543 "parse.c"
+#line 3550 "parse.c"
         break;
-      case 209: /* uniqueflag ::= UNIQUE */
-      case 248: /* raisetype ::= ABORT */ yytestcase(yyruleno==248);
-#line 1253 "parse.y"
+      case 210: /* uniqueflag ::= UNIQUE */
+      case 249: /* raisetype ::= ABORT */ yytestcase(yyruleno==249);
+#line 1255 "parse.y"
 {yymsp[0].minor.yy392 = OE_Abort;}
-#line 3549 "parse.c"
+#line 3556 "parse.c"
         break;
-      case 210: /* uniqueflag ::= */
-#line 1254 "parse.y"
+      case 211: /* uniqueflag ::= */
+#line 1256 "parse.y"
 {yymsp[1].minor.yy392 = OE_None;}
-#line 3554 "parse.c"
+#line 3561 "parse.c"
         break;
-      case 213: /* eidlist ::= eidlist COMMA nm collate sortorder */
-#line 1304 "parse.y"
+      case 214: /* eidlist ::= eidlist COMMA nm collate sortorder */
+#line 1306 "parse.y"
 {
   yymsp[-4].minor.yy442 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy442, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy392, yymsp[0].minor.yy392);
 }
-#line 3561 "parse.c"
+#line 3568 "parse.c"
         break;
-      case 214: /* eidlist ::= nm collate sortorder */
-#line 1307 "parse.y"
+      case 215: /* eidlist ::= nm collate sortorder */
+#line 1309 "parse.y"
 {
   yymsp[-2].minor.yy442 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy392, yymsp[0].minor.yy392); /*A-overwrites-Y*/
 }
-#line 3568 "parse.c"
+#line 3575 "parse.c"
         break;
-      case 217: /* cmd ::= DROP INDEX ifexists fullname */
-#line 1318 "parse.y"
+      case 218: /* cmd ::= DROP INDEX ifexists fullname */
+#line 1320 "parse.y"
 {sqlite3DropIndex(pParse, yymsp[0].minor.yy347, yymsp[-1].minor.yy392);}
-#line 3573 "parse.c"
+#line 3580 "parse.c"
         break;
-      case 218: /* cmd ::= PRAGMA nm dbnm */
-#line 1332 "parse.y"
+      case 219: /* cmd ::= PRAGMA nm dbnm */
+#line 1334 "parse.y"
 {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);}
-#line 3578 "parse.c"
+#line 3585 "parse.c"
         break;
-      case 219: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
-#line 1333 "parse.y"
+      case 220: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
+#line 1335 "parse.y"
 {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);}
-#line 3583 "parse.c"
+#line 3590 "parse.c"
         break;
-      case 220: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
-#line 1334 "parse.y"
+      case 221: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
+#line 1336 "parse.y"
 {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);}
-#line 3588 "parse.c"
+#line 3595 "parse.c"
         break;
-      case 221: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
-#line 1336 "parse.y"
+      case 222: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
+#line 1338 "parse.y"
 {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);}
-#line 3593 "parse.c"
+#line 3600 "parse.c"
         break;
-      case 222: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
-#line 1338 "parse.y"
+      case 223: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
+#line 1340 "parse.y"
 {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);}
-#line 3598 "parse.c"
+#line 3605 "parse.c"
         break;
-      case 225: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
-#line 1354 "parse.y"
+      case 226: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
+#line 1356 "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;
   sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy327, &all);
 }
-#line 3608 "parse.c"
+#line 3615 "parse.c"
         break;
-      case 226: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
-#line 1363 "parse.y"
+      case 227: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
+#line 1365 "parse.y"
 {
   sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy392, yymsp[-4].minor.yy410.a, yymsp[-4].minor.yy410.b, yymsp[-2].minor.yy347, yymsp[0].minor.yy122, yymsp[-10].minor.yy392, yymsp[-8].minor.yy392);
   yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/
 }
-#line 3616 "parse.c"
+#line 3623 "parse.c"
         break;
-      case 227: /* trigger_time ::= BEFORE */
-#line 1369 "parse.y"
+      case 228: /* trigger_time ::= BEFORE */
+#line 1371 "parse.y"
 { yymsp[0].minor.yy392 = TK_BEFORE; }
-#line 3621 "parse.c"
+#line 3628 "parse.c"
         break;
-      case 228: /* trigger_time ::= AFTER */
-#line 1370 "parse.y"
+      case 229: /* trigger_time ::= AFTER */
+#line 1372 "parse.y"
 { yymsp[0].minor.yy392 = TK_AFTER;  }
-#line 3626 "parse.c"
+#line 3633 "parse.c"
         break;
-      case 229: /* trigger_time ::= INSTEAD OF */
-#line 1371 "parse.y"
+      case 230: /* trigger_time ::= INSTEAD OF */
+#line 1373 "parse.y"
 { yymsp[-1].minor.yy392 = TK_INSTEAD;}
-#line 3631 "parse.c"
+#line 3638 "parse.c"
         break;
-      case 230: /* trigger_time ::= */
-#line 1372 "parse.y"
+      case 231: /* trigger_time ::= */
+#line 1374 "parse.y"
 { yymsp[1].minor.yy392 = TK_BEFORE; }
-#line 3636 "parse.c"
+#line 3643 "parse.c"
         break;
-      case 231: /* trigger_event ::= DELETE|INSERT */
-      case 232: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==232);
-#line 1376 "parse.y"
+      case 232: /* trigger_event ::= DELETE|INSERT */
+      case 233: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==233);
+#line 1378 "parse.y"
 {yymsp[0].minor.yy410.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy410.b = 0;}
-#line 3642 "parse.c"
+#line 3649 "parse.c"
         break;
-      case 233: /* trigger_event ::= UPDATE OF idlist */
-#line 1378 "parse.y"
+      case 234: /* trigger_event ::= UPDATE OF idlist */
+#line 1380 "parse.y"
 {yymsp[-2].minor.yy410.a = TK_UPDATE; yymsp[-2].minor.yy410.b = yymsp[0].minor.yy180;}
-#line 3647 "parse.c"
+#line 3654 "parse.c"
         break;
-      case 234: /* when_clause ::= */
-      case 253: /* key_opt ::= */ yytestcase(yyruleno==253);
-#line 1385 "parse.y"
+      case 235: /* when_clause ::= */
+      case 254: /* key_opt ::= */ yytestcase(yyruleno==254);
+#line 1387 "parse.y"
 { yymsp[1].minor.yy122 = 0; }
-#line 3653 "parse.c"
+#line 3660 "parse.c"
         break;
-      case 235: /* when_clause ::= WHEN expr */
-      case 254: /* key_opt ::= KEY expr */ yytestcase(yyruleno==254);
-#line 1386 "parse.y"
+      case 236: /* when_clause ::= WHEN expr */
+      case 255: /* key_opt ::= KEY expr */ yytestcase(yyruleno==255);
+#line 1388 "parse.y"
 { yymsp[-1].minor.yy122 = yymsp[0].minor.yy342.pExpr; }
-#line 3659 "parse.c"
+#line 3666 "parse.c"
         break;
-      case 236: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
-#line 1390 "parse.y"
+      case 237: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+#line 1392 "parse.y"
 {
   assert( yymsp[-2].minor.yy327!=0 );
   yymsp[-2].minor.yy327->pLast->pNext = yymsp[-1].minor.yy327;
   yymsp[-2].minor.yy327->pLast = yymsp[-1].minor.yy327;
 }
-#line 3668 "parse.c"
+#line 3675 "parse.c"
         break;
-      case 237: /* trigger_cmd_list ::= trigger_cmd SEMI */
-#line 1395 "parse.y"
+      case 238: /* trigger_cmd_list ::= trigger_cmd SEMI */
+#line 1397 "parse.y"
 { 
   assert( yymsp[-1].minor.yy327!=0 );
   yymsp[-1].minor.yy327->pLast = yymsp[-1].minor.yy327;
 }
-#line 3676 "parse.c"
+#line 3683 "parse.c"
         break;
-      case 238: /* trnm ::= nm DOT nm */
-#line 1406 "parse.y"
+      case 239: /* trnm ::= nm DOT nm */
+#line 1408 "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 3686 "parse.c"
+#line 3693 "parse.c"
         break;
-      case 239: /* tridxby ::= INDEXED BY nm */
-#line 1418 "parse.y"
+      case 240: /* tridxby ::= INDEXED BY nm */
+#line 1420 "parse.y"
 {
   sqlite3ErrorMsg(pParse,
         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
         "within triggers");
 }
-#line 3695 "parse.c"
+#line 3702 "parse.c"
         break;
-      case 240: /* tridxby ::= NOT INDEXED */
-#line 1423 "parse.y"
+      case 241: /* tridxby ::= NOT INDEXED */
+#line 1425 "parse.y"
 {
   sqlite3ErrorMsg(pParse,
         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
         "within triggers");
 }
-#line 3704 "parse.c"
+#line 3711 "parse.c"
         break;
-      case 241: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */
-#line 1436 "parse.y"
+      case 242: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */
+#line 1438 "parse.y"
 {yymsp[-6].minor.yy327 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy442, yymsp[0].minor.yy122, yymsp[-5].minor.yy392);}
-#line 3709 "parse.c"
+#line 3716 "parse.c"
         break;
-      case 242: /* trigger_cmd ::= insert_cmd INTO trnm idlist_opt select */
-#line 1440 "parse.y"
+      case 243: /* trigger_cmd ::= insert_cmd INTO trnm idlist_opt select */
+#line 1442 "parse.y"
 {yymsp[-4].minor.yy327 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy180, yymsp[0].minor.yy159, yymsp[-4].minor.yy392);/*A-overwrites-R*/}
-#line 3714 "parse.c"
+#line 3721 "parse.c"
         break;
-      case 243: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */
-#line 1444 "parse.y"
+      case 244: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */
+#line 1446 "parse.y"
 {yymsp[-4].minor.yy327 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy122);}
-#line 3719 "parse.c"
+#line 3726 "parse.c"
         break;
-      case 244: /* trigger_cmd ::= select */
-#line 1448 "parse.y"
+      case 245: /* trigger_cmd ::= select */
+#line 1450 "parse.y"
 {yymsp[0].minor.yy327 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy159); /*A-overwrites-X*/}
-#line 3724 "parse.c"
+#line 3731 "parse.c"
         break;
-      case 245: /* expr ::= RAISE LP IGNORE RP */
-#line 1451 "parse.y"
+      case 246: /* expr ::= RAISE LP IGNORE RP */
+#line 1453 "parse.y"
 {
   spanSet(&yymsp[-3].minor.yy342,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0);  /*A-overwrites-X*/
   yymsp[-3].minor.yy342.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0); 
@@ -3731,10 +3738,10 @@ static void yy_reduce(
     yymsp[-3].minor.yy342.pExpr->affinity = OE_Ignore;
   }
 }
-#line 3735 "parse.c"
+#line 3742 "parse.c"
         break;
-      case 246: /* expr ::= RAISE LP raisetype COMMA nm RP */
-#line 1458 "parse.y"
+      case 247: /* expr ::= RAISE LP raisetype COMMA nm RP */
+#line 1460 "parse.y"
 {
   spanSet(&yymsp[-5].minor.yy342,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0);  /*A-overwrites-X*/
   yymsp[-5].minor.yy342.pExpr = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); 
@@ -3742,143 +3749,142 @@ static void yy_reduce(
     yymsp[-5].minor.yy342.pExpr->affinity = (char)yymsp[-3].minor.yy392;
   }
 }
-#line 3746 "parse.c"
+#line 3753 "parse.c"
         break;
-      case 247: /* raisetype ::= ROLLBACK */
-#line 1468 "parse.y"
+      case 248: /* raisetype ::= ROLLBACK */
+#line 1470 "parse.y"
 {yymsp[0].minor.yy392 = OE_Rollback;}
-#line 3751 "parse.c"
+#line 3758 "parse.c"
         break;
-      case 249: /* raisetype ::= FAIL */
-#line 1470 "parse.y"
+      case 250: /* raisetype ::= FAIL */
+#line 1472 "parse.y"
 {yymsp[0].minor.yy392 = OE_Fail;}
-#line 3756 "parse.c"
+#line 3763 "parse.c"
         break;
-      case 250: /* cmd ::= DROP TRIGGER ifexists fullname */
-#line 1475 "parse.y"
+      case 251: /* cmd ::= DROP TRIGGER ifexists fullname */
+#line 1477 "parse.y"
 {
   sqlite3DropTrigger(pParse,yymsp[0].minor.yy347,yymsp[-1].minor.yy392);
 }
-#line 3763 "parse.c"
+#line 3770 "parse.c"
         break;
-      case 251: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
-#line 1482 "parse.y"
+      case 252: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
+#line 1484 "parse.y"
 {
   sqlite3Attach(pParse, yymsp[-3].minor.yy342.pExpr, yymsp[-1].minor.yy342.pExpr, yymsp[0].minor.yy122);
 }
-#line 3770 "parse.c"
+#line 3777 "parse.c"
         break;
-      case 252: /* cmd ::= DETACH database_kw_opt expr */
-#line 1485 "parse.y"
+      case 253: /* cmd ::= DETACH database_kw_opt expr */
+#line 1487 "parse.y"
 {
   sqlite3Detach(pParse, yymsp[0].minor.yy342.pExpr);
 }
-#line 3777 "parse.c"
+#line 3784 "parse.c"
         break;
-      case 255: /* cmd ::= REINDEX */
-#line 1500 "parse.y"
+      case 256: /* cmd ::= REINDEX */
+#line 1502 "parse.y"
 {sqlite3Reindex(pParse, 0, 0);}
-#line 3782 "parse.c"
+#line 3789 "parse.c"
         break;
-      case 256: /* cmd ::= REINDEX nm dbnm */
-#line 1501 "parse.y"
+      case 257: /* cmd ::= REINDEX nm dbnm */
+#line 1503 "parse.y"
 {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
-#line 3787 "parse.c"
+#line 3794 "parse.c"
         break;
-      case 257: /* cmd ::= ANALYZE */
-#line 1506 "parse.y"
+      case 258: /* cmd ::= ANALYZE */
+#line 1508 "parse.y"
 {sqlite3Analyze(pParse, 0, 0);}
-#line 3792 "parse.c"
+#line 3799 "parse.c"
         break;
-      case 258: /* cmd ::= ANALYZE nm dbnm */
-#line 1507 "parse.y"
+      case 259: /* cmd ::= ANALYZE nm dbnm */
+#line 1509 "parse.y"
 {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
-#line 3797 "parse.c"
+#line 3804 "parse.c"
         break;
-      case 259: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
-#line 1512 "parse.y"
+      case 260: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
+#line 1514 "parse.y"
 {
   sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy347,&yymsp[0].minor.yy0);
 }
-#line 3804 "parse.c"
+#line 3811 "parse.c"
         break;
-      case 260: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
-#line 1516 "parse.y"
+      case 261: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
+#line 1518 "parse.y"
 {
   yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n;
   sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0);
 }
-#line 3812 "parse.c"
+#line 3819 "parse.c"
         break;
-      case 261: /* add_column_fullname ::= fullname */
-#line 1520 "parse.y"
+      case 262: /* add_column_fullname ::= fullname */
+#line 1522 "parse.y"
 {
   disableLookaside(pParse);
   sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy347);
 }
-#line 3820 "parse.c"
+#line 3827 "parse.c"
         break;
-      case 262: /* cmd ::= create_vtab */
-#line 1530 "parse.y"
+      case 263: /* cmd ::= create_vtab */
+#line 1532 "parse.y"
 {sqlite3VtabFinishParse(pParse,0);}
-#line 3825 "parse.c"
+#line 3832 "parse.c"
         break;
-      case 263: /* cmd ::= create_vtab LP vtabarglist RP */
-#line 1531 "parse.y"
+      case 264: /* cmd ::= create_vtab LP vtabarglist RP */
+#line 1533 "parse.y"
 {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);}
-#line 3830 "parse.c"
+#line 3837 "parse.c"
         break;
-      case 264: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
-#line 1533 "parse.y"
+      case 265: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
+#line 1535 "parse.y"
 {
     sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy392);
 }
-#line 3837 "parse.c"
+#line 3844 "parse.c"
         break;
-      case 265: /* vtabarg ::= */
-#line 1538 "parse.y"
+      case 266: /* vtabarg ::= */
+#line 1540 "parse.y"
 {sqlite3VtabArgInit(pParse);}
-#line 3842 "parse.c"
+#line 3849 "parse.c"
         break;
-      case 266: /* vtabargtoken ::= ANY */
-      case 267: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==267);
-      case 268: /* lp ::= LP */ yytestcase(yyruleno==268);
-#line 1540 "parse.y"
+      case 267: /* vtabargtoken ::= ANY */
+      case 268: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==268);
+      case 269: /* lp ::= LP */ yytestcase(yyruleno==269);
+#line 1542 "parse.y"
 {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);}
-#line 3849 "parse.c"
+#line 3856 "parse.c"
         break;
-      case 269: /* with ::= */
-#line 1555 "parse.y"
+      case 270: /* with ::= */
+#line 1557 "parse.y"
 {yymsp[1].minor.yy331 = 0;}
-#line 3854 "parse.c"
+#line 3861 "parse.c"
         break;
-      case 270: /* with ::= WITH wqlist */
-#line 1557 "parse.y"
+      case 271: /* with ::= WITH wqlist */
+#line 1559 "parse.y"
 { yymsp[-1].minor.yy331 = yymsp[0].minor.yy331; }
-#line 3859 "parse.c"
+#line 3866 "parse.c"
         break;
-      case 271: /* with ::= WITH RECURSIVE wqlist */
-#line 1558 "parse.y"
+      case 272: /* with ::= WITH RECURSIVE wqlist */
+#line 1560 "parse.y"
 { yymsp[-2].minor.yy331 = yymsp[0].minor.yy331; }
-#line 3864 "parse.c"
+#line 3871 "parse.c"
         break;
-      case 272: /* wqlist ::= nm eidlist_opt AS LP select RP */
-#line 1560 "parse.y"
+      case 273: /* wqlist ::= nm eidlist_opt AS LP select RP */
+#line 1562 "parse.y"
 {
   yymsp[-5].minor.yy331 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy442, yymsp[-1].minor.yy159); /*A-overwrites-X*/
 }
-#line 3871 "parse.c"
+#line 3878 "parse.c"
         break;
-      case 273: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
-#line 1563 "parse.y"
+      case 274: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
+#line 1565 "parse.y"
 {
   yymsp[-7].minor.yy331 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy331, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy442, yymsp[-1].minor.yy159);
 }
-#line 3878 "parse.c"
+#line 3885 "parse.c"
         break;
       default:
-      /* (274) ecmd ::= SEMI */ yytestcase(yyruleno==274);
-      /* (275) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==275);
+      /* (275) input ::= ecmd */ yytestcase(yyruleno==275);
       /* (276) explain ::= */ yytestcase(yyruleno==276);
       /* (277) cmdx ::= cmd (OPTIMIZED OUT) */ assert(yyruleno!=277);
       /* (278) trans_opt ::= */ yytestcase(yyruleno==278);
@@ -3992,7 +3998,7 @@ static void yy_syntax_error(
   UNUSED_PARAMETER(yymajor);  /* Silence some compiler warnings */
   assert( TOKEN.z[0] );  /* The tokenizer always gives us a token */
   sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
-#line 3996 "parse.c"
+#line 4002 "parse.c"
 /************ End %syntax_error code ******************************************/
   sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
 }
diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
index 556e49c79e..bdb9204256 100644
--- a/src/box/sql/parse.y
+++ b/src/box/sql/parse.y
@@ -103,9 +103,11 @@ static void disableLookaside(Parse *pParse){
 } // end %include
 
 // Input is a single SQL command
-input ::= ecmd.                   { sqlite3FinishCoding(pParse); }
-ecmd ::= SEMI.
-ecmd ::= explain cmdx SEMI.
+input ::= ecmd.
+ecmd ::= explain cmdx SEMI.       { sqlite3FinishCoding(pParse); }
+ecmd ::= SEMI. {
+  sqlite3ErrorMsg(pParse, "syntax error: empty request");
+}
 explain ::= .
 %ifndef SQLITE_OMIT_EXPLAIN
 explain ::= EXPLAIN.              { pParse->explain = 1; }
diff --git a/test/sql/lua/sql_tokenizer.lua b/test/sql/lua/sql_tokenizer.lua
index 8523e11b45..b6e1b7b708 100644
--- a/test/sql/lua/sql_tokenizer.lua
+++ b/test/sql/lua/sql_tokenizer.lua
@@ -1,80 +1,133 @@
--- Get next token from the SQL query at the specified offset.
--- Context.offset is propagated on count of read characters.
--- @param context Table with two keys: sql and offset. sql - 
---        query string, offset - start position, from which need
---        to extract a next token.
+local TK_CREATE = 1
+local TK_TEMP = 2
+local TK_TRIGGER = 3
+local TK_CASE = 4
+local TK_END = 5
+local TK_QUOTE = 6
+local TK_DOUBLE_QUOTE = 7
+local TK_SEMI = 8
+local TK_EMPTY = 9
+local TK_TEXT = 10
+
+-- Read comment of the specified type and propagate the offset.
+-- @param context Map {sql: string, offset: number}.
+-- @param comment_type Either '-' for '-- ...' comments or
+--        '*' for '/* ... */' comments.
+local function read_comment(context, comment_type)
+    -- Skip '/*' or '--'.
+    local chars_read = 2
+    for i = context.offset + 2, context.sql:len() do
+        local c = context.sql:sub(i, i)
+        local next_c = context.sql:sub(i + 1, i + 1)
+        chars_read = chars_read + 1
+        if comment_type == '-' and c == '\n' then
+            goto finish
+        elseif comment_type == '*' and c == '*' and next_c == '/' then
+            chars_read = chars_read + 1
+            goto finish
+        end
+    end
+::finish::
+    context.offset = context.offset + chars_read
+end
+
+-- Read spaces and propagate the offset.
+-- @param context Map {sql: string, offset: number}.
+local function read_spaces(context)
+    -- Skip the first space.
+    local chars_read = 1
+    for i = context.offset + 1, context.sql:len() do
+        local c = context.sql:sub(i, i)
+        if c ~= ' ' and c ~= '\n' and c ~= '\t' then
+            goto finish
+        end
+        chars_read = chars_read + 1
+    end
+::finish::
+    context.offset = context.offset + chars_read
+end
+
+-- Read a text. It can be an identifier consisted of letters and
+-- digits or another single symbol ('",.:;^&?! etc). Propagate the
+-- offset.
+-- @param context Map {sql: string, offset: number}.
 --
--- @retval Token. Comments are extracted as a monolite token, for
---         example '/* select 1, 2, 3 */' is returned as a single
---         token, but 'select 1, 2, 3' is returned as 'select',
---         '1', '2', '3'.
-local function get_next_token(context)
+-- Retvals identify words without case sensitivity.
+-- @retval not TK_TEXT means word TK_'word'.
+-- @retval     TK_TEXT means another, not special word.
+local function read_text(context)
     local chars_read = 0
-    -- Accumulate here the token char by char.
-    local token = ''
-    -- True, if now the tokenizer reads the comment.
-    local in_comment = false
-    -- Type of the read comment: '-- ... \n' or  '/* ... */'.
-    local comment_type = nil
-    -- Iterate until token is ready.
+    local tk_type = TK_TEXT
     for i = context.offset, context.sql:len() do
         local c = context.sql:sub(i, i)
-        local next_c = context.sql:sub(i + 1, i + 1)
-        if in_comment then
-            -- Comment '-- ... \n' ends with '\n'.
-            -- Comment '/* .. */' ends with the '*/'.
-            if comment_type == '-' and c == '\n' then
-                chars_read = chars_read + 1
-                token = token..c
-                goto finish
-            elseif comment_type == '*' and c == '*' and next_c == '/' then
-                chars_read = chars_read + 2
-                token = token..'*/'
-                goto finish
-            end
-            -- Accumulate commented text.
-            token = token..c
-            chars_read = chars_read + 1
-        elseif c == '-' and next_c == '-' then
-            assert(token:len() == 0)
-            in_comment = true
-            comment_type = '-'
-            token = token..c
-            chars_read = chars_read + 1
-        elseif c == '/' and next_c == '*' then
-            assert(token:len() == 0)
-            in_comment = true
-            comment_type = '*'
-            token = token..c
-            chars_read = chars_read + 1
-        elseif c == ' ' or c == '\n' or c == '\t' then
-            chars_read = chars_read + 1
-            if token:len() ~= 0 then
-                goto finish
-            end
-        elseif not c:match('[%d%a]') then
-            if token:len() == 0 then
-                token = c
-                chars_read = chars_read + 1
+        if not c:match('[%d%a_]') then
+            if chars_read == 0 then
+                chars_read = 1
+                if c == "'" then
+                    tk_type = TK_QUOTE
+                elseif c == '"' then
+                    tk_type = TK_DOUBLE_QUOTE
+                elseif c == ';' then
+                    tk_type = TK_SEMI
+                end
             end
             goto finish
-        else
-            token = token..c
-            chars_read = chars_read + 1
         end
+        chars_read = chars_read + 1
     end
 ::finish::
-    context.offset = context.offset + chars_read
-    return token
+    local new_offset = context.offset + chars_read
+    local end_pos = new_offset - 1
+    if chars_read == 6 and context.sql:sub(context.offset, end_pos):upper() == 'CREATE' then
+        tk_type = TK_CREATE
+    elseif chars_read == 4 then
+        local word = context.sql:sub(context.offset, end_pos):upper()
+        if word == 'TEMP' then
+            tk_type = TK_TEMP
+        elseif word == 'CASE' then
+            tk_type = TK_CASE
+        end
+    elseif chars_read == 7 and context.sql:sub(context.offset, end_pos):upper() == 'TRIGGER' then
+        tk_type = TK_TRIGGER
+    elseif chars_read == 3 and context.sql:sub(context.offset, end_pos):upper() == 'END' then
+        tk_type = TK_END
+    end
+    context.offset = new_offset
+    return tk_type
 end
 
-local function split_sql(query)
+-- Get next token from the SQL request at the specified offset.
+-- Context.offset is propagated on count of read characters.
+-- @param context Table with two keys: sql and offset. sql -
+--        request string, offset - start position, from which need
+--        to extract a next token.
+--
+-- @retval Token type. If the rest of the SQL request consists of
+--         spaces and comments, then return TK_EMPTY.
+local function get_next_token(context)
+    local c = ''
+    repeat
+        local i = context.offset
+        c = context.sql:sub(i, i)
+        local next_c = context.sql:sub(i + 1, i + 1)
+        if (c == '-' and next_c == '-') or (c == '/' and next_c == '*') then
+            read_comment(context, next_c)
+        elseif c == ' ' or c == '\n' or c == '\t' then
+            read_spaces(context)
+        elseif c ~= '' then
+            return read_text(context)
+        end
+    until c == ''
+    return TK_EMPTY
+end
+
+local function split_sql(request)
     -- Array of result statements
     local res = {}
     -- True, if the splitter reads the trigger body. In such a
     -- case the ';' can not be used as end of the statement.
     local in_trigger = false
-    -- True, if the splitter reads the string in the query.
+    -- True, if the splitter reads the string in the request.
     -- Inside a string all chars lose their special meanings.
     local in_quotes = false
     -- Type of the quotes - either ' or ".
@@ -89,33 +142,39 @@ local function split_sql(query)
     -- End of the previous statement.
     local prev_sub_i = 1
     -- Tokenizer context.
-    local context = { sql = query, offset = 1 }
+    local context = { sql = request, offset = 1 }
     local token = get_next_token(context)
-    -- Read until multistatement query is finished.
-    while token:len() ~= 0 do
-        if token == '"' or token == "'" then
+    local is_not_empty = token ~= TK_EMPTY and token ~= TK_SEMI
+    -- Read until multistatement request is finished.
+    while token ~= TK_EMPTY do
+        if token == TK_QUOTE or token == TK_DOUBLE_QUOTE then
             if in_quotes and token == quote_type then
                 in_quotes = false
             elseif not in_quotes then
                 in_quotes = true
                 quote_type = token
             end
-        elseif not in_quotes and not in_trigger and token == ';' then
-            table.insert(res, query:sub(prev_sub_i, context.offset - 1))
+        elseif not in_quotes and not in_trigger and token == TK_SEMI then
+            if is_not_empty then
+                table.insert(res, request:sub(prev_sub_i, context.offset - 1))
+            end
+            is_not_empty = false
             prev_sub_i = context.offset
-        elseif token:upper() == 'CREATE' then
+        elseif token == TK_CREATE then
             token = get_next_token(context)
+            is_not_empty = is_not_empty or token ~= TK_EMPTY and token ~= TK_SEMI
             -- 'TEMP' can be a part of 'CREATE TRIGGER' or
             -- 'CREATE TABLE' or 'CREATE VIEW'. Skip it.
-            if token:upper() == 'TEMP' then
+            if token == TK_TEMP then
                 token = get_next_token(context)
+                is_not_empty = is_not_empty or token ~= TK_EMPTY and token ~= TK_SEMI
             end
-            if token:upper() == 'TRIGGER' then
+            if token == TK_TRIGGER then
                 in_trigger = true
             end
-        elseif token:upper() == 'CASE' then
+        elseif token == TK_CASE then
             in_case = true
-        elseif token:upper() == 'END' then
+        elseif token == TK_END then
             -- 'TRIGGER' can contain 'CASE', but not vice versa.
             -- In a case: CREATE TRIGGER ... BEGIN
             --                   SELECT ... CASE ... END;
@@ -128,9 +187,10 @@ local function split_sql(query)
             end
         end
         token = get_next_token(context)
+        is_not_empty = is_not_empty or token ~= TK_EMPTY and token ~= TK_SEMI
     end
-    if prev_sub_i < context.offset then
-        table.insert(res, query:sub(prev_sub_i, context.offset))
+    if prev_sub_i < context.offset and is_not_empty then
+        table.insert(res, request:sub(prev_sub_i, context.offset))
     end
     return res
 end
diff --git a/test/sql/misc.result b/test/sql/misc.result
index 8e74b00366..ebe0830afe 100644
--- a/test/sql/misc.result
+++ b/test/sql/misc.result
@@ -15,3 +15,19 @@ box.space.t1 == nil
 ---
 - true
 ...
+box.sql.execute(';')
+---
+- error: 'syntax error: empty request'
+...
+box.sql.execute('')
+---
+- error: 'syntax error: empty request'
+...
+box.sql.execute('     ;')
+---
+- error: 'syntax error: empty request'
+...
+box.sql.execute('\n\n\n\t\t\t   ')
+---
+- error: 'syntax error: empty request'
+...
diff --git a/test/sql/misc.test.lua b/test/sql/misc.test.lua
index 69f610e638..2c05fcd0cf 100644
--- a/test/sql/misc.test.lua
+++ b/test/sql/misc.test.lua
@@ -3,3 +3,7 @@ box.sql.execute('select 1;')
 box.sql.execute('select 1; select 2;')
 box.sql.execute('create table t1 (id primary key); select 100;')
 box.space.t1 == nil
+box.sql.execute(';')
+box.sql.execute('')
+box.sql.execute('     ;')
+box.sql.execute('\n\n\n\t\t\t   ')
diff --git a/test/sql/sql-tokenizer.result b/test/sql/sql-tokenizer.result
index 555e046418..3a72aca11e 100644
--- a/test/sql/sql-tokenizer.result
+++ b/test/sql/sql-tokenizer.result
@@ -15,7 +15,7 @@ sql_tokenizer.split_sql('select 1; select 2; select 3;')
 ...
 sql_tokenizer.split_sql(';')
 ---
-- - ;
+- []
 ...
 sql_tokenizer.split_sql('')
 ---
@@ -33,7 +33,6 @@ sql_tokenizer.split_sql('select ";" from ";;;;"\'\' as ";"; select 100;     \n\n
 ---
 - - select ";" from ";;;;"'' as ";";
   - ' select 100;'
-  - "     \n\n"
 ...
 test_run:cmd("setopt delimiter ';'")
 ---
@@ -58,7 +57,7 @@ test_run:cmd("setopt delimiter ''");
 ...
 sql_tokenizer.split_sql('-- comment comment comment; select 1; select 2;')
 ---
-- - -- comment comment comment; select 1; select 2;
+- []
 ...
 sql_tokenizer.split_sql('select 1; select /* comment comment select 100; select 1000; */ 3; select 2;')
 ---
@@ -92,3 +91,8 @@ test_run:cmd("setopt delimiter ''");
 ---
 - true
 ...
+sql_tokenizer.split_sql('select 1; -- test comment\n; select 2;')
+---
+- - select 1;
+  - ' select 2;'
+...
diff --git a/test/sql/sql-tokenizer.test.lua b/test/sql/sql-tokenizer.test.lua
index 50838c399c..c7f5298fbc 100644
--- a/test/sql/sql-tokenizer.test.lua
+++ b/test/sql/sql-tokenizer.test.lua
@@ -27,3 +27,5 @@ sql_tokenizer.split_sql('create temp trigger begin\n'..
 				'insert into tst values v a l u e s;\n'..
 			'end;\n\n\n\t\t\n\n select 200..";select1000";');
 test_run:cmd("setopt delimiter ''");
+
+sql_tokenizer.split_sql('select 1; -- test comment\n; select 2;')
-- 
GitLab