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