From f85a5e7b52d69edff94333b0caa65f703e4b4eca Mon Sep 17 00:00:00 2001 From: Pedro Flemming Date: Mon, 29 May 2017 16:22:13 +0200 Subject: [PATCH] Prepared Statements (#43) Changed PREPARE syntax to be closer to the standard. --- Makefile | 10 +- src/SQLParserResult.cpp | 12 + src/SQLParserResult.h | 8 + src/parser/bison_parser.cpp | 1630 +++++++++++++++++----------------- src/parser/bison_parser.h | 28 +- src/parser/bison_parser.y | 81 +- src/parser/parser_typedef.h | 9 +- src/sql/Expr.cpp | 6 +- src/sql/Expr.h | 4 +- src/sql/PrepareStatement.cpp | 15 + src/sql/PrepareStatement.h | 18 +- src/sql/statements.cpp | 23 - test/prepare_tests.cpp | 110 ++- test/valid_queries.sql | 8 +- 14 files changed, 984 insertions(+), 978 deletions(-) create mode 100644 src/sql/PrepareStatement.cpp diff --git a/Makefile b/Makefile index cb55818..7132a4b 100644 --- a/Makefile +++ b/Makefile @@ -19,14 +19,19 @@ LIBFLAGS = -shared TARGET = libsqlparser.so INSTALL = /usr/local -CTESTFLAGS = -Wall -Isrc/ -Itest/ -L./ -std=c++11 -lstdc++ -O3 +CTESTFLAGS = -Wall -Isrc/ -Itest/ -L./ -std=c++11 -lstdc++ # Set compile mode to -g or -O3. +MODE_LOG = "" mode ?= release ifeq ($(mode), debug) CFLAGS += -g + CTESTFLAGS += -g + MODE_LOG = "Building in \033[1;31mdebug\033[0m mode" else CFLAGS += -O3 + CTESTFLAGS += -O3 + MODE_LOG = "Building in \033[0;32mrelease\033[0m mode ('make mode=debug' for debug mode)" endif GMAKE = make mode=$(mode) @@ -36,7 +41,6 @@ all: library library: $(TARGET) $(TARGET): $(LIBOBJ) - echo $(mode) $(CXX) $(LIBFLAGS) -o $(TARGET) $(LIBOBJ) $(SRCPARSER)/flex_lexer.o: $(SRCPARSER)/flex_lexer.cpp $(SRCPARSER)/bison_parser.cpp @@ -108,3 +112,5 @@ format: astyle --options=astyle.options $(ALLTEST) astyle --options=astyle.options $(EXAMPLESRC) +log_mode: + @echo $(MODE_LOG) diff --git a/src/SQLParserResult.cpp b/src/SQLParserResult.cpp index 6272b30..f266f0d 100644 --- a/src/SQLParserResult.cpp +++ b/src/SQLParserResult.cpp @@ -1,5 +1,6 @@ #include "SQLParserResult.h" +#include namespace hsql { @@ -95,4 +96,15 @@ namespace hsql { errorColumn_ = -1; } + // Does NOT take ownership. + void SQLParserResult::addParameter(Expr* parameter) { + parameters_.push_back(parameter); + std::sort(parameters_.begin(), parameters_.end(), + [](const Expr* a, const Expr* b) { return a->ival < b->ival; }); + } + + const std::vector& SQLParserResult::parameters() { + return parameters_; + } + } // namespace hsql diff --git a/src/SQLParserResult.h b/src/SQLParserResult.h index 9ab82a4..66b78a8 100644 --- a/src/SQLParserResult.h +++ b/src/SQLParserResult.h @@ -63,6 +63,11 @@ namespace hsql { // Deletes all statements and other data within the result. void reset(); + // Does NOT take ownership. + void addParameter(Expr* parameter); + + const std::vector& parameters(); + private: // List of statements within the result. std::vector statements_; @@ -78,6 +83,9 @@ namespace hsql { // Column number of the occurrance of the error in the query. int errorColumn_; + + // Does NOT have ownership. + std::vector parameters_; }; } // namespace hsql diff --git a/src/parser/bison_parser.cpp b/src/parser/bison_parser.cpp index 35be8d6..3e815cc 100644 --- a/src/parser/bison_parser.cpp +++ b/src/parser/bison_parser.cpp @@ -98,9 +98,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha } - - -#line 104 "bison_parser.cpp" /* yacc.c:339 */ +#line 102 "bison_parser.cpp" /* yacc.c:339 */ # ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus @@ -138,7 +136,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha extern int hsql_debug; #endif /* "%code requires" blocks. */ -#line 36 "bison_parser.y" /* yacc.c:355 */ +#line 34 "bison_parser.y" /* yacc.c:355 */ // %code requires block @@ -148,20 +146,20 @@ extern int hsql_debug; // Auto update column and line number #define YY_USER_ACTION \ - yylloc->first_line = yylloc->last_line; \ - yylloc->first_column = yylloc->last_column; \ - for(int i = 0; yytext[i] != '\0'; i++) { \ - yylloc->total_column++; \ - if(yytext[i] == '\n') { \ - yylloc->last_line++; \ - yylloc->last_column = 0; \ - } \ - else { \ - yylloc->last_column++; \ - } \ - } + yylloc->first_line = yylloc->last_line; \ + yylloc->first_column = yylloc->last_column; \ + for(int i = 0; yytext[i] != '\0'; i++) { \ + yylloc->total_column++; \ + if(yytext[i] == '\n') { \ + yylloc->last_line++; \ + yylloc->last_column = 0; \ + } \ + else { \ + yylloc->last_column++; \ + } \ + } -#line 165 "bison_parser.cpp" /* yacc.c:355 */ +#line 163 "bison_parser.cpp" /* yacc.c:355 */ /* Token type. */ #ifndef HSQL_TOKENTYPE @@ -304,7 +302,7 @@ extern int hsql_debug; union HSQL_STYPE { -#line 95 "bison_parser.y" /* yacc.c:355 */ +#line 92 "bison_parser.y" /* yacc.c:355 */ double fval; int64_t ival; @@ -341,7 +339,7 @@ union HSQL_STYPE std::vector* expr_vec; std::vector* order_vec; -#line 345 "bison_parser.cpp" /* yacc.c:355 */ +#line 343 "bison_parser.cpp" /* yacc.c:355 */ }; typedef union HSQL_STYPE HSQL_STYPE; @@ -371,7 +369,7 @@ int hsql_parse (hsql::SQLParserResult* result, yyscan_t scanner); /* Copy the second part of user declarations. */ -#line 375 "bison_parser.cpp" /* yacc.c:358 */ +#line 373 "bison_parser.cpp" /* yacc.c:358 */ #ifdef short # undef short @@ -615,16 +613,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 48 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 452 +#define YYLAST 463 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 151 +#define YYNTOKENS 148 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 75 +#define YYNNTS 76 /* YYNRULES -- Number of rules. */ #define YYNRULES 170 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 315 +#define YYNSTATES 312 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ @@ -642,15 +640,15 @@ static const yytype_uint8 yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 137, 2, 2, - 142, 143, 135, 133, 149, 134, 144, 136, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 146, 145, - 128, 126, 129, 150, 2, 2, 2, 2, 2, 2, + 142, 143, 135, 133, 146, 134, 144, 136, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 145, + 128, 126, 129, 147, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 140, 2, 141, 138, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 147, 2, 148, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -683,24 +681,24 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 240, 240, 251, 252, 256, 261, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 282, 287, 299, 303, - 315, 323, 327, 337, 343, 349, 359, 360, 364, 365, - 369, 376, 377, 378, 379, 389, 393, 397, 409, 417, - 429, 435, 445, 446, 456, 465, 466, 470, 482, 483, - 487, 488, 492, 502, 516, 530, 531, 532, 536, 548, - 549, 553, 557, 562, 563, 567, 572, 576, 577, 580, - 581, 585, 586, 590, 594, 595, 596, 602, 603, 607, - 608, 609, 616, 617, 621, 622, 626, 633, 634, 635, - 636, 637, 638, 642, 643, 644, 645, 646, 647, 651, - 652, 653, 657, 658, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 674, 675, 679, 680, 681, 682, 687, - 691, 692, 696, 697, 698, 699, 700, 701, 705, 709, - 713, 714, 718, 719, 720, 724, 729, 730, 734, 738, - 742, 753, 754, 764, 765, 771, 776, 777, 782, 792, - 800, 801, 806, 807, 811, 812, 820, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 845, 854, 855, 860, - 861 + 0, 237, 237, 258, 259, 263, 264, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 285, 292, 295, 299, + 311, 319, 323, 333, 339, 345, 355, 356, 360, 361, + 365, 372, 373, 374, 375, 385, 389, 393, 405, 413, + 425, 431, 441, 442, 452, 461, 462, 466, 478, 479, + 483, 484, 488, 498, 512, 526, 527, 528, 532, 544, + 545, 549, 553, 558, 559, 563, 568, 572, 573, 576, + 577, 581, 582, 586, 590, 591, 592, 598, 599, 603, + 604, 605, 612, 613, 617, 618, 622, 629, 630, 631, + 632, 633, 634, 638, 639, 640, 641, 642, 643, 647, + 648, 649, 653, 654, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 670, 671, 675, 676, 677, 678, 683, + 687, 688, 692, 693, 694, 695, 696, 697, 701, 705, + 709, 710, 714, 715, 716, 720, 725, 726, 730, 734, + 738, 750, 751, 761, 762, 768, 773, 774, 779, 789, + 797, 798, 803, 804, 808, 809, 817, 829, 830, 831, + 832, 833, 834, 835, 836, 837, 842, 851, 852, 857, + 858 }; #endif @@ -728,26 +726,25 @@ static const char *const yytname[] = "TOP", "AS", "BY", "IF", "IN", "IS", "OF", "ON", "OR", "TO", "'='", "EQUALS", "'<'", "'>'", "LESS", "GREATER", "NOTNULL", "'+'", "'-'", "'*'", "'/'", "'%'", "'^'", "UMINUS", "'['", "']'", "'('", "')'", "'.'", - "';'", "':'", "'{'", "'}'", "','", "'?'", "$accept", "input", - "statement_list", "statement", "preparable_statement", - "prepare_statement", "execute_statement", "import_statement", - "import_file_type", "file_path", "create_statement", "opt_not_exists", - "column_def_commalist", "column_def", "column_type", "drop_statement", - "delete_statement", "truncate_statement", "insert_statement", - "opt_column_list", "update_statement", "update_clause_commalist", - "update_clause", "select_statement", "select_with_paren", - "select_no_paren", "set_operator", "select_clause", "opt_distinct", - "select_list", "from_clause", "opt_where", "opt_group", "opt_having", - "opt_order", "order_list", "order_desc", "opt_order_type", "opt_top", - "opt_limit", "expr_list", "literal_list", "expr_alias", "expr", - "operand", "scalar_expr", "unary_expr", "binary_expr", "logic_expr", - "in_expr", "case_expr", "exists_expr", "comp_expr", "function_expr", - "between_expr", "column_name", "literal", "string_literal", - "num_literal", "int_literal", "star_expr", "placeholder_expr", - "table_ref", "table_ref_atomic", "table_ref_commalist", "table_ref_name", - "table_ref_name_no_alias", "table_name", "alias", "opt_alias", - "join_clause", "opt_join_type", "join_condition", "opt_semicolon", - "ident_commalist", YY_NULLPTR + "';'", "','", "'?'", "$accept", "input", "statement_list", "statement", + "preparable_statement", "prepare_statement", "prepare_target_query", + "execute_statement", "import_statement", "import_file_type", "file_path", + "create_statement", "opt_not_exists", "column_def_commalist", + "column_def", "column_type", "drop_statement", "delete_statement", + "truncate_statement", "insert_statement", "opt_column_list", + "update_statement", "update_clause_commalist", "update_clause", + "select_statement", "select_with_paren", "select_no_paren", + "set_operator", "select_clause", "opt_distinct", "select_list", + "from_clause", "opt_where", "opt_group", "opt_having", "opt_order", + "order_list", "order_desc", "opt_order_type", "opt_top", "opt_limit", + "expr_list", "literal_list", "expr_alias", "expr", "operand", + "scalar_expr", "unary_expr", "binary_expr", "logic_expr", "in_expr", + "case_expr", "exists_expr", "comp_expr", "function_expr", "between_expr", + "column_name", "literal", "string_literal", "num_literal", "int_literal", + "star_expr", "param_expr", "table_ref", "table_ref_atomic", + "table_ref_commalist", "table_ref_name", "table_ref_name_no_alias", + "table_name", "alias", "opt_alias", "join_clause", "opt_join_type", + "join_condition", "opt_semicolon", "ident_commalist", YY_NULLPTR }; #endif @@ -770,15 +767,14 @@ static const yytype_uint16 yytoknum[] = 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 61, 381, 60, 62, 382, 383, 384, 43, 45, 42, 47, 37, 94, 385, - 91, 93, 40, 41, 46, 59, 58, 123, 125, 44, - 63 + 91, 93, 40, 41, 46, 59, 44, 63 }; # endif -#define YYPACT_NINF -242 +#define YYPACT_NINF -231 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-242))) + (!!((Yystate) == (-231))) #define YYTABLE_NINF -166 @@ -789,38 +785,38 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - 156, 24, 67, 103, 111, -42, 54, 57, 48, 6, - 67, -8, -26, 146, 11, -242, -242, -242, -242, -242, - -242, -242, -242, -242, -242, -242, -242, -242, -242, 26, - 149, 31, -242, 63, 18, 61, 61, 67, 85, 67, - 190, 201, 114, -242, 67, 67, 95, 96, -242, 156, - -242, -242, -242, 126, -242, -26, 179, -242, 244, 23, - 160, 156, 151, 67, 67, 188, -242, 182, 131, -242, - -242, -242, 19, 271, -242, -242, -242, -242, -242, 19, - 205, 205, 190, -242, -242, -242, -242, -242, -94, -242, - -242, -242, -242, -242, -242, 11, 236, -31, 131, 19, - -242, 276, 281, 50, -9, 143, 186, 13, 37, -242, - 9, 204, 140, -242, 2, 120, -242, -242, -242, -242, - -242, -242, -242, -242, -242, -242, -242, -242, -242, 164, - -40, -242, 142, -242, -11, 179, 179, 248, -242, 23, - 144, -242, 184, 297, 187, -57, 213, -242, -242, -19, - 163, -242, 201, 305, 254, 19, 169, 37, 261, 124, - 170, 15, 3, 188, 19, -242, 19, 309, 19, -242, - -242, 37, 37, 37, 37, 37, -15, 178, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 23, 271, -242, - 19, -242, -242, -242, -242, -242, 190, -242, -242, 238, - 7, 34, -242, -26, 67, -242, 319, 23, 19, -242, - 180, 86, 254, 234, -242, -242, -26, -242, 303, -242, - 17, -242, 263, -242, -242, -242, 222, 274, 225, 225, - 181, 274, 37, 189, 9, 274, 225, 225, 124, 124, - 191, 191, 191, -242, -242, -242, -242, -242, 276, -242, - -242, -242, -242, -242, -242, 297, -242, -242, -242, 52, - 66, -242, 37, 185, 192, -242, -242, -242, -242, 259, - 262, 3, 247, -242, 219, -242, 37, 274, 9, 196, - 80, -242, -242, -242, -242, 212, -242, 17, -242, -242, - 206, 193, 3, 19, 261, 200, 93, -242, -242, 37, - -242, 3, 153, -34, -242, -242, 243, 206, 19, 19, - -242, -242, -57, -242, -57 + 153, 5, 30, 47, 99, -42, 22, 26, 36, -2, + 30, -30, -39, 126, -9, -231, -231, -231, -231, -231, + -231, -231, -231, -231, -231, -231, -231, -231, -231, 95, + 139, 12, -231, 2, 63, 45, 45, 30, 42, 30, + 160, 157, 62, -231, 30, 30, 50, 64, -231, 153, + -231, -231, -231, 70, -231, -39, 140, -231, 208, 23, + 222, 119, 30, 30, 162, -231, 159, 98, -231, -231, + -231, 90, 240, -231, -231, -231, -231, -231, 90, 178, + 178, 160, -231, -231, -231, -231, -231, -27, -231, -231, + -231, -231, -231, -231, -231, 209, -65, 98, 90, -231, + 247, 250, -5, -93, 118, 161, 11, 20, -231, 61, + 177, 120, -231, 3, 121, -231, -231, -231, -231, -231, + -231, -231, -231, -231, -231, -231, -231, -231, 141, -46, + -231, 122, -231, 80, 140, 140, 216, -231, 23, -231, + 154, 267, 158, 10, 186, -231, -231, -21, 134, -231, + 157, 274, 227, 90, 138, 20, 264, 85, 143, -83, + 1, 162, 90, -231, 90, 278, 90, -231, -231, 20, + 20, 20, 20, 20, -51, 147, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 23, 240, -231, 90, -231, + -231, -231, -231, -231, 160, -231, 199, 8, 31, -231, + -39, 30, -231, 287, 23, 90, -231, 148, 111, 227, + 201, -231, -231, -39, -231, 317, -231, 4, -231, 230, + -231, -231, -231, 189, 296, 275, 275, 173, 296, 20, + 156, 61, 296, 275, 275, 85, 85, 174, 174, 174, + -231, -231, -231, -231, -231, 247, -231, -231, -231, -231, + -231, -231, 267, -231, -231, -231, 41, 46, -231, 20, + 170, 171, -231, -231, -231, -231, 225, 229, 1, 226, + -231, 198, -231, 20, 296, 61, 179, 84, -231, -231, + -231, -231, 206, -231, 4, -231, -231, 258, 175, 1, + 90, 264, 181, 93, -231, -231, 20, -231, 1, 27, + -34, -231, -231, 237, 258, 90, 90, -231, -231, 10, + -231, 10 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -834,58 +830,58 @@ static const yytype_uint8 yydefact[] = 0, 150, 39, 18, 0, 27, 27, 0, 0, 0, 0, 60, 0, 149, 0, 0, 0, 0, 1, 167, 2, 56, 57, 0, 55, 0, 81, 37, 0, 0, - 0, 0, 0, 0, 0, 64, 21, 0, 43, 138, - 77, 59, 0, 0, 35, 36, 51, 50, 4, 0, - 70, 70, 0, 52, 151, 135, 136, 140, 0, 84, - 132, 133, 137, 134, 16, 168, 0, 0, 43, 0, - 38, 0, 0, 0, 130, 0, 0, 0, 0, 139, - 0, 0, 61, 82, 155, 87, 94, 95, 96, 89, - 92, 91, 90, 104, 97, 88, 99, 101, 100, 0, - 64, 45, 69, 71, 76, 81, 81, 79, 19, 0, - 0, 26, 0, 0, 0, 63, 0, 22, 169, 0, - 0, 41, 60, 0, 0, 0, 0, 0, 103, 102, - 0, 0, 0, 64, 0, 153, 0, 0, 0, 154, - 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, - 0, 75, 74, 73, 54, 53, 0, 85, 17, 0, - 0, 0, 28, 0, 0, 42, 0, 0, 0, 131, - 0, 0, 0, 0, 98, 93, 0, 62, 141, 143, - 155, 145, 66, 83, 113, 152, 114, 123, 126, 127, - 0, 111, 0, 0, 0, 122, 124, 125, 106, 105, - 108, 107, 109, 110, 47, 46, 72, 80, 0, 32, - 33, 34, 31, 30, 24, 0, 25, 20, 170, 0, - 0, 120, 0, 0, 0, 164, 163, 157, 158, 162, - 161, 0, 0, 148, 0, 58, 0, 112, 0, 0, - 0, 23, 29, 40, 128, 0, 121, 155, 160, 159, - 146, 142, 0, 0, 129, 0, 0, 117, 115, 0, - 144, 0, 165, 68, 118, 116, 0, 147, 0, 0, - 65, 119, 166, 156, 67 + 0, 0, 0, 0, 64, 21, 0, 43, 138, 77, + 59, 0, 0, 35, 36, 51, 50, 4, 0, 70, + 70, 0, 52, 151, 135, 136, 140, 0, 84, 132, + 133, 137, 134, 17, 16, 0, 0, 43, 0, 38, + 0, 0, 0, 130, 0, 0, 0, 0, 139, 0, + 0, 61, 82, 155, 87, 94, 95, 96, 89, 92, + 91, 90, 104, 97, 88, 99, 101, 100, 0, 64, + 45, 69, 71, 76, 81, 81, 79, 19, 0, 26, + 0, 0, 0, 63, 0, 22, 169, 0, 0, 41, + 60, 0, 0, 0, 0, 0, 103, 102, 0, 0, + 0, 64, 0, 153, 0, 0, 0, 154, 86, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 44, 0, 75, + 74, 73, 54, 53, 0, 85, 0, 0, 0, 28, + 0, 0, 42, 0, 0, 0, 131, 0, 0, 0, + 0, 98, 93, 0, 62, 141, 143, 155, 145, 66, + 83, 113, 152, 114, 123, 126, 127, 0, 111, 0, + 0, 0, 122, 124, 125, 106, 105, 108, 107, 109, + 110, 47, 46, 72, 80, 0, 32, 33, 34, 31, + 30, 24, 0, 25, 20, 170, 0, 0, 120, 0, + 0, 0, 164, 163, 157, 158, 162, 161, 0, 0, + 148, 0, 58, 0, 112, 0, 0, 0, 23, 29, + 40, 128, 0, 121, 155, 160, 159, 146, 142, 0, + 0, 129, 0, 0, 117, 115, 0, 144, 0, 165, + 68, 118, 116, 0, 147, 0, 0, 65, 119, 166, + 156, 67 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -242, -242, 283, 307, 306, -242, -242, -242, -242, 109, - -242, 331, -242, 115, -242, -242, -242, -242, -242, 284, - -242, -242, 195, -93, 38, -12, -242, 329, 233, -242, - -242, -64, -242, -242, 87, -242, 198, -242, -242, 91, - -175, 194, 227, -78, -100, -242, -242, -242, -242, -242, - -242, -242, -242, -242, -242, -242, -50, -98, -242, -36, - -242, -242, -242, -241, -242, -242, -242, 0, -242, -186, - -242, -242, -242, 291, -242 + -231, -231, -231, 268, -231, -231, -231, -231, -231, -231, + 75, -231, 289, -231, 74, -231, -231, -231, -231, -231, + 234, -231, -231, 150, -158, 6, -12, -231, 272, 183, + -231, -231, -109, -231, -231, 72, -231, 149, -231, -231, + 83, -96, 146, 176, -77, -98, -231, -231, -231, -231, + -231, -231, -231, -231, -231, -231, -231, -47, -97, -231, + -35, -231, -231, -231, -230, -231, -231, -231, 0, -231, + -183, -231, -231, -231, -231, -231 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 13, 14, 15, 16, 17, 18, 19, 67, 146, - 20, 63, 201, 202, 253, 21, 22, 23, 24, 103, - 25, 130, 131, 26, 27, 28, 55, 29, 72, 111, - 163, 100, 275, 310, 56, 132, 133, 193, 41, 83, - 112, 88, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 90, 91, 92, - 128, 93, 217, 218, 291, 219, 42, 220, 169, 170, - 221, 272, 313, 50, 149 + -1, 13, 14, 15, 16, 17, 94, 18, 19, 66, + 144, 20, 62, 198, 199, 250, 21, 22, 23, 24, + 102, 25, 129, 130, 26, 27, 28, 55, 29, 71, + 110, 161, 99, 272, 307, 56, 131, 132, 191, 41, + 82, 111, 87, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 89, 90, + 91, 127, 92, 214, 215, 288, 216, 42, 217, 167, + 168, 218, 269, 310, 50, 147 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -893,102 +889,104 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 47, 134, 32, 147, 70, 165, 31, 158, 159, 89, - 43, 309, 104, 85, 86, 69, 104, 85, 86, 69, - 165, 145, 104, 85, 86, 69, 9, 85, 86, 69, - 290, 35, 161, 260, 273, 249, 99, 65, 51, 68, - 104, 85, 86, 69, 74, 75, 137, 250, 166, 138, - 46, 302, 105, 142, 30, 139, 156, 158, 36, 280, - 307, 9, 105, 97, 98, 44, 189, 168, 52, 191, - 31, 227, 228, 229, 230, 231, 232, 211, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 106, 224, 197, - 226, 151, 45, 80, 166, 192, 53, 106, 160, 222, - 54, 300, 9, 296, 251, 233, 33, 166, 150, 188, - 256, 143, 134, 168, 34, 164, 12, 252, 303, 167, - 166, 107, 40, 264, 205, 157, 168, 171, 172, 173, - 206, 107, 277, 152, 167, 153, 39, 244, 37, 168, - 174, 38, 210, 108, 109, 216, 48, 108, 109, 157, - 147, 110, 57, 108, 109, 110, 49, 89, 215, 87, - 247, 110, 285, 87, 60, 61, 1, 135, 136, 87, - 1, 108, 109, 87, 2, 58, 294, 254, 2, 110, - 62, 3, 265, 255, 262, 3, 4, 87, 171, 172, - 173, 166, 66, 5, 6, 283, 69, 5, 6, 306, - 263, 139, 7, 8, 257, 59, 7, 8, 9, 284, - 168, 175, 9, 10, 266, 164, 71, 10, 267, 171, - 172, 173, 279, 298, 268, 269, 194, 195, 73, 164, - 312, 314, 176, -166, -166, 265, 305, 11, 76, 77, - 177, 11, 164, 270, 79, 82, 178, 84, 179, 180, - 171, 172, 173, 181, 182, 183, 184, 185, 186, 183, - 184, 185, 186, 96, 99, 101, 295, 266, 171, 172, - 173, 267, 175, 102, 129, 53, 308, 268, 269, 141, - 85, 171, 172, 173, 148, 154, 276, 155, 162, 164, - 187, 190, 198, 213, 299, -165, 270, 196, 12, 199, - 200, 204, 12, 175, 203, 207, 9, 178, 209, 179, - 180, 212, 225, 214, 181, 182, 183, 184, 185, 186, - 234, 248, 258, 261, 213, 232, 274, 166, 286, 186, - 288, 278, 265, 289, 175, 287, 292, 293, 178, 297, - 179, 180, 301, 304, 95, 181, 182, 183, 184, 185, - 186, 311, 175, -166, -166, 213, 78, 281, 181, 182, - 183, 184, 185, 186, 266, 175, 94, 64, 267, 178, - 282, 179, 180, 213, 268, 269, 181, 182, 183, 184, - 185, 186, 144, 245, 81, 208, 140, 178, 246, 179, - 180, 223, -165, 270, 181, 182, 183, 184, 185, 186, - 178, 259, 179, 180, 0, 0, 0, 181, 182, 183, - 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, + 47, 133, 32, 145, 31, 69, 163, 163, 156, 157, + 43, 306, 88, 9, 103, 84, 85, 68, 46, 140, + 187, 143, 164, 103, 84, 85, 68, 84, 85, 68, + 98, 35, 159, 31, 270, 30, 246, 64, 287, 67, + 229, 166, 253, 44, 73, 74, 136, 9, 247, 150, + 33, 151, 219, 148, 154, 261, 262, 156, 36, 299, + 212, 79, 96, 97, 103, 84, 85, 68, 304, 230, + 45, 224, 225, 226, 227, 228, 208, 141, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 221, 263, 223, + 149, 195, 264, 103, 84, 85, 68, 158, 265, 266, + 186, 297, 34, 12, 104, 248, 37, 51, 164, 257, + 38, 133, 162, 9, 40, 164, 137, 267, 249, 138, + 165, 165, 202, 155, 39, 203, 48, 166, 169, 170, + 171, 274, 155, 104, 166, 277, 49, 52, 241, 105, + 207, 172, 57, 213, 59, 107, 108, 60, 145, 65, + 305, 134, 135, 109, 107, 108, 58, 88, 86, 244, + 189, 282, 109, 1, 61, 53, 68, 86, 105, 54, + 86, 2, 70, 106, 251, 291, 72, 252, 3, 293, + 169, 170, 171, 4, 280, 164, 190, 138, 78, 281, + 5, 6, 162, 75, 300, 107, 108, 260, 303, 7, + 8, 254, 106, 109, 166, 9, 81, 76, 86, 259, + 10, 83, 173, 169, 170, 171, 164, 192, 193, 276, + 181, 182, 183, 184, 107, 108, 93, 295, 309, 311, + 162, 95, 109, 174, 11, 166, 302, 86, 98, 162, + 101, 175, 100, 128, 169, 170, 171, 176, 53, 177, + 178, 84, 139, 146, 179, 180, 181, 182, 183, 184, + 152, 160, 153, 292, 173, 194, 162, 185, 188, 196, + 197, 169, 170, 171, 201, 200, 204, 206, 273, 9, + 209, 222, 245, -166, -166, 210, 211, 262, 296, 231, + 255, 258, 229, 271, 164, 12, 285, 173, 275, 176, + 286, 177, 178, 169, 170, 171, 179, 180, 181, 182, + 183, 184, 184, 283, 284, 289, 290, 77, 210, 263, + 278, 298, 294, 264, 301, 63, 279, 80, 173, 265, + 266, 142, 176, 205, 177, 178, 242, 243, 220, 179, + 180, 181, 182, 183, 184, 308, 262, -165, 267, 210, + 256, 0, 0, 0, 0, 173, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 177, 178, 0, 0, 0, + 179, 180, 181, 182, 183, 184, 210, 0, 263, 0, + 0, 0, 264, 0, 0, 0, 0, 173, 265, 266, + 176, 0, 177, 178, 0, 0, 0, 179, 180, 181, + 182, 183, 184, -166, -166, 0, -165, 267, 179, 180, + 181, 182, 183, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 177, 178, 0, 0, 0, 179, + 180, 181, 182, 183, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 271 + 0, 0, 0, 268 }; static const yytype_int16 yycheck[] = { - 12, 79, 2, 101, 40, 3, 3, 107, 108, 59, - 10, 45, 3, 4, 5, 6, 3, 4, 5, 6, - 3, 99, 3, 4, 5, 6, 52, 4, 5, 6, - 271, 73, 110, 208, 220, 28, 76, 37, 12, 39, - 3, 4, 5, 6, 44, 45, 82, 40, 105, 143, - 12, 292, 43, 84, 30, 149, 43, 157, 100, 234, - 301, 52, 43, 63, 64, 73, 130, 124, 42, 80, - 3, 171, 172, 173, 174, 175, 91, 155, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 78, 166, 139, - 168, 103, 100, 55, 105, 106, 70, 78, 110, 163, - 74, 287, 52, 278, 97, 120, 3, 105, 58, 149, - 203, 142, 190, 124, 3, 149, 142, 110, 293, 117, - 105, 112, 116, 216, 143, 112, 124, 7, 8, 9, - 149, 112, 232, 142, 117, 144, 88, 187, 84, 124, - 20, 84, 154, 134, 135, 142, 0, 134, 135, 112, - 248, 142, 3, 134, 135, 142, 145, 207, 143, 150, - 196, 142, 262, 150, 146, 147, 10, 80, 81, 150, - 10, 134, 135, 150, 18, 144, 276, 143, 18, 142, - 119, 25, 29, 149, 98, 25, 30, 150, 7, 8, - 9, 105, 107, 37, 38, 143, 6, 37, 38, 299, - 212, 149, 46, 47, 204, 142, 46, 47, 52, 143, - 124, 91, 52, 57, 61, 149, 15, 57, 65, 7, - 8, 9, 234, 143, 71, 72, 135, 136, 114, 149, - 308, 309, 112, 8, 9, 29, 143, 81, 143, 143, - 120, 81, 149, 90, 118, 66, 126, 3, 128, 129, - 7, 8, 9, 133, 134, 135, 136, 137, 138, 135, - 136, 137, 138, 112, 76, 83, 278, 61, 7, 8, - 9, 65, 91, 142, 3, 70, 123, 71, 72, 43, - 4, 7, 8, 9, 3, 142, 105, 101, 84, 149, - 126, 149, 148, 112, 82, 89, 90, 49, 142, 115, - 3, 88, 142, 91, 117, 142, 52, 126, 3, 128, - 129, 142, 3, 143, 133, 134, 135, 136, 137, 138, - 142, 83, 3, 143, 112, 91, 63, 105, 143, 138, - 71, 142, 29, 71, 91, 143, 89, 118, 126, 143, - 128, 129, 149, 143, 61, 133, 134, 135, 136, 137, - 138, 108, 91, 128, 129, 112, 49, 248, 133, 134, - 135, 136, 137, 138, 61, 91, 60, 36, 65, 126, - 255, 128, 129, 112, 71, 72, 133, 134, 135, 136, - 137, 138, 98, 188, 55, 152, 95, 126, 190, 128, - 129, 164, 89, 90, 133, 134, 135, 136, 137, 138, - 126, 207, 128, 129, -1, -1, -1, 133, 134, 135, - 136, 137, 138, -1, -1, -1, -1, -1, -1, -1, + 12, 78, 2, 100, 3, 40, 3, 3, 106, 107, + 10, 45, 59, 52, 3, 4, 5, 6, 12, 84, + 129, 98, 105, 3, 4, 5, 6, 4, 5, 6, + 76, 73, 109, 3, 217, 30, 28, 37, 268, 39, + 91, 124, 200, 73, 44, 45, 81, 52, 40, 142, + 3, 144, 161, 58, 43, 213, 29, 155, 100, 289, + 143, 55, 62, 63, 3, 4, 5, 6, 298, 120, + 100, 169, 170, 171, 172, 173, 153, 142, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 164, 61, 166, + 102, 138, 65, 3, 4, 5, 6, 109, 71, 72, + 146, 284, 3, 142, 43, 97, 84, 12, 105, 205, + 84, 188, 146, 52, 116, 105, 143, 90, 110, 146, + 117, 117, 143, 112, 88, 146, 0, 124, 7, 8, + 9, 229, 112, 43, 124, 231, 145, 42, 185, 78, + 152, 20, 3, 142, 142, 134, 135, 84, 245, 107, + 123, 79, 80, 142, 134, 135, 144, 204, 147, 194, + 80, 259, 142, 10, 119, 70, 6, 147, 78, 74, + 147, 18, 15, 112, 143, 273, 114, 146, 25, 275, + 7, 8, 9, 30, 143, 105, 106, 146, 118, 143, + 37, 38, 146, 143, 290, 134, 135, 209, 296, 46, + 47, 201, 112, 142, 124, 52, 66, 143, 147, 98, + 57, 3, 91, 7, 8, 9, 105, 134, 135, 231, + 135, 136, 137, 138, 134, 135, 4, 143, 305, 306, + 146, 112, 142, 112, 81, 124, 143, 147, 76, 146, + 142, 120, 83, 3, 7, 8, 9, 126, 70, 128, + 129, 4, 43, 3, 133, 134, 135, 136, 137, 138, + 142, 84, 101, 275, 91, 49, 146, 126, 146, 115, + 3, 7, 8, 9, 88, 117, 142, 3, 105, 52, + 142, 3, 83, 8, 9, 112, 143, 29, 82, 142, + 3, 143, 91, 63, 105, 142, 71, 91, 142, 126, + 71, 128, 129, 7, 8, 9, 133, 134, 135, 136, + 137, 138, 138, 143, 143, 89, 118, 49, 112, 61, + 245, 146, 143, 65, 143, 36, 252, 55, 91, 71, + 72, 97, 126, 150, 128, 129, 186, 188, 162, 133, + 134, 135, 136, 137, 138, 108, 29, 89, 90, 112, + 204, -1, -1, -1, -1, 91, -1, -1, -1, -1, + -1, -1, -1, 126, -1, 128, 129, -1, -1, -1, + 133, 134, 135, 136, 137, 138, 112, -1, 61, -1, + -1, -1, 65, -1, -1, -1, -1, 91, 71, 72, + 126, -1, 128, 129, -1, -1, -1, 133, 134, 135, + 136, 137, 138, 128, 129, -1, 89, 90, 133, 134, + 135, 136, 137, 138, -1, -1, -1, -1, -1, -1, + -1, -1, 126, -1, 128, 129, -1, -1, -1, 133, + 134, 135, 136, 137, 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 149 + -1, -1, -1, 146 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -996,67 +994,67 @@ static const yytype_int16 yycheck[] = static const yytype_uint8 yystos[] = { 0, 10, 18, 25, 30, 37, 38, 46, 47, 52, - 57, 81, 142, 152, 153, 154, 155, 156, 157, 158, - 161, 166, 167, 168, 169, 171, 174, 175, 176, 178, - 30, 3, 218, 3, 3, 73, 100, 84, 84, 88, - 116, 189, 217, 218, 73, 100, 175, 176, 0, 145, - 224, 12, 42, 70, 74, 177, 185, 3, 144, 142, - 146, 147, 119, 162, 162, 218, 107, 159, 218, 6, - 210, 15, 179, 114, 218, 218, 143, 143, 154, 118, - 175, 178, 66, 190, 3, 4, 5, 150, 192, 207, - 208, 209, 210, 212, 155, 153, 112, 218, 218, 76, - 182, 83, 142, 170, 3, 43, 78, 112, 134, 135, - 142, 180, 191, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 211, 3, - 172, 173, 186, 187, 194, 185, 185, 210, 143, 149, - 224, 43, 84, 142, 170, 194, 160, 208, 3, 225, - 58, 176, 142, 144, 142, 101, 43, 112, 195, 195, - 176, 194, 84, 181, 149, 3, 105, 117, 124, 219, - 220, 7, 8, 9, 20, 91, 112, 120, 126, 128, - 129, 133, 134, 135, 136, 137, 138, 126, 149, 182, - 149, 80, 106, 188, 190, 190, 49, 207, 148, 115, - 3, 163, 164, 117, 88, 143, 149, 142, 179, 3, - 176, 194, 142, 112, 143, 143, 142, 213, 214, 216, - 218, 221, 182, 193, 194, 3, 194, 195, 195, 195, - 195, 195, 91, 120, 142, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 207, 173, 187, 210, 83, 28, - 40, 97, 110, 165, 143, 149, 174, 218, 3, 192, - 191, 143, 98, 176, 174, 29, 61, 65, 71, 72, - 90, 149, 222, 220, 63, 183, 105, 195, 142, 176, - 191, 160, 164, 143, 143, 195, 143, 143, 71, 71, - 214, 215, 89, 118, 195, 176, 191, 143, 143, 82, - 220, 149, 214, 191, 143, 143, 195, 214, 123, 45, - 184, 108, 194, 223, 194 + 57, 81, 142, 149, 150, 151, 152, 153, 155, 156, + 159, 164, 165, 166, 167, 169, 172, 173, 174, 176, + 30, 3, 216, 3, 3, 73, 100, 84, 84, 88, + 116, 187, 215, 216, 73, 100, 173, 174, 0, 145, + 222, 12, 42, 70, 74, 175, 183, 3, 144, 142, + 84, 119, 160, 160, 216, 107, 157, 216, 6, 208, + 15, 177, 114, 216, 216, 143, 143, 151, 118, 173, + 176, 66, 188, 3, 4, 5, 147, 190, 205, 206, + 207, 208, 210, 4, 154, 112, 216, 216, 76, 180, + 83, 142, 168, 3, 43, 78, 112, 134, 135, 142, + 178, 189, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 209, 3, 170, + 171, 184, 185, 192, 183, 183, 208, 143, 146, 43, + 84, 142, 168, 192, 158, 206, 3, 223, 58, 174, + 142, 144, 142, 101, 43, 112, 193, 193, 174, 192, + 84, 179, 146, 3, 105, 117, 124, 217, 218, 7, + 8, 9, 20, 91, 112, 120, 126, 128, 129, 133, + 134, 135, 136, 137, 138, 126, 146, 180, 146, 80, + 106, 186, 188, 188, 49, 205, 115, 3, 161, 162, + 117, 88, 143, 146, 142, 177, 3, 174, 192, 142, + 112, 143, 143, 142, 211, 212, 214, 216, 219, 180, + 191, 192, 3, 192, 193, 193, 193, 193, 193, 91, + 120, 142, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 205, 171, 185, 208, 83, 28, 40, 97, 110, + 163, 143, 146, 172, 216, 3, 190, 189, 143, 98, + 174, 172, 29, 61, 65, 71, 72, 90, 146, 220, + 218, 63, 181, 105, 193, 142, 174, 189, 158, 162, + 143, 143, 193, 143, 143, 71, 71, 212, 213, 89, + 118, 193, 174, 189, 143, 143, 82, 218, 146, 212, + 189, 143, 143, 193, 212, 123, 45, 182, 108, 192, + 221, 192 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 151, 152, 153, 153, 154, 154, 155, 155, 155, - 155, 155, 155, 155, 155, 155, 156, 156, 157, 157, - 158, 159, 160, 161, 161, 161, 162, 162, 163, 163, - 164, 165, 165, 165, 165, 166, 166, 166, 167, 168, - 169, 169, 170, 170, 171, 172, 172, 173, 174, 174, - 175, 175, 176, 176, 176, 177, 177, 177, 178, 179, - 179, 180, 181, 182, 182, 183, 183, 184, 184, 185, - 185, 186, 186, 187, 188, 188, 188, 189, 189, 190, - 190, 190, 191, 191, 192, 192, 193, 194, 194, 194, - 194, 194, 194, 195, 195, 195, 195, 195, 195, 196, - 196, 196, 197, 197, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 199, 199, 200, 200, 200, 200, 201, - 202, 202, 203, 203, 203, 203, 203, 203, 204, 205, - 206, 206, 207, 207, 207, 208, 209, 209, 210, 211, - 212, 213, 213, 214, 214, 214, 215, 215, 216, 217, - 218, 218, 219, 219, 220, 220, 221, 222, 222, 222, - 222, 222, 222, 222, 222, 222, 223, 224, 224, 225, - 225 + 0, 148, 149, 150, 150, 151, 151, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 153, 154, 155, 155, + 156, 157, 158, 159, 159, 159, 160, 160, 161, 161, + 162, 163, 163, 163, 163, 164, 164, 164, 165, 166, + 167, 167, 168, 168, 169, 170, 170, 171, 172, 172, + 173, 173, 174, 174, 174, 175, 175, 175, 176, 177, + 177, 178, 179, 180, 180, 181, 181, 182, 182, 183, + 183, 184, 184, 185, 186, 186, 186, 187, 187, 188, + 188, 188, 189, 189, 190, 190, 191, 192, 192, 192, + 192, 192, 192, 193, 193, 193, 193, 193, 193, 194, + 194, 194, 195, 195, 196, 196, 196, 196, 196, 196, + 196, 196, 196, 197, 197, 198, 198, 198, 198, 199, + 200, 200, 201, 201, 201, 201, 201, 201, 202, 203, + 204, 204, 205, 205, 205, 206, 207, 207, 208, 209, + 210, 211, 211, 212, 212, 212, 213, 213, 214, 215, + 216, 216, 217, 217, 218, 218, 219, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 221, 222, 222, 223, + 223 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 1, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 4, 6, 2, 5, + 1, 1, 1, 1, 1, 1, 4, 1, 2, 5, 7, 1, 1, 8, 7, 7, 3, 0, 1, 3, 2, 1, 1, 1, 1, 3, 3, 3, 4, 2, 8, 5, 3, 0, 5, 1, 3, 3, 1, 1, @@ -1569,49 +1567,49 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio switch (yytype) { case 3: /* IDENTIFIER */ -#line 137 "bison_parser.y" /* yacc.c:1257 */ +#line 134 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 1575 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1573 "bison_parser.cpp" /* yacc.c:1257 */ break; case 4: /* STRING */ -#line 137 "bison_parser.y" /* yacc.c:1257 */ +#line 134 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 1581 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1579 "bison_parser.cpp" /* yacc.c:1257 */ break; case 5: /* FLOATVAL */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1587 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1585 "bison_parser.cpp" /* yacc.c:1257 */ break; case 6: /* INTVAL */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1593 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1591 "bison_parser.cpp" /* yacc.c:1257 */ break; case 7: /* NOTEQUALS */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1599 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1597 "bison_parser.cpp" /* yacc.c:1257 */ break; case 8: /* LESSEQ */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1605 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1603 "bison_parser.cpp" /* yacc.c:1257 */ break; case 9: /* GREATEREQ */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1611 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1609 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 153: /* statement_list */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 150: /* statement_list */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).stmt_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).stmt_vec))) { @@ -1620,65 +1618,71 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).stmt_vec)); } -#line 1624 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1622 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 154: /* statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 151: /* statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).statement)); } -#line 1630 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1628 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 155: /* preparable_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 152: /* preparable_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).statement)); } -#line 1636 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1634 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 156: /* prepare_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 153: /* prepare_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).prep_stmt)); } -#line 1642 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1640 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 157: /* execute_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ - { delete (((*yyvaluep).exec_stmt)); } -#line 1648 "bison_parser.cpp" /* yacc.c:1257 */ - break; - - case 158: /* import_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ - { delete (((*yyvaluep).import_stmt)); } -#line 1654 "bison_parser.cpp" /* yacc.c:1257 */ - break; - - case 159: /* import_file_type */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ - { } -#line 1660 "bison_parser.cpp" /* yacc.c:1257 */ - break; - - case 160: /* file_path */ -#line 137 "bison_parser.y" /* yacc.c:1257 */ + case 154: /* prepare_target_query */ +#line 134 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 1666 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1646 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 161: /* create_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ - { delete (((*yyvaluep).create_stmt)); } -#line 1672 "bison_parser.cpp" /* yacc.c:1257 */ + case 155: /* execute_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ + { delete (((*yyvaluep).exec_stmt)); } +#line 1652 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 162: /* opt_not_exists */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ + case 156: /* import_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ + { delete (((*yyvaluep).import_stmt)); } +#line 1658 "bison_parser.cpp" /* yacc.c:1257 */ + break; + + case 157: /* import_file_type */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1678 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1664 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 163: /* column_def_commalist */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 158: /* file_path */ +#line 134 "bison_parser.y" /* yacc.c:1257 */ + { free( (((*yyvaluep).sval)) ); } +#line 1670 "bison_parser.cpp" /* yacc.c:1257 */ + break; + + case 159: /* create_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ + { delete (((*yyvaluep).create_stmt)); } +#line 1676 "bison_parser.cpp" /* yacc.c:1257 */ + break; + + case 160: /* opt_not_exists */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ + { } +#line 1682 "bison_parser.cpp" /* yacc.c:1257 */ + break; + + case 161: /* column_def_commalist */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).column_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).column_vec))) { @@ -1687,47 +1691,47 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).column_vec)); } -#line 1691 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1695 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 164: /* column_def */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 162: /* column_def */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).column_t)); } -#line 1697 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1701 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 165: /* column_type */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ + case 163: /* column_type */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1703 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1707 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 166: /* drop_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 164: /* drop_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).drop_stmt)); } -#line 1709 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1713 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 167: /* delete_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 165: /* delete_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).delete_stmt)); } -#line 1715 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1719 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 168: /* truncate_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 166: /* truncate_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).delete_stmt)); } -#line 1721 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1725 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 169: /* insert_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 167: /* insert_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).insert_stmt)); } -#line 1727 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1731 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 170: /* opt_column_list */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 168: /* opt_column_list */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).str_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).str_vec))) { @@ -1736,17 +1740,17 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).str_vec)); } -#line 1740 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1744 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 171: /* update_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 169: /* update_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).update_stmt)); } -#line 1746 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1750 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 172: /* update_clause_commalist */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 170: /* update_clause_commalist */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).update_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).update_vec))) { @@ -1755,47 +1759,47 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).update_vec)); } -#line 1759 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1763 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 173: /* update_clause */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 171: /* update_clause */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).update_t)); } -#line 1765 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1769 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 174: /* select_statement */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 172: /* select_statement */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).select_stmt)); } -#line 1771 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1775 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 175: /* select_with_paren */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 173: /* select_with_paren */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).select_stmt)); } -#line 1777 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1781 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 176: /* select_no_paren */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 174: /* select_no_paren */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).select_stmt)); } -#line 1783 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1787 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 178: /* select_clause */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 176: /* select_clause */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).select_stmt)); } -#line 1789 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1793 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 179: /* opt_distinct */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ + case 177: /* opt_distinct */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1795 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1799 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 180: /* select_list */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 178: /* select_list */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).expr_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -1804,35 +1808,35 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 1808 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1812 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 181: /* from_clause */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 179: /* from_clause */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 1814 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1818 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 182: /* opt_where */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 180: /* opt_where */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1820 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1824 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 183: /* opt_group */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 181: /* opt_group */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).group_t)); } -#line 1826 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1830 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 184: /* opt_having */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 182: /* opt_having */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1832 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1836 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 185: /* opt_order */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 183: /* opt_order */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).order_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).order_vec))) { @@ -1841,11 +1845,11 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).order_vec)); } -#line 1845 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1849 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 186: /* order_list */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 184: /* order_list */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).order_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).order_vec))) { @@ -1854,35 +1858,35 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).order_vec)); } -#line 1858 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1862 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 187: /* order_desc */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 185: /* order_desc */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).order)); } -#line 1864 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1868 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 188: /* opt_order_type */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ + case 186: /* opt_order_type */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1870 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1874 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 189: /* opt_top */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 187: /* opt_top */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).limit)); } -#line 1876 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1880 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 190: /* opt_limit */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 188: /* opt_limit */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).limit)); } -#line 1882 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1886 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 191: /* expr_list */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 189: /* expr_list */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).expr_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -1891,11 +1895,11 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 1895 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1899 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 192: /* literal_list */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 190: /* literal_list */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).expr_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -1904,143 +1908,143 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 1908 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1912 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 193: /* expr_alias */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 191: /* expr_alias */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1914 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1918 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 194: /* expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 192: /* expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1920 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1924 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 195: /* operand */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 193: /* operand */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1926 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1930 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 196: /* scalar_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 194: /* scalar_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1932 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1936 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 197: /* unary_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 195: /* unary_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1938 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1942 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 198: /* binary_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 196: /* binary_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1944 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1948 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 199: /* logic_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 197: /* logic_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1950 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1954 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 200: /* in_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 198: /* in_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1956 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1960 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 201: /* case_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 199: /* case_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1962 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1966 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 202: /* exists_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 200: /* exists_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1968 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1972 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 203: /* comp_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 201: /* comp_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1974 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1978 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 204: /* function_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 202: /* function_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1980 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1984 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 205: /* between_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 203: /* between_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1986 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1990 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 206: /* column_name */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 204: /* column_name */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1992 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1996 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 207: /* literal */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 205: /* literal */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1998 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2002 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 208: /* string_literal */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 206: /* string_literal */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2004 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2008 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 209: /* num_literal */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 207: /* num_literal */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2010 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2014 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 210: /* int_literal */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 208: /* int_literal */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2016 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2020 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 211: /* star_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 209: /* star_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2022 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2026 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 212: /* placeholder_expr */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 210: /* param_expr */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2028 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2032 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 213: /* table_ref */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 211: /* table_ref */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2034 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2038 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 214: /* table_ref_atomic */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 212: /* table_ref_atomic */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2040 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2044 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 215: /* table_ref_commalist */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 213: /* table_ref_commalist */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).table_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).table_vec))) { @@ -2049,59 +2053,59 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).table_vec)); } -#line 2053 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2057 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 216: /* table_ref_name */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 214: /* table_ref_name */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2059 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2063 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 217: /* table_ref_name_no_alias */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 215: /* table_ref_name_no_alias */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2065 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2069 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 218: /* table_name */ -#line 137 "bison_parser.y" /* yacc.c:1257 */ + case 216: /* table_name */ +#line 134 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 2071 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2075 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 219: /* alias */ -#line 137 "bison_parser.y" /* yacc.c:1257 */ + case 217: /* alias */ +#line 134 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 2077 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2081 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 220: /* opt_alias */ -#line 137 "bison_parser.y" /* yacc.c:1257 */ + case 218: /* opt_alias */ +#line 134 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 2083 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2087 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 221: /* join_clause */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 219: /* join_clause */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2089 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2093 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 222: /* opt_join_type */ -#line 136 "bison_parser.y" /* yacc.c:1257 */ + case 220: /* opt_join_type */ +#line 133 "bison_parser.y" /* yacc.c:1257 */ { } -#line 2095 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2099 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 223: /* join_condition */ -#line 146 "bison_parser.y" /* yacc.c:1257 */ + case 221: /* join_condition */ +#line 143 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2101 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2105 "bison_parser.cpp" /* yacc.c:1257 */ break; - case 225: /* ident_commalist */ -#line 138 "bison_parser.y" /* yacc.c:1257 */ + case 223: /* ident_commalist */ +#line 135 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).str_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).str_vec))) { @@ -2110,7 +2114,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).str_vec)); } -#line 2114 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2118 "bison_parser.cpp" /* yacc.c:1257 */ break; @@ -2218,7 +2222,7 @@ YYLTYPE yylloc = yyloc_default; yychar = YYEMPTY; /* Cause a token to be read. */ /* User initialization code. */ -#line 73 "bison_parser.y" /* yacc.c:1429 */ +#line 71 "bison_parser.y" /* yacc.c:1429 */ { // Initialize yylloc.first_column = 0; @@ -2226,10 +2230,9 @@ YYLTYPE yylloc = yyloc_default; yylloc.first_line = 0; yylloc.last_line = 0; yylloc.total_column = 0; - yylloc.placeholder_id = 0; } -#line 2233 "bison_parser.cpp" /* yacc.c:1429 */ +#line 2236 "bison_parser.cpp" /* yacc.c:1429 */ yylsp[0] = yylloc; goto yysetstate; @@ -2416,182 +2419,168 @@ yyreduce: switch (yyn) { case 2: -#line 240 "bison_parser.y" /* yacc.c:1646 */ +#line 237 "bison_parser.y" /* yacc.c:1646 */ { - for (SQLStatement* stmt : *(yyvsp[-1].stmt_vec)) { - // Transfers ownership of the statement. - result->addStatement(stmt); - } - delete (yyvsp[-1].stmt_vec); + for (SQLStatement* stmt : *(yyvsp[-1].stmt_vec)) { + // Transfers ownership of the statement. + result->addStatement(stmt); + } + + unsigned param_id = 0; + for (void* param : yyloc.param_list) { + if (param != nullptr) { + Expr* expr = (Expr*) param; + expr->ival = param_id; + result->addParameter(expr); + ++param_id; + } + } + delete (yyvsp[-1].stmt_vec); } -#line 2428 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2441 "bison_parser.cpp" /* yacc.c:1646 */ break; case 3: -#line 251 "bison_parser.y" /* yacc.c:1646 */ +#line 258 "bison_parser.y" /* yacc.c:1646 */ { (yyval.stmt_vec) = new std::vector(); (yyval.stmt_vec)->push_back((yyvsp[0].statement)); } -#line 2434 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2447 "bison_parser.cpp" /* yacc.c:1646 */ break; case 4: -#line 252 "bison_parser.y" /* yacc.c:1646 */ +#line 259 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].stmt_vec)->push_back((yyvsp[0].statement)); (yyval.stmt_vec) = (yyvsp[-2].stmt_vec); } -#line 2440 "bison_parser.cpp" /* yacc.c:1646 */ - break; - - case 5: -#line 256 "bison_parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].prep_stmt)->setPlaceholders(yyloc.placeholder_list); - yyloc.placeholder_list.clear(); - (yyval.statement) = (yyvsp[0].prep_stmt); - } -#line 2450 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2453 "bison_parser.cpp" /* yacc.c:1646 */ break; case 7: -#line 266 "bison_parser.y" /* yacc.c:1646 */ +#line 269 "bison_parser.y" /* yacc.c:1646 */ { (yyval.statement) = (yyvsp[0].select_stmt); } -#line 2456 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2459 "bison_parser.cpp" /* yacc.c:1646 */ break; case 8: -#line 267 "bison_parser.y" /* yacc.c:1646 */ +#line 270 "bison_parser.y" /* yacc.c:1646 */ { (yyval.statement) = (yyvsp[0].import_stmt); } -#line 2462 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2465 "bison_parser.cpp" /* yacc.c:1646 */ break; case 9: -#line 268 "bison_parser.y" /* yacc.c:1646 */ +#line 271 "bison_parser.y" /* yacc.c:1646 */ { (yyval.statement) = (yyvsp[0].create_stmt); } -#line 2468 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2471 "bison_parser.cpp" /* yacc.c:1646 */ break; case 10: -#line 269 "bison_parser.y" /* yacc.c:1646 */ +#line 272 "bison_parser.y" /* yacc.c:1646 */ { (yyval.statement) = (yyvsp[0].insert_stmt); } -#line 2474 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2477 "bison_parser.cpp" /* yacc.c:1646 */ break; case 11: -#line 270 "bison_parser.y" /* yacc.c:1646 */ +#line 273 "bison_parser.y" /* yacc.c:1646 */ { (yyval.statement) = (yyvsp[0].delete_stmt); } -#line 2480 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2483 "bison_parser.cpp" /* yacc.c:1646 */ break; case 12: -#line 271 "bison_parser.y" /* yacc.c:1646 */ +#line 274 "bison_parser.y" /* yacc.c:1646 */ { (yyval.statement) = (yyvsp[0].delete_stmt); } -#line 2486 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2489 "bison_parser.cpp" /* yacc.c:1646 */ break; case 13: -#line 272 "bison_parser.y" /* yacc.c:1646 */ +#line 275 "bison_parser.y" /* yacc.c:1646 */ { (yyval.statement) = (yyvsp[0].update_stmt); } -#line 2492 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2495 "bison_parser.cpp" /* yacc.c:1646 */ break; case 14: -#line 273 "bison_parser.y" /* yacc.c:1646 */ +#line 276 "bison_parser.y" /* yacc.c:1646 */ { (yyval.statement) = (yyvsp[0].drop_stmt); } -#line 2498 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2501 "bison_parser.cpp" /* yacc.c:1646 */ break; case 15: -#line 274 "bison_parser.y" /* yacc.c:1646 */ +#line 277 "bison_parser.y" /* yacc.c:1646 */ { (yyval.statement) = (yyvsp[0].exec_stmt); } -#line 2504 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2507 "bison_parser.cpp" /* yacc.c:1646 */ break; case 16: -#line 282 "bison_parser.y" /* yacc.c:1646 */ +#line 285 "bison_parser.y" /* yacc.c:1646 */ { (yyval.prep_stmt) = new PrepareStatement(); (yyval.prep_stmt)->name = (yyvsp[-2].sval); - (yyval.prep_stmt)->query = new SQLParserResult((yyvsp[0].statement)); + (yyval.prep_stmt)->query = (yyvsp[0].sval); } -#line 2514 "bison_parser.cpp" /* yacc.c:1646 */ - break; - - case 17: -#line 287 "bison_parser.y" /* yacc.c:1646 */ - { - (yyval.prep_stmt) = new PrepareStatement(); - (yyval.prep_stmt)->name = (yyvsp[-4].sval); - (yyval.prep_stmt)->query = new SQLParserResult(); - for (SQLStatement* stmt : *(yyvsp[-2].stmt_vec)) { - (yyval.prep_stmt)->query->addStatement(stmt); - } - delete (yyvsp[-2].stmt_vec); - } -#line 2528 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2517 "bison_parser.cpp" /* yacc.c:1646 */ break; case 18: -#line 299 "bison_parser.y" /* yacc.c:1646 */ +#line 295 "bison_parser.y" /* yacc.c:1646 */ { (yyval.exec_stmt) = new ExecuteStatement(); (yyval.exec_stmt)->name = (yyvsp[0].sval); } -#line 2537 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2526 "bison_parser.cpp" /* yacc.c:1646 */ break; case 19: -#line 303 "bison_parser.y" /* yacc.c:1646 */ +#line 299 "bison_parser.y" /* yacc.c:1646 */ { (yyval.exec_stmt) = new ExecuteStatement(); (yyval.exec_stmt)->name = (yyvsp[-3].sval); (yyval.exec_stmt)->parameters = (yyvsp[-1].expr_vec); } -#line 2547 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2536 "bison_parser.cpp" /* yacc.c:1646 */ break; case 20: -#line 315 "bison_parser.y" /* yacc.c:1646 */ +#line 311 "bison_parser.y" /* yacc.c:1646 */ { (yyval.import_stmt) = new ImportStatement((ImportType) (yyvsp[-4].uval)); (yyval.import_stmt)->filePath = (yyvsp[-2].sval); (yyval.import_stmt)->tableName = (yyvsp[0].sval); } -#line 2557 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2546 "bison_parser.cpp" /* yacc.c:1646 */ break; case 21: -#line 323 "bison_parser.y" /* yacc.c:1646 */ +#line 319 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kImportCSV; } -#line 2563 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2552 "bison_parser.cpp" /* yacc.c:1646 */ break; case 22: -#line 327 "bison_parser.y" /* yacc.c:1646 */ +#line 323 "bison_parser.y" /* yacc.c:1646 */ { (yyval.sval) = strdup((yyvsp[0].expr)->name); delete (yyvsp[0].expr); } -#line 2569 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2558 "bison_parser.cpp" /* yacc.c:1646 */ break; case 23: -#line 337 "bison_parser.y" /* yacc.c:1646 */ +#line 333 "bison_parser.y" /* yacc.c:1646 */ { (yyval.create_stmt) = new CreateStatement(kCreateTableFromTbl); (yyval.create_stmt)->ifNotExists = (yyvsp[-5].bval); (yyval.create_stmt)->tableName = (yyvsp[-4].sval); (yyval.create_stmt)->filePath = (yyvsp[0].sval); } -#line 2580 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2569 "bison_parser.cpp" /* yacc.c:1646 */ break; case 24: -#line 343 "bison_parser.y" /* yacc.c:1646 */ +#line 339 "bison_parser.y" /* yacc.c:1646 */ { (yyval.create_stmt) = new CreateStatement(kCreateTable); (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); (yyval.create_stmt)->tableName = (yyvsp[-3].sval); (yyval.create_stmt)->columns = (yyvsp[-1].column_vec); } -#line 2591 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2580 "bison_parser.cpp" /* yacc.c:1646 */ break; case 25: -#line 349 "bison_parser.y" /* yacc.c:1646 */ +#line 345 "bison_parser.y" /* yacc.c:1646 */ { (yyval.create_stmt) = new CreateStatement(kCreateView); (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); @@ -2599,192 +2588,192 @@ yyreduce: (yyval.create_stmt)->viewColumns = (yyvsp[-2].str_vec); (yyval.create_stmt)->select = (yyvsp[0].select_stmt); } -#line 2603 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2592 "bison_parser.cpp" /* yacc.c:1646 */ break; case 26: -#line 359 "bison_parser.y" /* yacc.c:1646 */ +#line 355 "bison_parser.y" /* yacc.c:1646 */ { (yyval.bval) = true; } -#line 2609 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2598 "bison_parser.cpp" /* yacc.c:1646 */ break; case 27: -#line 360 "bison_parser.y" /* yacc.c:1646 */ +#line 356 "bison_parser.y" /* yacc.c:1646 */ { (yyval.bval) = false; } -#line 2615 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2604 "bison_parser.cpp" /* yacc.c:1646 */ break; case 28: -#line 364 "bison_parser.y" /* yacc.c:1646 */ +#line 360 "bison_parser.y" /* yacc.c:1646 */ { (yyval.column_vec) = new std::vector(); (yyval.column_vec)->push_back((yyvsp[0].column_t)); } -#line 2621 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2610 "bison_parser.cpp" /* yacc.c:1646 */ break; case 29: -#line 365 "bison_parser.y" /* yacc.c:1646 */ +#line 361 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].column_vec)->push_back((yyvsp[0].column_t)); (yyval.column_vec) = (yyvsp[-2].column_vec); } -#line 2627 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2616 "bison_parser.cpp" /* yacc.c:1646 */ break; case 30: -#line 369 "bison_parser.y" /* yacc.c:1646 */ +#line 365 "bison_parser.y" /* yacc.c:1646 */ { (yyval.column_t) = new ColumnDefinition((yyvsp[-1].sval), (ColumnDefinition::DataType) (yyvsp[0].uval)); } -#line 2635 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2624 "bison_parser.cpp" /* yacc.c:1646 */ break; case 31: -#line 376 "bison_parser.y" /* yacc.c:1646 */ +#line 372 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = ColumnDefinition::INT; } -#line 2641 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2630 "bison_parser.cpp" /* yacc.c:1646 */ break; case 32: -#line 377 "bison_parser.y" /* yacc.c:1646 */ +#line 373 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = ColumnDefinition::INT; } -#line 2647 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2636 "bison_parser.cpp" /* yacc.c:1646 */ break; case 33: -#line 378 "bison_parser.y" /* yacc.c:1646 */ +#line 374 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = ColumnDefinition::DOUBLE; } -#line 2653 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2642 "bison_parser.cpp" /* yacc.c:1646 */ break; case 34: -#line 379 "bison_parser.y" /* yacc.c:1646 */ +#line 375 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = ColumnDefinition::TEXT; } -#line 2659 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2648 "bison_parser.cpp" /* yacc.c:1646 */ break; case 35: -#line 389 "bison_parser.y" /* yacc.c:1646 */ +#line 385 "bison_parser.y" /* yacc.c:1646 */ { (yyval.drop_stmt) = new DropStatement(kDropTable); (yyval.drop_stmt)->name = (yyvsp[0].sval); } -#line 2668 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2657 "bison_parser.cpp" /* yacc.c:1646 */ break; case 36: -#line 393 "bison_parser.y" /* yacc.c:1646 */ +#line 389 "bison_parser.y" /* yacc.c:1646 */ { (yyval.drop_stmt) = new DropStatement(kDropView); (yyval.drop_stmt)->name = (yyvsp[0].sval); } -#line 2677 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2666 "bison_parser.cpp" /* yacc.c:1646 */ break; case 37: -#line 397 "bison_parser.y" /* yacc.c:1646 */ +#line 393 "bison_parser.y" /* yacc.c:1646 */ { (yyval.drop_stmt) = new DropStatement(kDropPreparedStatement); (yyval.drop_stmt)->name = (yyvsp[0].sval); } -#line 2686 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2675 "bison_parser.cpp" /* yacc.c:1646 */ break; case 38: -#line 409 "bison_parser.y" /* yacc.c:1646 */ +#line 405 "bison_parser.y" /* yacc.c:1646 */ { (yyval.delete_stmt) = new DeleteStatement(); (yyval.delete_stmt)->tableName = (yyvsp[-1].sval); (yyval.delete_stmt)->expr = (yyvsp[0].expr); } -#line 2696 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2685 "bison_parser.cpp" /* yacc.c:1646 */ break; case 39: -#line 417 "bison_parser.y" /* yacc.c:1646 */ +#line 413 "bison_parser.y" /* yacc.c:1646 */ { (yyval.delete_stmt) = new DeleteStatement(); (yyval.delete_stmt)->tableName = (yyvsp[0].sval); } -#line 2705 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2694 "bison_parser.cpp" /* yacc.c:1646 */ break; case 40: -#line 429 "bison_parser.y" /* yacc.c:1646 */ +#line 425 "bison_parser.y" /* yacc.c:1646 */ { (yyval.insert_stmt) = new InsertStatement(kInsertValues); (yyval.insert_stmt)->tableName = (yyvsp[-5].sval); (yyval.insert_stmt)->columns = (yyvsp[-4].str_vec); (yyval.insert_stmt)->values = (yyvsp[-1].expr_vec); } -#line 2716 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2705 "bison_parser.cpp" /* yacc.c:1646 */ break; case 41: -#line 435 "bison_parser.y" /* yacc.c:1646 */ +#line 431 "bison_parser.y" /* yacc.c:1646 */ { (yyval.insert_stmt) = new InsertStatement(kInsertSelect); (yyval.insert_stmt)->tableName = (yyvsp[-2].sval); (yyval.insert_stmt)->columns = (yyvsp[-1].str_vec); (yyval.insert_stmt)->select = (yyvsp[0].select_stmt); } -#line 2727 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2716 "bison_parser.cpp" /* yacc.c:1646 */ break; case 42: -#line 445 "bison_parser.y" /* yacc.c:1646 */ +#line 441 "bison_parser.y" /* yacc.c:1646 */ { (yyval.str_vec) = (yyvsp[-1].str_vec); } -#line 2733 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2722 "bison_parser.cpp" /* yacc.c:1646 */ break; case 43: -#line 446 "bison_parser.y" /* yacc.c:1646 */ +#line 442 "bison_parser.y" /* yacc.c:1646 */ { (yyval.str_vec) = NULL; } -#line 2739 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2728 "bison_parser.cpp" /* yacc.c:1646 */ break; case 44: -#line 456 "bison_parser.y" /* yacc.c:1646 */ +#line 452 "bison_parser.y" /* yacc.c:1646 */ { (yyval.update_stmt) = new UpdateStatement(); (yyval.update_stmt)->table = (yyvsp[-3].table); (yyval.update_stmt)->updates = (yyvsp[-1].update_vec); (yyval.update_stmt)->where = (yyvsp[0].expr); } -#line 2750 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2739 "bison_parser.cpp" /* yacc.c:1646 */ break; case 45: -#line 465 "bison_parser.y" /* yacc.c:1646 */ +#line 461 "bison_parser.y" /* yacc.c:1646 */ { (yyval.update_vec) = new std::vector(); (yyval.update_vec)->push_back((yyvsp[0].update_t)); } -#line 2756 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2745 "bison_parser.cpp" /* yacc.c:1646 */ break; case 46: -#line 466 "bison_parser.y" /* yacc.c:1646 */ +#line 462 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].update_vec)->push_back((yyvsp[0].update_t)); (yyval.update_vec) = (yyvsp[-2].update_vec); } -#line 2762 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2751 "bison_parser.cpp" /* yacc.c:1646 */ break; case 47: -#line 470 "bison_parser.y" /* yacc.c:1646 */ +#line 466 "bison_parser.y" /* yacc.c:1646 */ { (yyval.update_t) = new UpdateClause(); (yyval.update_t)->column = (yyvsp[-2].sval); (yyval.update_t)->value = (yyvsp[0].expr); } -#line 2772 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2761 "bison_parser.cpp" /* yacc.c:1646 */ break; case 50: -#line 487 "bison_parser.y" /* yacc.c:1646 */ +#line 483 "bison_parser.y" /* yacc.c:1646 */ { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } -#line 2778 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2767 "bison_parser.cpp" /* yacc.c:1646 */ break; case 51: -#line 488 "bison_parser.y" /* yacc.c:1646 */ +#line 484 "bison_parser.y" /* yacc.c:1646 */ { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } -#line 2784 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2773 "bison_parser.cpp" /* yacc.c:1646 */ break; case 52: -#line 492 "bison_parser.y" /* yacc.c:1646 */ +#line 488 "bison_parser.y" /* yacc.c:1646 */ { (yyval.select_stmt) = (yyvsp[-2].select_stmt); (yyval.select_stmt)->order = (yyvsp[-1].order_vec); @@ -2795,11 +2784,11 @@ yyreduce: (yyval.select_stmt)->limit = (yyvsp[0].limit); } } -#line 2799 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2788 "bison_parser.cpp" /* yacc.c:1646 */ break; case 53: -#line 502 "bison_parser.y" /* yacc.c:1646 */ +#line 498 "bison_parser.y" /* yacc.c:1646 */ { // TODO: allow multiple unions (through linked list) // TODO: capture type of set_operator @@ -2814,11 +2803,11 @@ yyreduce: (yyval.select_stmt)->limit = (yyvsp[0].limit); } } -#line 2818 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2807 "bison_parser.cpp" /* yacc.c:1646 */ break; case 54: -#line 516 "bison_parser.y" /* yacc.c:1646 */ +#line 512 "bison_parser.y" /* yacc.c:1646 */ { (yyval.select_stmt) = (yyvsp[-4].select_stmt); (yyval.select_stmt)->unionSelect = (yyvsp[-2].select_stmt); @@ -2830,11 +2819,11 @@ yyreduce: (yyval.select_stmt)->limit = (yyvsp[0].limit); } } -#line 2834 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2823 "bison_parser.cpp" /* yacc.c:1646 */ break; case 58: -#line 536 "bison_parser.y" /* yacc.c:1646 */ +#line 532 "bison_parser.y" /* yacc.c:1646 */ { (yyval.select_stmt) = new SelectStatement(); (yyval.select_stmt)->limit = (yyvsp[-5].limit); @@ -2844,465 +2833,466 @@ yyreduce: (yyval.select_stmt)->whereClause = (yyvsp[-1].expr); (yyval.select_stmt)->groupBy = (yyvsp[0].group_t); } -#line 2848 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2837 "bison_parser.cpp" /* yacc.c:1646 */ break; case 59: -#line 548 "bison_parser.y" /* yacc.c:1646 */ +#line 544 "bison_parser.y" /* yacc.c:1646 */ { (yyval.bval) = true; } -#line 2854 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2843 "bison_parser.cpp" /* yacc.c:1646 */ break; case 60: -#line 549 "bison_parser.y" /* yacc.c:1646 */ +#line 545 "bison_parser.y" /* yacc.c:1646 */ { (yyval.bval) = false; } -#line 2860 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2849 "bison_parser.cpp" /* yacc.c:1646 */ break; case 62: -#line 557 "bison_parser.y" /* yacc.c:1646 */ +#line 553 "bison_parser.y" /* yacc.c:1646 */ { (yyval.table) = (yyvsp[0].table); } -#line 2866 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2855 "bison_parser.cpp" /* yacc.c:1646 */ break; case 63: -#line 562 "bison_parser.y" /* yacc.c:1646 */ +#line 558 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); } -#line 2872 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2861 "bison_parser.cpp" /* yacc.c:1646 */ break; case 64: -#line 563 "bison_parser.y" /* yacc.c:1646 */ +#line 559 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = NULL; } -#line 2878 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2867 "bison_parser.cpp" /* yacc.c:1646 */ break; case 65: -#line 567 "bison_parser.y" /* yacc.c:1646 */ +#line 563 "bison_parser.y" /* yacc.c:1646 */ { (yyval.group_t) = new GroupByDescription(); (yyval.group_t)->columns = (yyvsp[-1].expr_vec); (yyval.group_t)->having = (yyvsp[0].expr); } -#line 2888 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2877 "bison_parser.cpp" /* yacc.c:1646 */ break; case 66: -#line 572 "bison_parser.y" /* yacc.c:1646 */ +#line 568 "bison_parser.y" /* yacc.c:1646 */ { (yyval.group_t) = NULL; } -#line 2894 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2883 "bison_parser.cpp" /* yacc.c:1646 */ break; case 67: -#line 576 "bison_parser.y" /* yacc.c:1646 */ +#line 572 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); } -#line 2900 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2889 "bison_parser.cpp" /* yacc.c:1646 */ break; case 68: -#line 577 "bison_parser.y" /* yacc.c:1646 */ +#line 573 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = NULL; } -#line 2906 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2895 "bison_parser.cpp" /* yacc.c:1646 */ break; case 69: -#line 580 "bison_parser.y" /* yacc.c:1646 */ +#line 576 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_vec) = (yyvsp[0].order_vec); } -#line 2912 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2901 "bison_parser.cpp" /* yacc.c:1646 */ break; case 70: -#line 581 "bison_parser.y" /* yacc.c:1646 */ +#line 577 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_vec) = NULL; } -#line 2918 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2907 "bison_parser.cpp" /* yacc.c:1646 */ break; case 71: -#line 585 "bison_parser.y" /* yacc.c:1646 */ +#line 581 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_vec) = new std::vector(); (yyval.order_vec)->push_back((yyvsp[0].order)); } -#line 2924 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2913 "bison_parser.cpp" /* yacc.c:1646 */ break; case 72: -#line 586 "bison_parser.y" /* yacc.c:1646 */ +#line 582 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].order_vec)->push_back((yyvsp[0].order)); (yyval.order_vec) = (yyvsp[-2].order_vec); } -#line 2930 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2919 "bison_parser.cpp" /* yacc.c:1646 */ break; case 73: -#line 590 "bison_parser.y" /* yacc.c:1646 */ +#line 586 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order) = new OrderDescription((yyvsp[0].order_type), (yyvsp[-1].expr)); } -#line 2936 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2925 "bison_parser.cpp" /* yacc.c:1646 */ break; case 74: -#line 594 "bison_parser.y" /* yacc.c:1646 */ +#line 590 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_type) = kOrderAsc; } -#line 2942 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2931 "bison_parser.cpp" /* yacc.c:1646 */ break; case 75: -#line 595 "bison_parser.y" /* yacc.c:1646 */ +#line 591 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_type) = kOrderDesc; } -#line 2948 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2937 "bison_parser.cpp" /* yacc.c:1646 */ break; case 76: -#line 596 "bison_parser.y" /* yacc.c:1646 */ +#line 592 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_type) = kOrderAsc; } -#line 2954 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2943 "bison_parser.cpp" /* yacc.c:1646 */ break; case 77: -#line 602 "bison_parser.y" /* yacc.c:1646 */ +#line 598 "bison_parser.y" /* yacc.c:1646 */ { (yyval.limit) = new LimitDescription((yyvsp[0].expr)->ival, kNoOffset); delete (yyvsp[0].expr); } -#line 2960 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2949 "bison_parser.cpp" /* yacc.c:1646 */ break; case 78: -#line 603 "bison_parser.y" /* yacc.c:1646 */ +#line 599 "bison_parser.y" /* yacc.c:1646 */ { (yyval.limit) = NULL; } -#line 2966 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2955 "bison_parser.cpp" /* yacc.c:1646 */ break; case 79: -#line 607 "bison_parser.y" /* yacc.c:1646 */ +#line 603 "bison_parser.y" /* yacc.c:1646 */ { (yyval.limit) = new LimitDescription((yyvsp[0].expr)->ival, kNoOffset); delete (yyvsp[0].expr); } -#line 2972 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2961 "bison_parser.cpp" /* yacc.c:1646 */ break; case 80: -#line 608 "bison_parser.y" /* yacc.c:1646 */ +#line 604 "bison_parser.y" /* yacc.c:1646 */ { (yyval.limit) = new LimitDescription((yyvsp[-2].expr)->ival, (yyvsp[0].expr)->ival); delete (yyvsp[-2].expr); delete (yyvsp[0].expr); } -#line 2978 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2967 "bison_parser.cpp" /* yacc.c:1646 */ break; case 81: -#line 609 "bison_parser.y" /* yacc.c:1646 */ +#line 605 "bison_parser.y" /* yacc.c:1646 */ { (yyval.limit) = NULL; } -#line 2984 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2973 "bison_parser.cpp" /* yacc.c:1646 */ break; case 82: -#line 616 "bison_parser.y" /* yacc.c:1646 */ +#line 612 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } -#line 2990 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2979 "bison_parser.cpp" /* yacc.c:1646 */ break; case 83: -#line 617 "bison_parser.y" /* yacc.c:1646 */ +#line 613 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } -#line 2996 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2985 "bison_parser.cpp" /* yacc.c:1646 */ break; case 84: -#line 621 "bison_parser.y" /* yacc.c:1646 */ +#line 617 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } -#line 3002 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2991 "bison_parser.cpp" /* yacc.c:1646 */ break; case 85: -#line 622 "bison_parser.y" /* yacc.c:1646 */ +#line 618 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } -#line 3008 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2997 "bison_parser.cpp" /* yacc.c:1646 */ break; case 86: -#line 626 "bison_parser.y" /* yacc.c:1646 */ +#line 622 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[-1].expr); (yyval.expr)->alias = (yyvsp[0].sval); } -#line 3017 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3006 "bison_parser.cpp" /* yacc.c:1646 */ break; case 93: -#line 642 "bison_parser.y" /* yacc.c:1646 */ +#line 638 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[-1].expr); } -#line 3023 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3012 "bison_parser.cpp" /* yacc.c:1646 */ break; case 98: -#line 647 "bison_parser.y" /* yacc.c:1646 */ +#line 643 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeSelect((yyvsp[-1].select_stmt)); } -#line 3029 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3018 "bison_parser.cpp" /* yacc.c:1646 */ break; case 102: -#line 657 "bison_parser.y" /* yacc.c:1646 */ +#line 653 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpUnary(kOpMinus, (yyvsp[0].expr)); } -#line 3035 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3024 "bison_parser.cpp" /* yacc.c:1646 */ break; case 103: -#line 658 "bison_parser.y" /* yacc.c:1646 */ +#line 654 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpUnary(kOpNot, (yyvsp[0].expr)); } -#line 3041 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3030 "bison_parser.cpp" /* yacc.c:1646 */ break; case 105: -#line 663 "bison_parser.y" /* yacc.c:1646 */ +#line 659 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '-', (yyvsp[0].expr)); } -#line 3047 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3036 "bison_parser.cpp" /* yacc.c:1646 */ break; case 106: -#line 664 "bison_parser.y" /* yacc.c:1646 */ +#line 660 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '+', (yyvsp[0].expr)); } -#line 3053 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3042 "bison_parser.cpp" /* yacc.c:1646 */ break; case 107: -#line 665 "bison_parser.y" /* yacc.c:1646 */ +#line 661 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '/', (yyvsp[0].expr)); } -#line 3059 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3048 "bison_parser.cpp" /* yacc.c:1646 */ break; case 108: -#line 666 "bison_parser.y" /* yacc.c:1646 */ +#line 662 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '*', (yyvsp[0].expr)); } -#line 3065 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3054 "bison_parser.cpp" /* yacc.c:1646 */ break; case 109: -#line 667 "bison_parser.y" /* yacc.c:1646 */ +#line 663 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '%', (yyvsp[0].expr)); } -#line 3071 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3060 "bison_parser.cpp" /* yacc.c:1646 */ break; case 110: -#line 668 "bison_parser.y" /* yacc.c:1646 */ +#line 664 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '^', (yyvsp[0].expr)); } -#line 3077 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3066 "bison_parser.cpp" /* yacc.c:1646 */ break; case 111: -#line 669 "bison_parser.y" /* yacc.c:1646 */ +#line 665 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLike, (yyvsp[0].expr)); } -#line 3083 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3072 "bison_parser.cpp" /* yacc.c:1646 */ break; case 112: -#line 670 "bison_parser.y" /* yacc.c:1646 */ +#line 666 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-3].expr), kOpNotLike, (yyvsp[0].expr)); } -#line 3089 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3078 "bison_parser.cpp" /* yacc.c:1646 */ break; case 113: -#line 674 "bison_parser.y" /* yacc.c:1646 */ +#line 670 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAnd, (yyvsp[0].expr)); } -#line 3095 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3084 "bison_parser.cpp" /* yacc.c:1646 */ break; case 114: -#line 675 "bison_parser.y" /* yacc.c:1646 */ +#line 671 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpOr, (yyvsp[0].expr)); } -#line 3101 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3090 "bison_parser.cpp" /* yacc.c:1646 */ break; case 115: -#line 679 "bison_parser.y" /* yacc.c:1646 */ +#line 675 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].expr_vec)); } -#line 3107 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3096 "bison_parser.cpp" /* yacc.c:1646 */ break; case 116: -#line 680 "bison_parser.y" /* yacc.c:1646 */ +#line 676 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].expr_vec))); } -#line 3113 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3102 "bison_parser.cpp" /* yacc.c:1646 */ break; case 117: -#line 681 "bison_parser.y" /* yacc.c:1646 */ +#line 677 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].select_stmt)); } -#line 3119 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3108 "bison_parser.cpp" /* yacc.c:1646 */ break; case 118: -#line 682 "bison_parser.y" /* yacc.c:1646 */ +#line 678 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].select_stmt))); } -#line 3125 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3114 "bison_parser.cpp" /* yacc.c:1646 */ break; case 119: -#line 687 "bison_parser.y" /* yacc.c:1646 */ +#line 683 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeCase((yyvsp[-5].expr), (yyvsp[-3].expr), (yyvsp[-1].expr)); } -#line 3131 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3120 "bison_parser.cpp" /* yacc.c:1646 */ break; case 120: -#line 691 "bison_parser.y" /* yacc.c:1646 */ +#line 687 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeExists((yyvsp[-1].select_stmt)); } -#line 3137 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3126 "bison_parser.cpp" /* yacc.c:1646 */ break; case 121: -#line 692 "bison_parser.y" /* yacc.c:1646 */ +#line 688 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeExists((yyvsp[-1].select_stmt))); } -#line 3143 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3132 "bison_parser.cpp" /* yacc.c:1646 */ break; case 122: -#line 696 "bison_parser.y" /* yacc.c:1646 */ +#line 692 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '=', (yyvsp[0].expr)); } -#line 3149 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3138 "bison_parser.cpp" /* yacc.c:1646 */ break; case 123: -#line 697 "bison_parser.y" /* yacc.c:1646 */ +#line 693 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpNotEquals, (yyvsp[0].expr)); } -#line 3155 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3144 "bison_parser.cpp" /* yacc.c:1646 */ break; case 124: -#line 698 "bison_parser.y" /* yacc.c:1646 */ +#line 694 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '<', (yyvsp[0].expr)); } -#line 3161 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3150 "bison_parser.cpp" /* yacc.c:1646 */ break; case 125: -#line 699 "bison_parser.y" /* yacc.c:1646 */ +#line 695 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '>', (yyvsp[0].expr)); } -#line 3167 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3156 "bison_parser.cpp" /* yacc.c:1646 */ break; case 126: -#line 700 "bison_parser.y" /* yacc.c:1646 */ +#line 696 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLessEq, (yyvsp[0].expr)); } -#line 3173 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3162 "bison_parser.cpp" /* yacc.c:1646 */ break; case 127: -#line 701 "bison_parser.y" /* yacc.c:1646 */ +#line 697 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreaterEq, (yyvsp[0].expr)); } -#line 3179 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3168 "bison_parser.cpp" /* yacc.c:1646 */ break; case 128: -#line 705 "bison_parser.y" /* yacc.c:1646 */ +#line 701 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-4].sval), (yyvsp[-1].expr_vec), (yyvsp[-2].bval)); } -#line 3185 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3174 "bison_parser.cpp" /* yacc.c:1646 */ break; case 129: -#line 709 "bison_parser.y" /* yacc.c:1646 */ +#line 705 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeBetween((yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 3191 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3180 "bison_parser.cpp" /* yacc.c:1646 */ break; case 130: -#line 713 "bison_parser.y" /* yacc.c:1646 */ +#line 709 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeColumnRef((yyvsp[0].sval)); } -#line 3197 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3186 "bison_parser.cpp" /* yacc.c:1646 */ break; case 131: -#line 714 "bison_parser.y" /* yacc.c:1646 */ +#line 710 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeColumnRef((yyvsp[-2].sval), (yyvsp[0].sval)); } -#line 3203 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3192 "bison_parser.cpp" /* yacc.c:1646 */ break; case 135: -#line 724 "bison_parser.y" /* yacc.c:1646 */ +#line 720 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeLiteral((yyvsp[0].sval)); } -#line 3209 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3198 "bison_parser.cpp" /* yacc.c:1646 */ break; case 136: -#line 729 "bison_parser.y" /* yacc.c:1646 */ +#line 725 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeLiteral((yyvsp[0].fval)); } -#line 3215 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3204 "bison_parser.cpp" /* yacc.c:1646 */ break; case 138: -#line 734 "bison_parser.y" /* yacc.c:1646 */ +#line 730 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeLiteral((yyvsp[0].ival)); } -#line 3221 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3210 "bison_parser.cpp" /* yacc.c:1646 */ break; case 139: -#line 738 "bison_parser.y" /* yacc.c:1646 */ +#line 734 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = new Expr(kExprStar); } -#line 3227 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3216 "bison_parser.cpp" /* yacc.c:1646 */ break; case 140: -#line 742 "bison_parser.y" /* yacc.c:1646 */ +#line 738 "bison_parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::makePlaceholder(yylloc.total_column); - yyloc.placeholder_list.push_back((yyval.expr)); + (yyval.expr) = Expr::makeParameter(yylloc.total_column); + (yyval.expr)->ival2 = yyloc.param_list.size(); + yyloc.param_list.push_back((yyval.expr)); } -#line 3236 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3226 "bison_parser.cpp" /* yacc.c:1646 */ break; case 142: -#line 754 "bison_parser.y" /* yacc.c:1646 */ +#line 751 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[0].table_vec)->push_back((yyvsp[-2].table)); auto tbl = new TableRef(kTableCrossProduct); tbl->list = (yyvsp[0].table_vec); (yyval.table) = tbl; } -#line 3247 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3237 "bison_parser.cpp" /* yacc.c:1646 */ break; case 144: -#line 765 "bison_parser.y" /* yacc.c:1646 */ +#line 762 "bison_parser.y" /* yacc.c:1646 */ { auto tbl = new TableRef(kTableSelect); tbl->select = (yyvsp[-2].select_stmt); tbl->alias = (yyvsp[0].sval); (yyval.table) = tbl; } -#line 3258 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3248 "bison_parser.cpp" /* yacc.c:1646 */ break; case 146: -#line 776 "bison_parser.y" /* yacc.c:1646 */ +#line 773 "bison_parser.y" /* yacc.c:1646 */ { (yyval.table_vec) = new std::vector(); (yyval.table_vec)->push_back((yyvsp[0].table)); } -#line 3264 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3254 "bison_parser.cpp" /* yacc.c:1646 */ break; case 147: -#line 777 "bison_parser.y" /* yacc.c:1646 */ +#line 774 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); (yyval.table_vec) = (yyvsp[-2].table_vec); } -#line 3270 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3260 "bison_parser.cpp" /* yacc.c:1646 */ break; case 148: -#line 782 "bison_parser.y" /* yacc.c:1646 */ +#line 779 "bison_parser.y" /* yacc.c:1646 */ { auto tbl = new TableRef(kTableName); tbl->name = (yyvsp[-1].sval); tbl->alias = (yyvsp[0].sval); (yyval.table) = tbl; } -#line 3281 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3271 "bison_parser.cpp" /* yacc.c:1646 */ break; case 149: -#line 792 "bison_parser.y" /* yacc.c:1646 */ +#line 789 "bison_parser.y" /* yacc.c:1646 */ { (yyval.table) = new TableRef(kTableName); (yyval.table)->name = (yyvsp[0].sval); } -#line 3290 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3280 "bison_parser.cpp" /* yacc.c:1646 */ break; case 152: -#line 806 "bison_parser.y" /* yacc.c:1646 */ +#line 803 "bison_parser.y" /* yacc.c:1646 */ { (yyval.sval) = (yyvsp[0].sval); } -#line 3296 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3286 "bison_parser.cpp" /* yacc.c:1646 */ break; case 155: -#line 812 "bison_parser.y" /* yacc.c:1646 */ +#line 809 "bison_parser.y" /* yacc.c:1646 */ { (yyval.sval) = NULL; } -#line 3302 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3292 "bison_parser.cpp" /* yacc.c:1646 */ break; case 156: -#line 821 "bison_parser.y" /* yacc.c:1646 */ +#line 818 "bison_parser.y" /* yacc.c:1646 */ { (yyval.table) = new TableRef(kTableJoin); (yyval.table)->join = new JoinDefinition(); @@ -3311,77 +3301,77 @@ yyreduce: (yyval.table)->join->right = (yyvsp[-2].table); (yyval.table)->join->condition = (yyvsp[0].expr); } -#line 3315 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3305 "bison_parser.cpp" /* yacc.c:1646 */ break; case 157: -#line 832 "bison_parser.y" /* yacc.c:1646 */ +#line 829 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinInner; } -#line 3321 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3311 "bison_parser.cpp" /* yacc.c:1646 */ break; case 158: -#line 833 "bison_parser.y" /* yacc.c:1646 */ +#line 830 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinOuter; } -#line 3327 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3317 "bison_parser.cpp" /* yacc.c:1646 */ break; case 159: -#line 834 "bison_parser.y" /* yacc.c:1646 */ +#line 831 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinLeftOuter; } -#line 3333 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3323 "bison_parser.cpp" /* yacc.c:1646 */ break; case 160: -#line 835 "bison_parser.y" /* yacc.c:1646 */ +#line 832 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinRightOuter; } -#line 3339 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3329 "bison_parser.cpp" /* yacc.c:1646 */ break; case 161: -#line 836 "bison_parser.y" /* yacc.c:1646 */ +#line 833 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinLeft; } -#line 3345 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3335 "bison_parser.cpp" /* yacc.c:1646 */ break; case 162: -#line 837 "bison_parser.y" /* yacc.c:1646 */ +#line 834 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinRight; } -#line 3351 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3341 "bison_parser.cpp" /* yacc.c:1646 */ break; case 163: -#line 838 "bison_parser.y" /* yacc.c:1646 */ +#line 835 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinCross; } -#line 3357 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3347 "bison_parser.cpp" /* yacc.c:1646 */ break; case 164: -#line 839 "bison_parser.y" /* yacc.c:1646 */ +#line 836 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinNatural; } -#line 3363 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3353 "bison_parser.cpp" /* yacc.c:1646 */ break; case 165: -#line 840 "bison_parser.y" /* yacc.c:1646 */ +#line 837 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinInner; } -#line 3369 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3359 "bison_parser.cpp" /* yacc.c:1646 */ break; case 169: -#line 860 "bison_parser.y" /* yacc.c:1646 */ +#line 857 "bison_parser.y" /* yacc.c:1646 */ { (yyval.str_vec) = new std::vector(); (yyval.str_vec)->push_back((yyvsp[0].sval)); } -#line 3375 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3365 "bison_parser.cpp" /* yacc.c:1646 */ break; case 170: -#line 861 "bison_parser.y" /* yacc.c:1646 */ +#line 858 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].str_vec)->push_back((yyvsp[0].sval)); (yyval.str_vec) = (yyvsp[-2].str_vec); } -#line 3381 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3371 "bison_parser.cpp" /* yacc.c:1646 */ break; -#line 3385 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3375 "bison_parser.cpp" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -3616,7 +3606,7 @@ yyreturn: #endif return yyresult; } -#line 864 "bison_parser.y" /* yacc.c:1906 */ +#line 861 "bison_parser.y" /* yacc.c:1906 */ /********************************* ** Section 4: Additional C code diff --git a/src/parser/bison_parser.h b/src/parser/bison_parser.h index fecc6aa..24e30fa 100644 --- a/src/parser/bison_parser.h +++ b/src/parser/bison_parser.h @@ -48,7 +48,7 @@ extern int hsql_debug; #endif /* "%code requires" blocks. */ -#line 36 "bison_parser.y" /* yacc.c:1909 */ +#line 34 "bison_parser.y" /* yacc.c:1909 */ // %code requires block @@ -58,18 +58,18 @@ extern int hsql_debug; // Auto update column and line number #define YY_USER_ACTION \ - yylloc->first_line = yylloc->last_line; \ - yylloc->first_column = yylloc->last_column; \ - for(int i = 0; yytext[i] != '\0'; i++) { \ - yylloc->total_column++; \ - if(yytext[i] == '\n') { \ - yylloc->last_line++; \ - yylloc->last_column = 0; \ - } \ - else { \ - yylloc->last_column++; \ - } \ - } + yylloc->first_line = yylloc->last_line; \ + yylloc->first_column = yylloc->last_column; \ + for(int i = 0; yytext[i] != '\0'; i++) { \ + yylloc->total_column++; \ + if(yytext[i] == '\n') { \ + yylloc->last_line++; \ + yylloc->last_column = 0; \ + } \ + else { \ + yylloc->last_column++; \ + } \ + } #line 75 "bison_parser.h" /* yacc.c:1909 */ @@ -214,7 +214,7 @@ extern int hsql_debug; union HSQL_STYPE { -#line 95 "bison_parser.y" /* yacc.c:1909 */ +#line 92 "bison_parser.y" /* yacc.c:1909 */ double fval; int64_t ival; diff --git a/src/parser/bison_parser.y b/src/parser/bison_parser.y index 9c8cfe9..49adae8 100644 --- a/src/parser/bison_parser.y +++ b/src/parser/bison_parser.y @@ -24,8 +24,6 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha return 0; } - - %} /********************************* ** Section 2: Bison Parser Declarations @@ -42,18 +40,18 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha // Auto update column and line number #define YY_USER_ACTION \ - yylloc->first_line = yylloc->last_line; \ - yylloc->first_column = yylloc->last_column; \ - for(int i = 0; yytext[i] != '\0'; i++) { \ - yylloc->total_column++; \ - if(yytext[i] == '\n') { \ - yylloc->last_line++; \ - yylloc->last_column = 0; \ - } \ - else { \ - yylloc->last_column++; \ - } \ - } + yylloc->first_line = yylloc->last_line; \ + yylloc->first_column = yylloc->last_column; \ + for(int i = 0; yytext[i] != '\0'; i++) { \ + yylloc->total_column++; \ + if(yytext[i] == '\n') { \ + yylloc->last_line++; \ + yylloc->last_column = 0; \ + } \ + else { \ + yylloc->last_column++; \ + } \ + } } // Define the names of the created files (defined in Makefile) @@ -77,7 +75,6 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha @$.first_line = 0; @$.last_line = 0; @$.total_column = 0; - @$.placeholder_id = 0; }; @@ -184,13 +181,13 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha %type delete_statement truncate_statement %type update_statement %type drop_statement -%type table_name opt_alias alias file_path +%type table_name opt_alias alias file_path prepare_target_query %type opt_not_exists opt_distinct %type import_file_type opt_join_type column_type %type from_clause table_ref table_ref_atomic table_ref_name %type
join_clause table_ref_name_no_alias %type expr operand scalar_expr unary_expr binary_expr logic_expr exists_expr -%type function_expr between_expr star_expr expr_alias placeholder_expr +%type function_expr between_expr star_expr expr_alias param_expr %type column_name literal int_literal num_literal string_literal %type comp_expr opt_where join_condition opt_having case_expr in_expr %type opt_limit opt_top @@ -238,11 +235,21 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha // Defines our general input. input: statement_list opt_semicolon { - for (SQLStatement* stmt : *$1) { - // Transfers ownership of the statement. - result->addStatement(stmt); - } - delete $1; + for (SQLStatement* stmt : *$1) { + // Transfers ownership of the statement. + result->addStatement(stmt); + } + + unsigned param_id = 0; + for (void* param : yyloc.param_list) { + if (param != nullptr) { + Expr* expr = (Expr*) param; + expr->ival = param_id; + result->addParameter(expr); + ++param_id; + } + } + delete $1; } ; @@ -253,11 +260,7 @@ statement_list: ; statement: - prepare_statement { - $1->setPlaceholders(yyloc.placeholder_list); - yyloc.placeholder_list.clear(); - $$ = $1; - } + prepare_statement | preparable_statement ; @@ -279,22 +282,15 @@ preparable_statement: * Prepared Statement ******************************/ prepare_statement: - PREPARE IDENTIFIER ':' preparable_statement { + PREPARE IDENTIFIER FROM prepare_target_query { $$ = new PrepareStatement(); $$->name = $2; - $$->query = new SQLParserResult($4); - } - | PREPARE IDENTIFIER '{' statement_list opt_semicolon '}' { - $$ = new PrepareStatement(); - $$->name = $2; - $$->query = new SQLParserResult(); - for (SQLStatement* stmt : *$4) { - $$->query->addStatement(stmt); - } - delete $4; + $$->query = $4; } ; +prepare_target_query: STRING + execute_statement: EXECUTE IDENTIFIER { $$ = new ExecuteStatement(); @@ -717,7 +713,7 @@ column_name: literal: string_literal | num_literal - | placeholder_expr + | param_expr ; string_literal: @@ -738,10 +734,11 @@ star_expr: '*' { $$ = new Expr(kExprStar); } ; -placeholder_expr: +param_expr: '?' { - $$ = Expr::makePlaceholder(yylloc.total_column); - yyloc.placeholder_list.push_back($$); + $$ = Expr::makeParameter(yylloc.total_column); + $$->ival2 = yyloc.param_list.size(); + yyloc.param_list.push_back($$); } ; diff --git a/src/parser/parser_typedef.h b/src/parser/parser_typedef.h index 70c9322..1204b96 100644 --- a/src/parser/parser_typedef.h +++ b/src/parser/parser_typedef.h @@ -22,15 +22,12 @@ struct HSQL_CUST_LTYPE { int total_column; - // Placeholder - int placeholder_id; - std::vector placeholder_list; + // Parameters. + // int param_id; + std::vector param_list; }; #define HSQL_LTYPE HSQL_CUST_LTYPE #define HSQL_LTYPE_IS_DECLARED 1 - - - #endif \ No newline at end of file diff --git a/src/sql/Expr.cpp b/src/sql/Expr.cpp index 1345714..7c94d9b 100644 --- a/src/sql/Expr.cpp +++ b/src/sql/Expr.cpp @@ -118,8 +118,8 @@ namespace hsql { return e; } - Expr* Expr::makePlaceholder(int id) { - Expr* e = new Expr(kExprPlaceholder); + Expr* Expr::makeParameter(int id) { + Expr* e = new Expr(kExprParameter); e->ival = id; return e; } @@ -160,7 +160,7 @@ namespace hsql { } bool Expr::isLiteral() const { - return isType(kExprLiteralInt) || isType(kExprLiteralFloat) || isType(kExprLiteralString) || isType(kExprPlaceholder); + return isType(kExprLiteralInt) || isType(kExprLiteralFloat) || isType(kExprLiteralString) || isType(kExprParameter); } bool Expr::hasAlias() const { diff --git a/src/sql/Expr.h b/src/sql/Expr.h index 5b9d4c8..2e6d44e 100644 --- a/src/sql/Expr.h +++ b/src/sql/Expr.h @@ -17,7 +17,7 @@ namespace hsql { kExprLiteralString, kExprLiteralInt, kExprStar, - kExprPlaceholder, + kExprParameter, kExprColumnRef, kExprFunctionRef, kExprOperator, @@ -124,7 +124,7 @@ namespace hsql { static Expr* makeFunctionRef(char* func_name, std::vector* exprList, bool distinct); - static Expr* makePlaceholder(int id); + static Expr* makeParameter(int id); static Expr* makeSelect(SelectStatement* select); diff --git a/src/sql/PrepareStatement.cpp b/src/sql/PrepareStatement.cpp new file mode 100644 index 0000000..6484e2a --- /dev/null +++ b/src/sql/PrepareStatement.cpp @@ -0,0 +1,15 @@ + +#include "PrepareStatement.h" + +namespace hsql { + // PrepareStatement + PrepareStatement::PrepareStatement() : + SQLStatement(kStmtPrepare), + name(NULL), + query(NULL) {} + + PrepareStatement::~PrepareStatement() { + free(name); + free(query); + } +} // namespace hsql diff --git a/src/sql/PrepareStatement.h b/src/sql/PrepareStatement.h index 55d38f7..4642af9 100644 --- a/src/sql/PrepareStatement.h +++ b/src/sql/PrepareStatement.h @@ -1,32 +1,20 @@ #ifndef __SQLPARSER__PREPARE_STATEMENT_H__ #define __SQLPARSER__PREPARE_STATEMENT_H__ -#include "../SQLParserResult.h" #include "SQLStatement.h" -#include "SelectStatement.h" -#include namespace hsql { // Represents SQL Prepare statements. - // Example: "PREPARE ins_prep: SELECT * FROM t1 WHERE c1 = ? AND c2 = ?" + // Example: PREPARE test FROM 'SELECT * FROM test WHERE a = ?;' struct PrepareStatement : SQLStatement { PrepareStatement(); virtual ~PrepareStatement(); - // When setting the placeholders we need to make sure that they are in the correct order. - // To ensure that, during parsing we store the character position use that to sort the list here. - void setPlaceholders(std::vector ph); - char* name; - // The result that is stored within this prepared statement. - SQLParserResult* query; - - // The expressions are not owned by this statement. - // Rather they are owned by the query and destroyed, when - // the query is destroyed. - std::vector placeholders; + // The query that is supposed to be prepared. + char* query; }; } // namsepace hsql diff --git a/src/sql/statements.cpp b/src/sql/statements.cpp index 5a818f6..2b91f11 100644 --- a/src/sql/statements.cpp +++ b/src/sql/statements.cpp @@ -139,29 +139,6 @@ namespace hsql { } } - // PrepareStatement - PrepareStatement::PrepareStatement() : - SQLStatement(kStmtPrepare), - name(NULL), - query(NULL) {} - - PrepareStatement::~PrepareStatement() { - delete query; - free(name); - } - - void PrepareStatement::setPlaceholders(std::vector ph) { - for (void* e : ph) { - if (e != NULL) - placeholders.push_back((Expr*) e); - } - // Sort by col-id - std::sort(placeholders.begin(), placeholders.end(), [](Expr * i, Expr * j) -> bool { return (i->ival < j->ival); }); - - // Set the placeholder id on the Expr. This replaces the previously stored column id - for (uintmax_t i = 0; i < placeholders.size(); ++i) placeholders[i]->ival = i; - } - // SelectStatement.h // OrderDescription diff --git a/test/prepare_tests.cpp b/test/prepare_tests.cpp index e8eeaea..d6f12c5 100644 --- a/test/prepare_tests.cpp +++ b/test/prepare_tests.cpp @@ -3,7 +3,8 @@ #include "sql_asserts.h" #include "SQLParser.h" -using hsql::kExprPlaceholder; +using hsql::kExprParameter; +using hsql::kExprLiteralInt; using hsql::kStmtDrop; using hsql::kStmtExecute; @@ -21,63 +22,76 @@ using hsql::SelectStatement; TEST(PrepareSingleStatementTest) { - const std::string query = "PREPARE test: SELECT * FROM students WHERE grade = ?;"; - TEST_PARSE_SINGLE_SQL(query, kStmtPrepare, PrepareStatement, result, prepare); + TEST_PARSE_SINGLE_SQL( + "PREPARE test FROM 'SELECT * FROM students WHERE grade = ?';", + kStmtPrepare, + PrepareStatement, + result, + prepare); - const SelectStatement* select = (const SelectStatement*) prepare->query->getStatement(0); + ASSERT_STREQ(prepare->name, "test"); + ASSERT_STREQ(prepare->query, "SELECT * FROM students WHERE grade = ?"); + + TEST_PARSE_SINGLE_SQL( + prepare->query, + kStmtSelect, + SelectStatement, + result2, + select); + + ASSERT_EQ(result2.parameters().size(), 1); + ASSERT(select->whereClause->expr2->isType(kExprParameter)) + ASSERT_EQ(select->whereClause->expr2->ival, 0) - ASSERT(select->whereClause->isSimpleOp('=')); - ASSERT_EQ(select->whereClause->expr2, prepare->placeholders[0]) } -TEST(PrepareMultiStatementTest) { - const std::string query = "PREPARE test {" - "INSERT INTO test VALUES(?);" - "SELECT ?, test FROM test WHERE c1 = ?;" - "};" - "PREPARE stmt: SELECT * FROM data WHERE c1 = ?;" - "DEALLOCATE PREPARE stmt;"; +TEST(DeallocatePrepareStatementTest) { + TEST_PARSE_SINGLE_SQL( + "DEALLOCATE PREPARE test;", + kStmtDrop, + DropStatement, + result, + drop); - TEST_PARSE_SQL_QUERY(query, result, 3); - - TEST_CAST_STMT(result, 0, kStmtPrepare, PrepareStatement, prep1); - TEST_CAST_STMT(result, 1, kStmtPrepare, PrepareStatement, prep2); - TEST_CAST_STMT(result, 2, kStmtDrop, DropStatement, drop); - - // Prepare Statement #1 - ASSERT_STREQ(prep1->name, "test"); - ASSERT_EQ(prep1->placeholders.size(), 3); - ASSERT_EQ(prep1->query->size(), 2); - - TEST_CAST_STMT((*prep1->query), 0, kStmtInsert, InsertStatement, insert); - TEST_CAST_STMT((*prep1->query), 1, kStmtSelect, SelectStatement, select); - - ASSERT(insert->values->at(0)->isType(kExprPlaceholder)); - ASSERT(select->selectList->at(0)->isType(kExprPlaceholder)); - ASSERT(select->whereClause->expr2->isType(kExprPlaceholder)); - - // Check IDs of placeholders - ASSERT_EQ(insert->values->at(0)->ival, 0); - ASSERT_EQ(insert->values->at(0), prep1->placeholders[0]); - - ASSERT_EQ(select->selectList->at(0)->ival, 1); - ASSERT_EQ(select->selectList->at(0), prep1->placeholders[1]); - - ASSERT_EQ(select->whereClause->expr2->ival, 2); - ASSERT_EQ(select->whereClause->expr2, prep1->placeholders[2]); - - // Prepare Statement #2 - ASSERT_STREQ(prep2->name, "stmt"); - ASSERT_EQ(prep2->placeholders.size(), 1); - - // Deallocate Statement ASSERT_EQ(drop->type, kDropPreparedStatement); - ASSERT_STREQ(drop->name, "stmt"); + ASSERT_STREQ(drop->name, "test"); } +TEST(StatementWithParameters) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM test WHERE a = ? AND b = ?", + kStmtSelect, + SelectStatement, + result, + stmt); + + const hsql::Expr* eq1 = stmt->whereClause->expr; + const hsql::Expr* eq2 = stmt->whereClause->expr2; + + ASSERT_EQ(result.parameters().size(), 2); + + ASSERT(eq1->isSimpleOp('=')) + ASSERT(eq1->expr->isType(hsql::kExprColumnRef)) + ASSERT(eq1->expr2->isType(kExprParameter)) + ASSERT_EQ(eq1->expr2->ival, 0) + ASSERT_EQ(result.parameters()[0], eq1->expr2); + + + ASSERT(eq2->isSimpleOp('=')) + ASSERT(eq2->expr->isType(hsql::kExprColumnRef)) + ASSERT(eq2->expr2->isType(kExprParameter)) + ASSERT_EQ(eq2->expr2->ival, 1) + ASSERT_EQ(result.parameters()[1], eq2->expr2); +} + TEST(ExecuteStatementTest) { - TEST_PARSE_SINGLE_SQL("EXECUTE test(1, 2);", kStmtExecute, ExecuteStatement, result, stmt); + TEST_PARSE_SINGLE_SQL( + "EXECUTE test(1, 2);", + kStmtExecute, + ExecuteStatement, + result, + stmt); ASSERT_STREQ(stmt->name, "test"); ASSERT_EQ(stmt->parameters->size(), 2); diff --git a/test/valid_queries.sql b/test/valid_queries.sql index a634594..bfd7edd 100644 --- a/test/valid_queries.sql +++ b/test/valid_queries.sql @@ -11,6 +11,7 @@ SELECT * FROM t1 UNION (SELECT * FROM t2 UNION SELECT * FROM t3) ORDER BY col1; SELECT TOP 10 * FROM t1 ORDER BY col1, col2; SELECT a, MAX(b), MAX(c, d), CUSTOM(q, UP(r)) AS f FROM t1; SELECT * FROM t WHERE a BETWEEN 1 and c; +SELECT * FROM t WHERE a = ? AND b = ?; SELECT City.name, Product.category, SUM(price) FROM fact INNER JOIN City ON fact.city_id = City.id INNER JOIN Product ON fact.product_id = Product.id GROUP BY City.name, Product.category; # JOIN SELECT t1.a, t1.b, t2.c FROM "table" AS t1 JOIN (SELECT * FROM foo JOIN bar ON foo.id = bar.id) t2 ON t1.a = t2.b WHERE (t1.b OR NOT t1.a) AND t2.c = 12.5 @@ -37,8 +38,8 @@ UPDATE students SET grade = 1.0; # DROP DROP TABLE students; # PREPARE -PREPARE prep_inst: INSERT INTO test VALUES (?, ?, ?); -PREPARE prep2 { INSERT INTO test VALUES (?, 0, 0); INSERT INTO test VALUES (0, ?, 0); INSERT INTO test VALUES (0, 0, ?); }; +PREPARE prep_inst FROM 'INSERT INTO test VALUES (?, ?, ?)'; +PREPARE prep2 FROM 'INSERT INTO test VALUES (?, 0, 0); INSERT INTO test VALUES (0, ?, 0); INSERT INTO test VALUES (0, 0, ?);'; EXECUTE prep_inst(1, 2, 3); EXECUTE prep; DEALLOCATE PREPARE prep; @@ -49,4 +50,5 @@ DEALLOCATE PREPARE prep; !SELECT abc; !CREATE TABLE "table" FROM TBL FILE 'students.tbl';SELECT 1 !CREATE TABLE "table" FROM TBL FILE 'students.tbl';1 -!INSERT INTO test_table VALUESd (1, 2, 'test'); \ No newline at end of file +!INSERT INTO test_table VALUESd (1, 2, 'test'); +!SELECT * FROM t WHERE a = ? AND b = ?;SELECT 1; \ No newline at end of file