diff --git a/benchmark/Makefile b/benchmark/Makefile index a05a8cb..a33b9d4 100644 --- a/benchmark/Makefile +++ b/benchmark/Makefile @@ -1,4 +1,7 @@ +SRC = ./ +CPP = $(shell find $(SRC) -name '*.cpp') + CFLAGS = -std=c++11 -lstdc++ -Wall -I../src/ -L../ all: parser_benchmark @@ -6,8 +9,8 @@ all: parser_benchmark run: parser_benchmark @export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:../ && ./parser_benchmark -parser_benchmark: parser_benchmark.cpp - $(CXX) $(CFLAGS) parser_benchmark.cpp -o parser_benchmark -lbenchmark -lpthread -lsqlparser +parser_benchmark: $(CPP) + $(CXX) $(CFLAGS) $(CPP) -o parser_benchmark -lbenchmark -lpthread -lsqlparser clean: rm -f parser_benchmark diff --git a/benchmark/parser_benchmark.cpp b/benchmark/parser_benchmark.cpp index 9f0fa07..cea4709 100644 --- a/benchmark/parser_benchmark.cpp +++ b/benchmark/parser_benchmark.cpp @@ -31,6 +31,18 @@ PARSE_QUERY_BENCHMARK(BM_LongSelectElement26, PARSE_QUERY_BENCHMARK(BM_LongSelectElement52, "SELECT aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa FROM test;"); +// Prepare and Execute benchmarks. +PARSE_QUERY_BENCHMARK(BM_ExecuteStatement, + "EXECUTE procedure;"); + +PARSE_QUERY_BENCHMARK(BM_ExecuteWith2ParametersStatement, + "EXECUTE procedure(11, 'test');"); + +PARSE_QUERY_BENCHMARK(BM_ExecuteWith10ParametersStatement, + "EXECUTE procedure(11, 'test', 5.6, 4.2, 'abc', 6, 7, 8, 9, 10000);"); + + + // Benchmark the influence of increasing size of the query, while // the number of tokens remains unchanged. static void BM_CharacterCount(benchmark::State& st) { diff --git a/example/example.cpp b/example/example.cpp index 2b67c90..9961d3d 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -6,7 +6,7 @@ #include "SQLParser.h" // contains printing utilities -#include "sqlhelper.h" +#include "util/sqlhelper.h" int main(int argc, char *argv[]) { if (argc <= 1) { @@ -16,31 +16,26 @@ int main(int argc, char *argv[]) { std::string query = argv[1]; // parse a given query - hsql::SQLParserResult* result = hsql::SQLParser::parseSQLString(query); + hsql::SQLParserResult result; + hsql::SQLParser::parseSQLString(query, &result); // check whether the parsing was successful - if (!result) { - return -1; - } - if (result->isValid()) { + if (result.isValid()) { printf("Parsed successfully!\n"); - printf("Number of statements: %lu\n", result->size()); + printf("Number of statements: %lu\n", result.size()); - for (uint i = 0; i < result->size(); ++i) { + for (uint i = 0; i < result.size(); ++i) { // Print a statement summary. - hsql::printStatementInfo(result->getStatement(i)); + hsql::printStatementInfo(result.getStatement(i)); } - - delete result; return 0; } else { fprintf(stderr, "Given string is not a valid SQL query.\n"); fprintf(stderr, "%s (L%d:%d)\n", - result->errorMsg(), - result->errorLine(), - result->errorColumn()); - delete result; + result.errorMsg(), + result.errorLine(), + result.errorColumn()); return -1; } } diff --git a/src/SQLParser.cpp b/src/SQLParser.cpp index 55ae5f7..a33f84d 100644 --- a/src/SQLParser.cpp +++ b/src/SQLParser.cpp @@ -12,36 +12,51 @@ namespace hsql { fprintf(stderr, "SQLParser only has static methods atm! Do not initialize!\n"); } - SQLParserResult* SQLParser::parseSQLString(const char* text) { - SQLParserResult* result = NULL; + // static + bool SQLParser::parseSQLString(const char* text, SQLParserResult* result) { yyscan_t scanner; YY_BUFFER_STATE state; if (hsql_lex_init(&scanner)) { // Couldn't initialize the lexer. fprintf(stderr, "[Error] SQLParser: Error when initializing lexer!\n"); - return NULL; + return false; } state = hsql__scan_string(text, scanner); - // Parser and return early if it failed. - if (hsql_parse(&result, scanner)) { - // Returns an error stmt object. - hsql__delete_buffer(state, scanner); - hsql_lex_destroy(scanner); - return result; - } + // Parse the tokens. + // If parsing fails, the result will contain an error object. + int ret = hsql_parse(result, scanner); + bool success = (ret == 0); + result->setIsValid(success); hsql__delete_buffer(state, scanner); hsql_lex_destroy(scanner); + + return true; + } + + // static + bool SQLParser::parseSQLString(const std::string& text, SQLParserResult* result) { + return parseSQLString(text.c_str(), result); + } + + // static + SQLParserResult* SQLParser::parseSQLString(const char* text) { + SQLParserResult* result = new SQLParserResult(); + + if (!SQLParser::parseSQLString(text, result)) { + delete result; + return NULL; + } + return result; } - + // static SQLParserResult* SQLParser::parseSQLString(const std::string& text) { return parseSQLString(text.c_str()); } - -} // namespace hsql \ No newline at end of file +} // namespace hsql diff --git a/src/SQLParser.h b/src/SQLParser.h index 5bb2a4a..e494680 100644 --- a/src/SQLParser.h +++ b/src/SQLParser.h @@ -1,5 +1,5 @@ -#ifndef __SQLPARSER_H_ -#define __SQLPARSER_H_ +#ifndef __SQLPARSER__SQLPARSER_H__ +#define __SQLPARSER__SQLPARSER_H__ #include "SQLParserResult.h" #include "sql/statements.h" @@ -9,10 +9,25 @@ namespace hsql { // Static methods used to parse SQL strings. class SQLParser { public: + // Parses a given constant character SQL string into the result object. + // Returns true if the lexer and parser could run without internal errors. + // This does NOT mean that the SQL string was valid SQL. To check that + // you need to check result->isValid(); + static bool parseSQLString(const char* sql, SQLParserResult* result); + + // Parses a given SQL string into the result object. + static bool parseSQLString(const std::string& sql, SQLParserResult* result); + + // Deprecated: // Parses a given constant character SQL string. + // Note: This is kept for legacy reasons. It is recommended to use + // the (const char*, SQLParserResult*) implementation. static SQLParserResult* parseSQLString(const char* sql); + // Deprecated: // Parses an SQL std::string. + // Note: This is kept for legacy reasons. It is recommended to use + // the (const std::string&, SQLParserResult*) implementation. static SQLParserResult* parseSQLString(const std::string& sql); private: diff --git a/src/SQLParserResult.cpp b/src/SQLParserResult.cpp index ca106c9..b8df999 100644 --- a/src/SQLParserResult.cpp +++ b/src/SQLParserResult.cpp @@ -4,21 +4,17 @@ namespace hsql { SQLParserResult::SQLParserResult() : - isValid_(true), + isValid_(false), errorMsg_(NULL) {}; SQLParserResult::SQLParserResult(SQLStatement* stmt) : - isValid_(true), + isValid_(false), errorMsg_(NULL) { addStatement(stmt); }; SQLParserResult::~SQLParserResult() { - for (SQLStatement* statement : statements_) { - delete statement; - } - - free(errorMsg_); + reset(); } void SQLParserResult::addStatement(SQLStatement* stmt) { @@ -63,4 +59,30 @@ namespace hsql { errorColumn_ = errorColumn; } -} // namespace hsql \ No newline at end of file + const std::vector& SQLParserResult::getStatements() const { + return statements_; + } + + std::vector SQLParserResult::releaseStatements() { + std::vector copy = statements_; + + statements_.clear(); + + return copy; + } + + void SQLParserResult::reset() { + for (SQLStatement* statement : statements_) { + delete statement; + } + statements_.clear(); + + isValid_ = false; + + free(errorMsg_); + errorMsg_ = NULL; + errorLine_ = -1; + errorColumn_ = -1; + } + +} // namespace hsql diff --git a/src/SQLParserResult.h b/src/SQLParserResult.h index 96e19cf..570664c 100644 --- a/src/SQLParserResult.h +++ b/src/SQLParserResult.h @@ -1,5 +1,5 @@ -#ifndef __SQLPARSERRESULT__ -#define __SQLPARSERRESULT__ +#ifndef __SQLPARSER__SQLPARSER_RESULT_H__ +#define __SQLPARSER__SQLPARSER_RESULT_H__ #include "sql/SQLStatement.h" @@ -15,15 +15,22 @@ namespace hsql { // Takes ownership of the statement. SQLParserResult(SQLStatement* stmt); - // Deletes all statements in the resul. + // Deletes all statements in the result. virtual ~SQLParserResult(); + // Set whether parsing was successful. + void setIsValid(bool isValid); + // Returns true if parsing was successful. bool isValid() const; // Returns the number of statements in the result. size_t size() const; + // Set the details of the error, if available. + // Takes ownership of errorMsg. + void setErrorDetails(char* errorMsg, int errorLine, int errorColumn); + // Returns the error message, if an error occurred. const char* errorMsg() const; @@ -33,23 +40,25 @@ namespace hsql { // Returns the column number of the occurrance of the error in the query. int errorColumn() const; + // Adds a statement to the result list of statements. + // SQLParserResult takes ownership of the statement. + void addStatement(SQLStatement* stmt); + // Gets the SQL statement with the given index. const SQLStatement* getStatement(int index) const; // Gets the non const SQL statement with the given index. SQLStatement* getMutableStatement(int index); - // Adds a statement to the result list of statements. - // Takes ownership of the statement. - void addStatement(SQLStatement* stmt); + // Get the list of all statements. + const std::vector& getStatements() const; - // Set whether parsing was successful. - void setIsValid(bool isValid); - - // Set the details of the error, if available. - // Takes ownership of errorMsg. - void setErrorDetails(char* errorMsg, int errorLine, int errorColumn); + // Returns a copy of the list of all statements in this result. + // Removes them from this result. + std::vector releaseStatements(); + // Deletes all statements and other data within the result. + void reset(); private: // List of statements within the result. @@ -70,4 +79,4 @@ namespace hsql { } // namespace hsql -#endif // __SQLPARSERRESULT__ \ No newline at end of file +#endif // __SQLPARSER__SQLPARSER_RESULT_H__ \ No newline at end of file diff --git a/src/parser/bison_parser.cpp b/src/parser/bison_parser.cpp index 6db91ac..4c71941 100644 --- a/src/parser/bison_parser.cpp +++ b/src/parser/bison_parser.cpp @@ -91,21 +91,16 @@ using namespace hsql; -int yyerror(YYLTYPE* llocp, SQLParserResult** result, yyscan_t scanner, const char *msg) { - delete *result; - - SQLParserResult* list = new SQLParserResult(); - list->setIsValid(false); - list->setErrorDetails(strdup(msg), llocp->first_line, llocp->first_column); - - *result = list; +int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const char *msg) { + result->setIsValid(false); + result->setErrorDetails(strdup(msg), llocp->first_line, llocp->first_column); return 0; } -#line 109 "bison_parser.cpp" /* yacc.c:339 */ +#line 104 "bison_parser.cpp" /* yacc.c:339 */ # ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus @@ -143,7 +138,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult** result, yyscan_t scanner, const ch extern int hsql_debug; #endif /* "%code requires" blocks. */ -#line 41 "bison_parser.y" /* yacc.c:355 */ +#line 36 "bison_parser.y" /* yacc.c:355 */ // %code requires block @@ -166,7 +161,7 @@ extern int hsql_debug; } \ } -#line 170 "bison_parser.cpp" /* yacc.c:355 */ +#line 165 "bison_parser.cpp" /* yacc.c:355 */ /* Token type. */ #ifndef HSQL_TOKENTYPE @@ -309,7 +304,7 @@ extern int hsql_debug; union HSQL_STYPE { -#line 100 "bison_parser.y" /* yacc.c:355 */ +#line 95 "bison_parser.y" /* yacc.c:355 */ double fval; int64_t ival; @@ -337,7 +332,7 @@ union HSQL_STYPE hsql::GroupByDescription* group_t; hsql::UpdateClause* update_t; - hsql::SQLParserResult* stmt_list; + std::vector* stmt_vec; std::vector* str_vec; std::vector* table_vec; @@ -346,7 +341,7 @@ union HSQL_STYPE std::vector* expr_vec; std::vector* order_vec; -#line 350 "bison_parser.cpp" /* yacc.c:355 */ +#line 345 "bison_parser.cpp" /* yacc.c:355 */ }; typedef union HSQL_STYPE HSQL_STYPE; @@ -370,13 +365,13 @@ struct HSQL_LTYPE -int hsql_parse (hsql::SQLParserResult** result, yyscan_t scanner); +int hsql_parse (hsql::SQLParserResult* result, yyscan_t scanner); #endif /* !YY_HSQL_BISON_PARSER_H_INCLUDED */ /* Copy the second part of user declarations. */ -#line 380 "bison_parser.cpp" /* yacc.c:358 */ +#line 375 "bison_parser.cpp" /* yacc.c:358 */ #ifdef short # undef short @@ -688,24 +683,24 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 245, 245, 252, 253, 257, 262, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 283, 288, 296, 300, - 312, 320, 324, 334, 340, 346, 356, 357, 361, 362, - 366, 373, 374, 375, 376, 386, 390, 394, 406, 414, - 426, 432, 442, 443, 453, 462, 463, 467, 479, 480, - 484, 485, 489, 499, 513, 527, 528, 529, 533, 545, - 546, 550, 554, 559, 560, 564, 569, 573, 574, 577, - 578, 582, 583, 587, 591, 592, 593, 599, 600, 604, - 605, 606, 613, 614, 618, 619, 623, 630, 631, 632, - 633, 634, 635, 639, 640, 641, 642, 643, 644, 648, - 649, 650, 654, 655, 659, 660, 661, 662, 663, 664, - 665, 666, 667, 671, 672, 676, 677, 678, 679, 684, - 688, 689, 693, 694, 695, 696, 697, 698, 702, 706, - 710, 711, 715, 716, 717, 721, 726, 727, 731, 735, - 739, 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, 843, 849, 853, 862, - 863, 868, 869 + 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, 846, 852, 856, 865, + 866, 871, 872 }; #endif @@ -1221,7 +1216,7 @@ do { \ `----------------------------------------*/ static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, hsql::SQLParserResult** result, yyscan_t scanner) +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, hsql::SQLParserResult* result, yyscan_t scanner) { FILE *yyo = yyoutput; YYUSE (yyo); @@ -1243,7 +1238,7 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue `--------------------------------*/ static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, hsql::SQLParserResult** result, yyscan_t scanner) +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, hsql::SQLParserResult* result, yyscan_t scanner) { YYFPRINTF (yyoutput, "%s %s (", yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); @@ -1283,7 +1278,7 @@ do { \ `------------------------------------------------*/ static void -yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, hsql::SQLParserResult** result, yyscan_t scanner) +yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, hsql::SQLParserResult* result, yyscan_t scanner) { unsigned long int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; @@ -1563,7 +1558,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, `-----------------------------------------------*/ static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, hsql::SQLParserResult** result, yyscan_t scanner) +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, hsql::SQLParserResult* result, yyscan_t scanner) { YYUSE (yyvaluep); YYUSE (yylocationp); @@ -1577,109 +1572,116 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio switch (yytype) { case 3: /* IDENTIFIER */ -#line 142 "bison_parser.y" /* yacc.c:1257 */ +#line 137 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 1583 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1578 "bison_parser.cpp" /* yacc.c:1257 */ break; case 4: /* STRING */ -#line 142 "bison_parser.y" /* yacc.c:1257 */ +#line 137 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 1589 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1584 "bison_parser.cpp" /* yacc.c:1257 */ break; case 5: /* FLOATVAL */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1595 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1590 "bison_parser.cpp" /* yacc.c:1257 */ break; case 6: /* INTVAL */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1601 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1596 "bison_parser.cpp" /* yacc.c:1257 */ break; case 7: /* NOTEQUALS */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1607 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1602 "bison_parser.cpp" /* yacc.c:1257 */ break; case 8: /* LESSEQ */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1613 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1608 "bison_parser.cpp" /* yacc.c:1257 */ break; case 9: /* GREATEREQ */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1619 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1614 "bison_parser.cpp" /* yacc.c:1257 */ break; case 153: /* statement_list */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ - { delete (((*yyvaluep).stmt_list)); } -#line 1625 "bison_parser.cpp" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ + { + if ((((*yyvaluep).stmt_vec)) != NULL) { + for (auto ptr : *(((*yyvaluep).stmt_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).stmt_vec)); +} +#line 1627 "bison_parser.cpp" /* yacc.c:1257 */ break; case 154: /* statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).statement)); } -#line 1631 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1633 "bison_parser.cpp" /* yacc.c:1257 */ break; case 155: /* preparable_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).statement)); } -#line 1637 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1639 "bison_parser.cpp" /* yacc.c:1257 */ break; case 156: /* prepare_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).prep_stmt)); } -#line 1643 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1645 "bison_parser.cpp" /* yacc.c:1257 */ break; case 157: /* execute_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).exec_stmt)); } -#line 1649 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1651 "bison_parser.cpp" /* yacc.c:1257 */ break; case 158: /* import_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).import_stmt)); } -#line 1655 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1657 "bison_parser.cpp" /* yacc.c:1257 */ break; case 159: /* import_file_type */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1661 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1663 "bison_parser.cpp" /* yacc.c:1257 */ break; case 160: /* file_path */ -#line 142 "bison_parser.y" /* yacc.c:1257 */ +#line 137 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 1667 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1669 "bison_parser.cpp" /* yacc.c:1257 */ break; case 161: /* create_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).create_stmt)); } -#line 1673 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1675 "bison_parser.cpp" /* yacc.c:1257 */ break; case 162: /* opt_not_exists */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1679 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1681 "bison_parser.cpp" /* yacc.c:1257 */ break; case 163: /* column_def_commalist */ -#line 143 "bison_parser.y" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).column_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).column_vec))) { @@ -1688,47 +1690,47 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).column_vec)); } -#line 1692 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1694 "bison_parser.cpp" /* yacc.c:1257 */ break; case 164: /* column_def */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).column_t)); } -#line 1698 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1700 "bison_parser.cpp" /* yacc.c:1257 */ break; case 165: /* column_type */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1704 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1706 "bison_parser.cpp" /* yacc.c:1257 */ break; case 166: /* drop_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).drop_stmt)); } -#line 1710 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1712 "bison_parser.cpp" /* yacc.c:1257 */ break; case 167: /* delete_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).delete_stmt)); } -#line 1716 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1718 "bison_parser.cpp" /* yacc.c:1257 */ break; case 168: /* truncate_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).delete_stmt)); } -#line 1722 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1724 "bison_parser.cpp" /* yacc.c:1257 */ break; case 169: /* insert_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).insert_stmt)); } -#line 1728 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1730 "bison_parser.cpp" /* yacc.c:1257 */ break; case 170: /* opt_column_list */ -#line 143 "bison_parser.y" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).str_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).str_vec))) { @@ -1737,17 +1739,17 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).str_vec)); } -#line 1741 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1743 "bison_parser.cpp" /* yacc.c:1257 */ break; case 171: /* update_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).update_stmt)); } -#line 1747 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1749 "bison_parser.cpp" /* yacc.c:1257 */ break; case 172: /* update_clause_commalist */ -#line 143 "bison_parser.y" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).update_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).update_vec))) { @@ -1756,47 +1758,47 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).update_vec)); } -#line 1760 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1762 "bison_parser.cpp" /* yacc.c:1257 */ break; case 173: /* update_clause */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).update_t)); } -#line 1766 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1768 "bison_parser.cpp" /* yacc.c:1257 */ break; case 174: /* select_statement */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).select_stmt)); } -#line 1772 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1774 "bison_parser.cpp" /* yacc.c:1257 */ break; case 175: /* select_with_paren */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).select_stmt)); } -#line 1778 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1780 "bison_parser.cpp" /* yacc.c:1257 */ break; case 176: /* select_no_paren */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).select_stmt)); } -#line 1784 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1786 "bison_parser.cpp" /* yacc.c:1257 */ break; case 178: /* select_clause */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).select_stmt)); } -#line 1790 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1792 "bison_parser.cpp" /* yacc.c:1257 */ break; case 179: /* opt_distinct */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1796 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1798 "bison_parser.cpp" /* yacc.c:1257 */ break; case 180: /* select_list */ -#line 143 "bison_parser.y" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).expr_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -1805,35 +1807,35 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 1809 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1811 "bison_parser.cpp" /* yacc.c:1257 */ break; case 181: /* from_clause */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 1815 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1817 "bison_parser.cpp" /* yacc.c:1257 */ break; case 182: /* opt_where */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1821 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1823 "bison_parser.cpp" /* yacc.c:1257 */ break; case 183: /* opt_group */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).group_t)); } -#line 1827 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1829 "bison_parser.cpp" /* yacc.c:1257 */ break; case 184: /* opt_having */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1833 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1835 "bison_parser.cpp" /* yacc.c:1257 */ break; case 185: /* opt_order */ -#line 143 "bison_parser.y" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).order_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).order_vec))) { @@ -1842,11 +1844,11 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).order_vec)); } -#line 1846 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1848 "bison_parser.cpp" /* yacc.c:1257 */ break; case 186: /* order_list */ -#line 143 "bison_parser.y" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).order_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).order_vec))) { @@ -1855,35 +1857,35 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).order_vec)); } -#line 1859 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1861 "bison_parser.cpp" /* yacc.c:1257 */ break; case 187: /* order_desc */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).order)); } -#line 1865 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1867 "bison_parser.cpp" /* yacc.c:1257 */ break; case 188: /* opt_order_type */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 1871 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1873 "bison_parser.cpp" /* yacc.c:1257 */ break; case 189: /* opt_top */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).limit)); } -#line 1877 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1879 "bison_parser.cpp" /* yacc.c:1257 */ break; case 190: /* opt_limit */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).limit)); } -#line 1883 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1885 "bison_parser.cpp" /* yacc.c:1257 */ break; case 191: /* expr_list */ -#line 143 "bison_parser.y" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).expr_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -1892,11 +1894,11 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 1896 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1898 "bison_parser.cpp" /* yacc.c:1257 */ break; case 192: /* literal_list */ -#line 143 "bison_parser.y" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).expr_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -1905,143 +1907,143 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 1909 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1911 "bison_parser.cpp" /* yacc.c:1257 */ break; case 193: /* expr_alias */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1915 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1917 "bison_parser.cpp" /* yacc.c:1257 */ break; case 194: /* expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1921 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1923 "bison_parser.cpp" /* yacc.c:1257 */ break; case 195: /* operand */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1927 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1929 "bison_parser.cpp" /* yacc.c:1257 */ break; case 196: /* scalar_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1933 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1935 "bison_parser.cpp" /* yacc.c:1257 */ break; case 197: /* unary_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1939 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1941 "bison_parser.cpp" /* yacc.c:1257 */ break; case 198: /* binary_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1945 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1947 "bison_parser.cpp" /* yacc.c:1257 */ break; case 199: /* logic_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1951 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1953 "bison_parser.cpp" /* yacc.c:1257 */ break; case 200: /* in_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1957 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1959 "bison_parser.cpp" /* yacc.c:1257 */ break; case 201: /* case_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1963 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1965 "bison_parser.cpp" /* yacc.c:1257 */ break; case 202: /* exists_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1969 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1971 "bison_parser.cpp" /* yacc.c:1257 */ break; case 203: /* comp_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1975 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1977 "bison_parser.cpp" /* yacc.c:1257 */ break; case 204: /* function_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1981 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1983 "bison_parser.cpp" /* yacc.c:1257 */ break; case 205: /* between_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1987 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1989 "bison_parser.cpp" /* yacc.c:1257 */ break; case 206: /* column_name */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1993 "bison_parser.cpp" /* yacc.c:1257 */ +#line 1995 "bison_parser.cpp" /* yacc.c:1257 */ break; case 207: /* literal */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 1999 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2001 "bison_parser.cpp" /* yacc.c:1257 */ break; case 208: /* string_literal */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2005 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2007 "bison_parser.cpp" /* yacc.c:1257 */ break; case 209: /* num_literal */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2011 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2013 "bison_parser.cpp" /* yacc.c:1257 */ break; case 210: /* int_literal */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2017 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2019 "bison_parser.cpp" /* yacc.c:1257 */ break; case 211: /* star_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2023 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2025 "bison_parser.cpp" /* yacc.c:1257 */ break; case 212: /* placeholder_expr */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2029 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2031 "bison_parser.cpp" /* yacc.c:1257 */ break; case 213: /* table_ref */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2035 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2037 "bison_parser.cpp" /* yacc.c:1257 */ break; case 214: /* table_ref_atomic */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2041 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2043 "bison_parser.cpp" /* yacc.c:1257 */ break; case 215: /* table_ref_commalist */ -#line 143 "bison_parser.y" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).table_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).table_vec))) { @@ -2050,65 +2052,65 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).table_vec)); } -#line 2054 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2056 "bison_parser.cpp" /* yacc.c:1257 */ break; case 216: /* table_ref_name */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2060 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2062 "bison_parser.cpp" /* yacc.c:1257 */ break; case 217: /* table_ref_name_no_alias */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2066 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2068 "bison_parser.cpp" /* yacc.c:1257 */ break; case 218: /* table_name */ -#line 142 "bison_parser.y" /* yacc.c:1257 */ +#line 137 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 2072 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2074 "bison_parser.cpp" /* yacc.c:1257 */ break; case 219: /* alias */ -#line 142 "bison_parser.y" /* yacc.c:1257 */ +#line 137 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 2078 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2080 "bison_parser.cpp" /* yacc.c:1257 */ break; case 220: /* opt_alias */ -#line 142 "bison_parser.y" /* yacc.c:1257 */ +#line 137 "bison_parser.y" /* yacc.c:1257 */ { free( (((*yyvaluep).sval)) ); } -#line 2084 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2086 "bison_parser.cpp" /* yacc.c:1257 */ break; case 221: /* join_clause */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2090 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2092 "bison_parser.cpp" /* yacc.c:1257 */ break; case 222: /* opt_join_type */ -#line 141 "bison_parser.y" /* yacc.c:1257 */ +#line 136 "bison_parser.y" /* yacc.c:1257 */ { } -#line 2096 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2098 "bison_parser.cpp" /* yacc.c:1257 */ break; case 223: /* join_table */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).table)); } -#line 2102 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2104 "bison_parser.cpp" /* yacc.c:1257 */ break; case 224: /* join_condition */ -#line 151 "bison_parser.y" /* yacc.c:1257 */ +#line 146 "bison_parser.y" /* yacc.c:1257 */ { delete (((*yyvaluep).expr)); } -#line 2108 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2110 "bison_parser.cpp" /* yacc.c:1257 */ break; case 226: /* ident_commalist */ -#line 143 "bison_parser.y" /* yacc.c:1257 */ +#line 138 "bison_parser.y" /* yacc.c:1257 */ { if ((((*yyvaluep).str_vec)) != NULL) { for (auto ptr : *(((*yyvaluep).str_vec))) { @@ -2117,7 +2119,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).str_vec)); } -#line 2121 "bison_parser.cpp" /* yacc.c:1257 */ +#line 2123 "bison_parser.cpp" /* yacc.c:1257 */ break; @@ -2135,7 +2137,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio `----------*/ int -yyparse (hsql::SQLParserResult** result, yyscan_t scanner) +yyparse (hsql::SQLParserResult* result, yyscan_t scanner) { /* The lookahead symbol. */ int yychar; @@ -2225,7 +2227,7 @@ YYLTYPE yylloc = yyloc_default; yychar = YYEMPTY; /* Cause a token to be read. */ /* User initialization code. */ -#line 78 "bison_parser.y" /* yacc.c:1429 */ +#line 73 "bison_parser.y" /* yacc.c:1429 */ { // Initialize yylloc.first_column = 0; @@ -2236,7 +2238,7 @@ YYLTYPE yylloc = yyloc_default; yylloc.placeholder_id = 0; } -#line 2240 "bison_parser.cpp" /* yacc.c:1429 */ +#line 2242 "bison_parser.cpp" /* yacc.c:1429 */ yylsp[0] = yylloc; goto yysetstate; @@ -2423,174 +2425,182 @@ yyreduce: switch (yyn) { case 2: -#line 245 "bison_parser.y" /* yacc.c:1646 */ +#line 240 "bison_parser.y" /* yacc.c:1646 */ { - *result = (yyvsp[-1].stmt_list); + for (SQLStatement* stmt : *(yyvsp[-1].stmt_vec)) { + // Transfers ownership of the statement. + result->addStatement(stmt); + } + delete (yyvsp[-1].stmt_vec); } -#line 2431 "bison_parser.cpp" /* yacc.c:1646 */ - break; - - case 3: -#line 252 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.stmt_list) = new SQLParserResult((yyvsp[0].statement)); } #line 2437 "bison_parser.cpp" /* yacc.c:1646 */ break; - case 4: -#line 253 "bison_parser.y" /* yacc.c:1646 */ - { (yyvsp[-2].stmt_list)->addStatement((yyvsp[0].statement)); (yyval.stmt_list) = (yyvsp[-2].stmt_list); } + case 3: +#line 251 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.stmt_vec) = new std::vector(); (yyval.stmt_vec)->push_back((yyvsp[0].statement)); } #line 2443 "bison_parser.cpp" /* yacc.c:1646 */ break; + case 4: +#line 252 "bison_parser.y" /* yacc.c:1646 */ + { (yyvsp[-2].stmt_vec)->push_back((yyvsp[0].statement)); (yyval.stmt_vec) = (yyvsp[-2].stmt_vec); } +#line 2449 "bison_parser.cpp" /* yacc.c:1646 */ + break; + case 5: -#line 257 "bison_parser.y" /* yacc.c:1646 */ +#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 2453 "bison_parser.cpp" /* yacc.c:1646 */ - break; - - case 7: -#line 267 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.statement) = (yyvsp[0].select_stmt); } #line 2459 "bison_parser.cpp" /* yacc.c:1646 */ break; - case 8: -#line 268 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.statement) = (yyvsp[0].import_stmt); } + case 7: +#line 266 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.statement) = (yyvsp[0].select_stmt); } #line 2465 "bison_parser.cpp" /* yacc.c:1646 */ break; - case 9: -#line 269 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.statement) = (yyvsp[0].create_stmt); } + case 8: +#line 267 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.statement) = (yyvsp[0].import_stmt); } #line 2471 "bison_parser.cpp" /* yacc.c:1646 */ break; - case 10: -#line 270 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.statement) = (yyvsp[0].insert_stmt); } + case 9: +#line 268 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.statement) = (yyvsp[0].create_stmt); } #line 2477 "bison_parser.cpp" /* yacc.c:1646 */ break; - case 11: -#line 271 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.statement) = (yyvsp[0].delete_stmt); } + case 10: +#line 269 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.statement) = (yyvsp[0].insert_stmt); } #line 2483 "bison_parser.cpp" /* yacc.c:1646 */ break; - case 12: -#line 272 "bison_parser.y" /* yacc.c:1646 */ + case 11: +#line 270 "bison_parser.y" /* yacc.c:1646 */ { (yyval.statement) = (yyvsp[0].delete_stmt); } #line 2489 "bison_parser.cpp" /* yacc.c:1646 */ break; - case 13: -#line 273 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.statement) = (yyvsp[0].update_stmt); } + case 12: +#line 271 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.statement) = (yyvsp[0].delete_stmt); } #line 2495 "bison_parser.cpp" /* yacc.c:1646 */ break; - case 14: -#line 274 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.statement) = (yyvsp[0].drop_stmt); } + case 13: +#line 272 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.statement) = (yyvsp[0].update_stmt); } #line 2501 "bison_parser.cpp" /* yacc.c:1646 */ break; - case 15: -#line 275 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.statement) = (yyvsp[0].exec_stmt); } + case 14: +#line 273 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.statement) = (yyvsp[0].drop_stmt); } #line 2507 "bison_parser.cpp" /* yacc.c:1646 */ break; + case 15: +#line 274 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.statement) = (yyvsp[0].exec_stmt); } +#line 2513 "bison_parser.cpp" /* yacc.c:1646 */ + break; + case 16: -#line 283 "bison_parser.y" /* yacc.c:1646 */ +#line 282 "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)); } -#line 2517 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2523 "bison_parser.cpp" /* yacc.c:1646 */ break; case 17: -#line 288 "bison_parser.y" /* yacc.c:1646 */ +#line 287 "bison_parser.y" /* yacc.c:1646 */ { (yyval.prep_stmt) = new PrepareStatement(); (yyval.prep_stmt)->name = (yyvsp[-4].sval); - (yyval.prep_stmt)->query = (yyvsp[-2].stmt_list); + (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 2527 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2537 "bison_parser.cpp" /* yacc.c:1646 */ break; case 18: -#line 296 "bison_parser.y" /* yacc.c:1646 */ +#line 299 "bison_parser.y" /* yacc.c:1646 */ { (yyval.exec_stmt) = new ExecuteStatement(); (yyval.exec_stmt)->name = (yyvsp[0].sval); } -#line 2536 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2546 "bison_parser.cpp" /* yacc.c:1646 */ break; case 19: -#line 300 "bison_parser.y" /* yacc.c:1646 */ +#line 303 "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 2546 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2556 "bison_parser.cpp" /* yacc.c:1646 */ break; case 20: -#line 312 "bison_parser.y" /* yacc.c:1646 */ +#line 315 "bison_parser.y" /* yacc.c:1646 */ { (yyval.import_stmt) = new ImportStatement((ImportStatement::ImportType) (yyvsp[-4].uval)); (yyval.import_stmt)->filePath = (yyvsp[-2].sval); (yyval.import_stmt)->tableName = (yyvsp[0].sval); } -#line 2556 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2566 "bison_parser.cpp" /* yacc.c:1646 */ break; case 21: -#line 320 "bison_parser.y" /* yacc.c:1646 */ +#line 323 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = ImportStatement::kImportCSV; } -#line 2562 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2572 "bison_parser.cpp" /* yacc.c:1646 */ break; case 22: -#line 324 "bison_parser.y" /* yacc.c:1646 */ +#line 327 "bison_parser.y" /* yacc.c:1646 */ { (yyval.sval) = strdup((yyvsp[0].expr)->name); delete (yyvsp[0].expr); } -#line 2568 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2578 "bison_parser.cpp" /* yacc.c:1646 */ break; case 23: -#line 334 "bison_parser.y" /* yacc.c:1646 */ +#line 337 "bison_parser.y" /* yacc.c:1646 */ { (yyval.create_stmt) = new CreateStatement(CreateStatement::kTableFromTbl); (yyval.create_stmt)->ifNotExists = (yyvsp[-5].bval); (yyval.create_stmt)->tableName = (yyvsp[-4].sval); (yyval.create_stmt)->filePath = (yyvsp[0].sval); } -#line 2579 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2589 "bison_parser.cpp" /* yacc.c:1646 */ break; case 24: -#line 340 "bison_parser.y" /* yacc.c:1646 */ +#line 343 "bison_parser.y" /* yacc.c:1646 */ { (yyval.create_stmt) = new CreateStatement(CreateStatement::kTable); (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); (yyval.create_stmt)->tableName = (yyvsp[-3].sval); (yyval.create_stmt)->columns = (yyvsp[-1].column_vec); } -#line 2590 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2600 "bison_parser.cpp" /* yacc.c:1646 */ break; case 25: -#line 346 "bison_parser.y" /* yacc.c:1646 */ +#line 349 "bison_parser.y" /* yacc.c:1646 */ { (yyval.create_stmt) = new CreateStatement(CreateStatement::kView); (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); @@ -2598,192 +2608,192 @@ yyreduce: (yyval.create_stmt)->viewColumns = (yyvsp[-2].str_vec); (yyval.create_stmt)->select = (yyvsp[0].select_stmt); } -#line 2602 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2612 "bison_parser.cpp" /* yacc.c:1646 */ break; case 26: -#line 356 "bison_parser.y" /* yacc.c:1646 */ +#line 359 "bison_parser.y" /* yacc.c:1646 */ { (yyval.bval) = true; } -#line 2608 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2618 "bison_parser.cpp" /* yacc.c:1646 */ break; case 27: -#line 357 "bison_parser.y" /* yacc.c:1646 */ +#line 360 "bison_parser.y" /* yacc.c:1646 */ { (yyval.bval) = false; } -#line 2614 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2624 "bison_parser.cpp" /* yacc.c:1646 */ break; case 28: -#line 361 "bison_parser.y" /* yacc.c:1646 */ +#line 364 "bison_parser.y" /* yacc.c:1646 */ { (yyval.column_vec) = new std::vector(); (yyval.column_vec)->push_back((yyvsp[0].column_t)); } -#line 2620 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2630 "bison_parser.cpp" /* yacc.c:1646 */ break; case 29: -#line 362 "bison_parser.y" /* yacc.c:1646 */ +#line 365 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].column_vec)->push_back((yyvsp[0].column_t)); (yyval.column_vec) = (yyvsp[-2].column_vec); } -#line 2626 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2636 "bison_parser.cpp" /* yacc.c:1646 */ break; case 30: -#line 366 "bison_parser.y" /* yacc.c:1646 */ +#line 369 "bison_parser.y" /* yacc.c:1646 */ { (yyval.column_t) = new ColumnDefinition((yyvsp[-1].sval), (ColumnDefinition::DataType) (yyvsp[0].uval)); } -#line 2634 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2644 "bison_parser.cpp" /* yacc.c:1646 */ break; case 31: -#line 373 "bison_parser.y" /* yacc.c:1646 */ +#line 376 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = ColumnDefinition::INT; } -#line 2640 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2650 "bison_parser.cpp" /* yacc.c:1646 */ break; case 32: -#line 374 "bison_parser.y" /* yacc.c:1646 */ +#line 377 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = ColumnDefinition::INT; } -#line 2646 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2656 "bison_parser.cpp" /* yacc.c:1646 */ break; case 33: -#line 375 "bison_parser.y" /* yacc.c:1646 */ +#line 378 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = ColumnDefinition::DOUBLE; } -#line 2652 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2662 "bison_parser.cpp" /* yacc.c:1646 */ break; case 34: -#line 376 "bison_parser.y" /* yacc.c:1646 */ +#line 379 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = ColumnDefinition::TEXT; } -#line 2658 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2668 "bison_parser.cpp" /* yacc.c:1646 */ break; case 35: -#line 386 "bison_parser.y" /* yacc.c:1646 */ +#line 389 "bison_parser.y" /* yacc.c:1646 */ { (yyval.drop_stmt) = new DropStatement(DropStatement::kTable); (yyval.drop_stmt)->name = (yyvsp[0].sval); } -#line 2667 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2677 "bison_parser.cpp" /* yacc.c:1646 */ break; case 36: -#line 390 "bison_parser.y" /* yacc.c:1646 */ +#line 393 "bison_parser.y" /* yacc.c:1646 */ { (yyval.drop_stmt) = new DropStatement(DropStatement::kView); (yyval.drop_stmt)->name = (yyvsp[0].sval); } -#line 2676 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2686 "bison_parser.cpp" /* yacc.c:1646 */ break; case 37: -#line 394 "bison_parser.y" /* yacc.c:1646 */ +#line 397 "bison_parser.y" /* yacc.c:1646 */ { (yyval.drop_stmt) = new DropStatement(DropStatement::kPreparedStatement); (yyval.drop_stmt)->name = (yyvsp[0].sval); } -#line 2685 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2695 "bison_parser.cpp" /* yacc.c:1646 */ break; case 38: -#line 406 "bison_parser.y" /* yacc.c:1646 */ +#line 409 "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 2695 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2705 "bison_parser.cpp" /* yacc.c:1646 */ break; case 39: -#line 414 "bison_parser.y" /* yacc.c:1646 */ +#line 417 "bison_parser.y" /* yacc.c:1646 */ { (yyval.delete_stmt) = new DeleteStatement(); (yyval.delete_stmt)->tableName = (yyvsp[0].sval); } -#line 2704 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2714 "bison_parser.cpp" /* yacc.c:1646 */ break; case 40: -#line 426 "bison_parser.y" /* yacc.c:1646 */ +#line 429 "bison_parser.y" /* yacc.c:1646 */ { (yyval.insert_stmt) = new InsertStatement(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 2715 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2725 "bison_parser.cpp" /* yacc.c:1646 */ break; case 41: -#line 432 "bison_parser.y" /* yacc.c:1646 */ +#line 435 "bison_parser.y" /* yacc.c:1646 */ { (yyval.insert_stmt) = new InsertStatement(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 2726 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2736 "bison_parser.cpp" /* yacc.c:1646 */ break; case 42: -#line 442 "bison_parser.y" /* yacc.c:1646 */ +#line 445 "bison_parser.y" /* yacc.c:1646 */ { (yyval.str_vec) = (yyvsp[-1].str_vec); } -#line 2732 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2742 "bison_parser.cpp" /* yacc.c:1646 */ break; case 43: -#line 443 "bison_parser.y" /* yacc.c:1646 */ +#line 446 "bison_parser.y" /* yacc.c:1646 */ { (yyval.str_vec) = NULL; } -#line 2738 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2748 "bison_parser.cpp" /* yacc.c:1646 */ break; case 44: -#line 453 "bison_parser.y" /* yacc.c:1646 */ +#line 456 "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 2749 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2759 "bison_parser.cpp" /* yacc.c:1646 */ break; case 45: -#line 462 "bison_parser.y" /* yacc.c:1646 */ +#line 465 "bison_parser.y" /* yacc.c:1646 */ { (yyval.update_vec) = new std::vector(); (yyval.update_vec)->push_back((yyvsp[0].update_t)); } -#line 2755 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2765 "bison_parser.cpp" /* yacc.c:1646 */ break; case 46: -#line 463 "bison_parser.y" /* yacc.c:1646 */ +#line 466 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].update_vec)->push_back((yyvsp[0].update_t)); (yyval.update_vec) = (yyvsp[-2].update_vec); } -#line 2761 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2771 "bison_parser.cpp" /* yacc.c:1646 */ break; case 47: -#line 467 "bison_parser.y" /* yacc.c:1646 */ +#line 470 "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 2771 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2781 "bison_parser.cpp" /* yacc.c:1646 */ break; case 50: -#line 484 "bison_parser.y" /* yacc.c:1646 */ +#line 487 "bison_parser.y" /* yacc.c:1646 */ { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } -#line 2777 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2787 "bison_parser.cpp" /* yacc.c:1646 */ break; case 51: -#line 485 "bison_parser.y" /* yacc.c:1646 */ +#line 488 "bison_parser.y" /* yacc.c:1646 */ { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } -#line 2783 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2793 "bison_parser.cpp" /* yacc.c:1646 */ break; case 52: -#line 489 "bison_parser.y" /* yacc.c:1646 */ +#line 492 "bison_parser.y" /* yacc.c:1646 */ { (yyval.select_stmt) = (yyvsp[-2].select_stmt); (yyval.select_stmt)->order = (yyvsp[-1].order_vec); @@ -2794,11 +2804,11 @@ yyreduce: (yyval.select_stmt)->limit = (yyvsp[0].limit); } } -#line 2798 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2808 "bison_parser.cpp" /* yacc.c:1646 */ break; case 53: -#line 499 "bison_parser.y" /* yacc.c:1646 */ +#line 502 "bison_parser.y" /* yacc.c:1646 */ { // TODO: allow multiple unions (through linked list) // TODO: capture type of set_operator @@ -2813,11 +2823,11 @@ yyreduce: (yyval.select_stmt)->limit = (yyvsp[0].limit); } } -#line 2817 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2827 "bison_parser.cpp" /* yacc.c:1646 */ break; case 54: -#line 513 "bison_parser.y" /* yacc.c:1646 */ +#line 516 "bison_parser.y" /* yacc.c:1646 */ { (yyval.select_stmt) = (yyvsp[-4].select_stmt); (yyval.select_stmt)->unionSelect = (yyvsp[-2].select_stmt); @@ -2829,11 +2839,11 @@ yyreduce: (yyval.select_stmt)->limit = (yyvsp[0].limit); } } -#line 2833 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2843 "bison_parser.cpp" /* yacc.c:1646 */ break; case 58: -#line 533 "bison_parser.y" /* yacc.c:1646 */ +#line 536 "bison_parser.y" /* yacc.c:1646 */ { (yyval.select_stmt) = new SelectStatement(); (yyval.select_stmt)->limit = (yyvsp[-5].limit); @@ -2843,465 +2853,465 @@ yyreduce: (yyval.select_stmt)->whereClause = (yyvsp[-1].expr); (yyval.select_stmt)->groupBy = (yyvsp[0].group_t); } -#line 2847 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2857 "bison_parser.cpp" /* yacc.c:1646 */ break; case 59: -#line 545 "bison_parser.y" /* yacc.c:1646 */ +#line 548 "bison_parser.y" /* yacc.c:1646 */ { (yyval.bval) = true; } -#line 2853 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2863 "bison_parser.cpp" /* yacc.c:1646 */ break; case 60: -#line 546 "bison_parser.y" /* yacc.c:1646 */ +#line 549 "bison_parser.y" /* yacc.c:1646 */ { (yyval.bval) = false; } -#line 2859 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2869 "bison_parser.cpp" /* yacc.c:1646 */ break; case 62: -#line 554 "bison_parser.y" /* yacc.c:1646 */ +#line 557 "bison_parser.y" /* yacc.c:1646 */ { (yyval.table) = (yyvsp[0].table); } -#line 2865 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2875 "bison_parser.cpp" /* yacc.c:1646 */ break; case 63: -#line 559 "bison_parser.y" /* yacc.c:1646 */ +#line 562 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); } -#line 2871 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2881 "bison_parser.cpp" /* yacc.c:1646 */ break; case 64: -#line 560 "bison_parser.y" /* yacc.c:1646 */ +#line 563 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = NULL; } -#line 2877 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2887 "bison_parser.cpp" /* yacc.c:1646 */ break; case 65: -#line 564 "bison_parser.y" /* yacc.c:1646 */ +#line 567 "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 2887 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2897 "bison_parser.cpp" /* yacc.c:1646 */ break; case 66: -#line 569 "bison_parser.y" /* yacc.c:1646 */ +#line 572 "bison_parser.y" /* yacc.c:1646 */ { (yyval.group_t) = NULL; } -#line 2893 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2903 "bison_parser.cpp" /* yacc.c:1646 */ break; case 67: -#line 573 "bison_parser.y" /* yacc.c:1646 */ +#line 576 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); } -#line 2899 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2909 "bison_parser.cpp" /* yacc.c:1646 */ break; case 68: -#line 574 "bison_parser.y" /* yacc.c:1646 */ +#line 577 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = NULL; } -#line 2905 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2915 "bison_parser.cpp" /* yacc.c:1646 */ break; case 69: -#line 577 "bison_parser.y" /* yacc.c:1646 */ +#line 580 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_vec) = (yyvsp[0].order_vec); } -#line 2911 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2921 "bison_parser.cpp" /* yacc.c:1646 */ break; case 70: -#line 578 "bison_parser.y" /* yacc.c:1646 */ +#line 581 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_vec) = NULL; } -#line 2917 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2927 "bison_parser.cpp" /* yacc.c:1646 */ break; case 71: -#line 582 "bison_parser.y" /* yacc.c:1646 */ +#line 585 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_vec) = new std::vector(); (yyval.order_vec)->push_back((yyvsp[0].order)); } -#line 2923 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2933 "bison_parser.cpp" /* yacc.c:1646 */ break; case 72: -#line 583 "bison_parser.y" /* yacc.c:1646 */ +#line 586 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].order_vec)->push_back((yyvsp[0].order)); (yyval.order_vec) = (yyvsp[-2].order_vec); } -#line 2929 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2939 "bison_parser.cpp" /* yacc.c:1646 */ break; case 73: -#line 587 "bison_parser.y" /* yacc.c:1646 */ +#line 590 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order) = new OrderDescription((yyvsp[0].order_type), (yyvsp[-1].expr)); } -#line 2935 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2945 "bison_parser.cpp" /* yacc.c:1646 */ break; case 74: -#line 591 "bison_parser.y" /* yacc.c:1646 */ +#line 594 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_type) = kOrderAsc; } -#line 2941 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2951 "bison_parser.cpp" /* yacc.c:1646 */ break; case 75: -#line 592 "bison_parser.y" /* yacc.c:1646 */ +#line 595 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_type) = kOrderDesc; } -#line 2947 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2957 "bison_parser.cpp" /* yacc.c:1646 */ break; case 76: -#line 593 "bison_parser.y" /* yacc.c:1646 */ +#line 596 "bison_parser.y" /* yacc.c:1646 */ { (yyval.order_type) = kOrderAsc; } -#line 2953 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2963 "bison_parser.cpp" /* yacc.c:1646 */ break; case 77: -#line 599 "bison_parser.y" /* yacc.c:1646 */ +#line 602 "bison_parser.y" /* yacc.c:1646 */ { (yyval.limit) = new LimitDescription((yyvsp[0].expr)->ival, kNoOffset); delete (yyvsp[0].expr); } -#line 2959 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2969 "bison_parser.cpp" /* yacc.c:1646 */ break; case 78: -#line 600 "bison_parser.y" /* yacc.c:1646 */ +#line 603 "bison_parser.y" /* yacc.c:1646 */ { (yyval.limit) = NULL; } -#line 2965 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2975 "bison_parser.cpp" /* yacc.c:1646 */ break; case 79: -#line 604 "bison_parser.y" /* yacc.c:1646 */ +#line 607 "bison_parser.y" /* yacc.c:1646 */ { (yyval.limit) = new LimitDescription((yyvsp[0].expr)->ival, kNoOffset); delete (yyvsp[0].expr); } -#line 2971 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2981 "bison_parser.cpp" /* yacc.c:1646 */ break; case 80: -#line 605 "bison_parser.y" /* yacc.c:1646 */ +#line 608 "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 2977 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2987 "bison_parser.cpp" /* yacc.c:1646 */ break; case 81: -#line 606 "bison_parser.y" /* yacc.c:1646 */ +#line 609 "bison_parser.y" /* yacc.c:1646 */ { (yyval.limit) = NULL; } -#line 2983 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2993 "bison_parser.cpp" /* yacc.c:1646 */ break; case 82: -#line 613 "bison_parser.y" /* yacc.c:1646 */ +#line 616 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } -#line 2989 "bison_parser.cpp" /* yacc.c:1646 */ +#line 2999 "bison_parser.cpp" /* yacc.c:1646 */ break; case 83: -#line 614 "bison_parser.y" /* yacc.c:1646 */ +#line 617 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } -#line 2995 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3005 "bison_parser.cpp" /* yacc.c:1646 */ break; case 84: -#line 618 "bison_parser.y" /* yacc.c:1646 */ +#line 621 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } -#line 3001 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3011 "bison_parser.cpp" /* yacc.c:1646 */ break; case 85: -#line 619 "bison_parser.y" /* yacc.c:1646 */ +#line 622 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } -#line 3007 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3017 "bison_parser.cpp" /* yacc.c:1646 */ break; case 86: -#line 623 "bison_parser.y" /* yacc.c:1646 */ +#line 626 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[-1].expr); (yyval.expr)->alias = (yyvsp[0].sval); } -#line 3016 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3026 "bison_parser.cpp" /* yacc.c:1646 */ break; case 93: -#line 639 "bison_parser.y" /* yacc.c:1646 */ +#line 642 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[-1].expr); } -#line 3022 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3032 "bison_parser.cpp" /* yacc.c:1646 */ break; case 98: -#line 644 "bison_parser.y" /* yacc.c:1646 */ +#line 647 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeSelect((yyvsp[-1].select_stmt)); } -#line 3028 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3038 "bison_parser.cpp" /* yacc.c:1646 */ break; case 102: -#line 654 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpUnary(Expr::UMINUS, (yyvsp[0].expr)); } -#line 3034 "bison_parser.cpp" /* yacc.c:1646 */ +#line 657 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpUnary(kOpMinus, (yyvsp[0].expr)); } +#line 3044 "bison_parser.cpp" /* yacc.c:1646 */ break; case 103: -#line 655 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpUnary(Expr::NOT, (yyvsp[0].expr)); } -#line 3040 "bison_parser.cpp" /* yacc.c:1646 */ +#line 658 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpUnary(kOpNot, (yyvsp[0].expr)); } +#line 3050 "bison_parser.cpp" /* yacc.c:1646 */ break; case 105: -#line 660 "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 3046 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3056 "bison_parser.cpp" /* yacc.c:1646 */ break; case 106: -#line 661 "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 3052 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3062 "bison_parser.cpp" /* yacc.c:1646 */ break; case 107: -#line 662 "bison_parser.y" /* yacc.c:1646 */ +#line 665 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '/', (yyvsp[0].expr)); } -#line 3058 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3068 "bison_parser.cpp" /* yacc.c:1646 */ break; case 108: -#line 663 "bison_parser.y" /* yacc.c:1646 */ +#line 666 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '*', (yyvsp[0].expr)); } -#line 3064 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3074 "bison_parser.cpp" /* yacc.c:1646 */ break; case 109: -#line 664 "bison_parser.y" /* yacc.c:1646 */ +#line 667 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '%', (yyvsp[0].expr)); } -#line 3070 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3080 "bison_parser.cpp" /* yacc.c:1646 */ break; case 110: -#line 665 "bison_parser.y" /* yacc.c:1646 */ +#line 668 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '^', (yyvsp[0].expr)); } -#line 3076 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3086 "bison_parser.cpp" /* yacc.c:1646 */ break; case 111: -#line 666 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), Expr::LIKE, (yyvsp[0].expr)); } -#line 3082 "bison_parser.cpp" /* yacc.c:1646 */ +#line 669 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLike, (yyvsp[0].expr)); } +#line 3092 "bison_parser.cpp" /* yacc.c:1646 */ break; case 112: -#line 667 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-3].expr), Expr::NOT_LIKE, (yyvsp[0].expr)); } -#line 3088 "bison_parser.cpp" /* yacc.c:1646 */ +#line 670 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-3].expr), kOpNotLike, (yyvsp[0].expr)); } +#line 3098 "bison_parser.cpp" /* yacc.c:1646 */ break; case 113: -#line 671 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), Expr::AND, (yyvsp[0].expr)); } -#line 3094 "bison_parser.cpp" /* yacc.c:1646 */ +#line 674 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAnd, (yyvsp[0].expr)); } +#line 3104 "bison_parser.cpp" /* yacc.c:1646 */ break; case 114: -#line 672 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), Expr::OR, (yyvsp[0].expr)); } -#line 3100 "bison_parser.cpp" /* yacc.c:1646 */ +#line 675 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpOr, (yyvsp[0].expr)); } +#line 3110 "bison_parser.cpp" /* yacc.c:1646 */ break; case 115: -#line 676 "bison_parser.y" /* yacc.c:1646 */ +#line 679 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].expr_vec)); } -#line 3106 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3116 "bison_parser.cpp" /* yacc.c:1646 */ break; case 116: -#line 677 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpUnary(Expr::NOT, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].expr_vec))); } -#line 3112 "bison_parser.cpp" /* yacc.c:1646 */ +#line 680 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].expr_vec))); } +#line 3122 "bison_parser.cpp" /* yacc.c:1646 */ break; case 117: -#line 678 "bison_parser.y" /* yacc.c:1646 */ +#line 681 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].select_stmt)); } -#line 3118 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3128 "bison_parser.cpp" /* yacc.c:1646 */ break; case 118: -#line 679 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpUnary(Expr::NOT, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].select_stmt))); } -#line 3124 "bison_parser.cpp" /* yacc.c:1646 */ +#line 682 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].select_stmt))); } +#line 3134 "bison_parser.cpp" /* yacc.c:1646 */ break; case 119: -#line 684 "bison_parser.y" /* yacc.c:1646 */ +#line 687 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeCase((yyvsp[-5].expr), (yyvsp[-3].expr), (yyvsp[-1].expr)); } -#line 3130 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3140 "bison_parser.cpp" /* yacc.c:1646 */ break; case 120: -#line 688 "bison_parser.y" /* yacc.c:1646 */ +#line 691 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeExists((yyvsp[-1].select_stmt)); } -#line 3136 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3146 "bison_parser.cpp" /* yacc.c:1646 */ break; case 121: -#line 689 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpUnary(Expr::NOT, Expr::makeExists((yyvsp[-1].select_stmt))); } -#line 3142 "bison_parser.cpp" /* yacc.c:1646 */ +#line 692 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeExists((yyvsp[-1].select_stmt))); } +#line 3152 "bison_parser.cpp" /* yacc.c:1646 */ break; case 122: -#line 693 "bison_parser.y" /* yacc.c:1646 */ +#line 696 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '=', (yyvsp[0].expr)); } -#line 3148 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3158 "bison_parser.cpp" /* yacc.c:1646 */ break; case 123: -#line 694 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), Expr::NOT_EQUALS, (yyvsp[0].expr)); } -#line 3154 "bison_parser.cpp" /* yacc.c:1646 */ +#line 697 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpNotEquals, (yyvsp[0].expr)); } +#line 3164 "bison_parser.cpp" /* yacc.c:1646 */ break; case 124: -#line 695 "bison_parser.y" /* yacc.c:1646 */ +#line 698 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '<', (yyvsp[0].expr)); } -#line 3160 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3170 "bison_parser.cpp" /* yacc.c:1646 */ break; case 125: -#line 696 "bison_parser.y" /* yacc.c:1646 */ +#line 699 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), '>', (yyvsp[0].expr)); } -#line 3166 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3176 "bison_parser.cpp" /* yacc.c:1646 */ break; case 126: -#line 697 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), Expr::LESS_EQ, (yyvsp[0].expr)); } -#line 3172 "bison_parser.cpp" /* yacc.c:1646 */ +#line 700 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLessEq, (yyvsp[0].expr)); } +#line 3182 "bison_parser.cpp" /* yacc.c:1646 */ break; case 127: -#line 698 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), Expr::GREATER_EQ, (yyvsp[0].expr)); } -#line 3178 "bison_parser.cpp" /* yacc.c:1646 */ +#line 701 "bison_parser.y" /* yacc.c:1646 */ + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreaterEq, (yyvsp[0].expr)); } +#line 3188 "bison_parser.cpp" /* yacc.c:1646 */ break; case 128: -#line 702 "bison_parser.y" /* yacc.c:1646 */ +#line 705 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-4].sval), (yyvsp[-1].expr_vec), (yyvsp[-2].bval)); } -#line 3184 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3194 "bison_parser.cpp" /* yacc.c:1646 */ break; case 129: -#line 706 "bison_parser.y" /* yacc.c:1646 */ +#line 709 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeBetween((yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 3190 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3200 "bison_parser.cpp" /* yacc.c:1646 */ break; case 130: -#line 710 "bison_parser.y" /* yacc.c:1646 */ +#line 713 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeColumnRef((yyvsp[0].sval)); } -#line 3196 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3206 "bison_parser.cpp" /* yacc.c:1646 */ break; case 131: -#line 711 "bison_parser.y" /* yacc.c:1646 */ +#line 714 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeColumnRef((yyvsp[-2].sval), (yyvsp[0].sval)); } -#line 3202 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3212 "bison_parser.cpp" /* yacc.c:1646 */ break; case 135: -#line 721 "bison_parser.y" /* yacc.c:1646 */ +#line 724 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeLiteral((yyvsp[0].sval)); } -#line 3208 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3218 "bison_parser.cpp" /* yacc.c:1646 */ break; case 136: -#line 726 "bison_parser.y" /* yacc.c:1646 */ +#line 729 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeLiteral((yyvsp[0].fval)); } -#line 3214 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3224 "bison_parser.cpp" /* yacc.c:1646 */ break; case 138: -#line 731 "bison_parser.y" /* yacc.c:1646 */ +#line 734 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makeLiteral((yyvsp[0].ival)); } -#line 3220 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3230 "bison_parser.cpp" /* yacc.c:1646 */ break; case 139: -#line 735 "bison_parser.y" /* yacc.c:1646 */ +#line 738 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = new Expr(kExprStar); } -#line 3226 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3236 "bison_parser.cpp" /* yacc.c:1646 */ break; case 140: -#line 739 "bison_parser.y" /* yacc.c:1646 */ +#line 742 "bison_parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::makePlaceholder(yylloc.total_column); yyloc.placeholder_list.push_back((yyval.expr)); } -#line 3235 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3245 "bison_parser.cpp" /* yacc.c:1646 */ break; case 142: -#line 751 "bison_parser.y" /* yacc.c:1646 */ +#line 754 "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 3246 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3256 "bison_parser.cpp" /* yacc.c:1646 */ break; case 144: -#line 762 "bison_parser.y" /* yacc.c:1646 */ +#line 765 "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 3257 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3267 "bison_parser.cpp" /* yacc.c:1646 */ break; case 146: -#line 773 "bison_parser.y" /* yacc.c:1646 */ +#line 776 "bison_parser.y" /* yacc.c:1646 */ { (yyval.table_vec) = new std::vector(); (yyval.table_vec)->push_back((yyvsp[0].table)); } -#line 3263 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3273 "bison_parser.cpp" /* yacc.c:1646 */ break; case 147: -#line 774 "bison_parser.y" /* yacc.c:1646 */ +#line 777 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); (yyval.table_vec) = (yyvsp[-2].table_vec); } -#line 3269 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3279 "bison_parser.cpp" /* yacc.c:1646 */ break; case 148: -#line 779 "bison_parser.y" /* yacc.c:1646 */ +#line 782 "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 3280 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3290 "bison_parser.cpp" /* yacc.c:1646 */ break; case 149: -#line 789 "bison_parser.y" /* yacc.c:1646 */ +#line 792 "bison_parser.y" /* yacc.c:1646 */ { (yyval.table) = new TableRef(kTableName); (yyval.table)->name = (yyvsp[0].sval); } -#line 3289 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3299 "bison_parser.cpp" /* yacc.c:1646 */ break; case 152: -#line 803 "bison_parser.y" /* yacc.c:1646 */ +#line 806 "bison_parser.y" /* yacc.c:1646 */ { (yyval.sval) = (yyvsp[0].sval); } -#line 3295 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3305 "bison_parser.cpp" /* yacc.c:1646 */ break; case 155: -#line 809 "bison_parser.y" /* yacc.c:1646 */ +#line 812 "bison_parser.y" /* yacc.c:1646 */ { (yyval.sval) = NULL; } -#line 3301 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3311 "bison_parser.cpp" /* yacc.c:1646 */ break; case 156: -#line 818 "bison_parser.y" /* yacc.c:1646 */ +#line 821 "bison_parser.y" /* yacc.c:1646 */ { (yyval.table) = new TableRef(kTableJoin); (yyval.table)->join = new JoinDefinition(); @@ -3310,88 +3320,88 @@ yyreduce: (yyval.table)->join->right = (yyvsp[-2].table); (yyval.table)->join->condition = (yyvsp[0].expr); } -#line 3314 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3324 "bison_parser.cpp" /* yacc.c:1646 */ break; case 157: -#line 829 "bison_parser.y" /* yacc.c:1646 */ +#line 832 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinInner; } -#line 3320 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3330 "bison_parser.cpp" /* yacc.c:1646 */ break; case 158: -#line 830 "bison_parser.y" /* yacc.c:1646 */ +#line 833 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinOuter; } -#line 3326 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3336 "bison_parser.cpp" /* yacc.c:1646 */ break; case 159: -#line 831 "bison_parser.y" /* yacc.c:1646 */ +#line 834 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinLeftOuter; } -#line 3332 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3342 "bison_parser.cpp" /* yacc.c:1646 */ break; case 160: -#line 832 "bison_parser.y" /* yacc.c:1646 */ +#line 835 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinRightOuter; } -#line 3338 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3348 "bison_parser.cpp" /* yacc.c:1646 */ break; case 161: -#line 833 "bison_parser.y" /* yacc.c:1646 */ +#line 836 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinLeft; } -#line 3344 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3354 "bison_parser.cpp" /* yacc.c:1646 */ break; case 162: -#line 834 "bison_parser.y" /* yacc.c:1646 */ +#line 837 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinRight; } -#line 3350 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3360 "bison_parser.cpp" /* yacc.c:1646 */ break; case 163: -#line 835 "bison_parser.y" /* yacc.c:1646 */ +#line 838 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinCross; } -#line 3356 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3366 "bison_parser.cpp" /* yacc.c:1646 */ break; case 164: -#line 836 "bison_parser.y" /* yacc.c:1646 */ +#line 839 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinNatural; } -#line 3362 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3372 "bison_parser.cpp" /* yacc.c:1646 */ break; case 165: -#line 837 "bison_parser.y" /* yacc.c:1646 */ +#line 840 "bison_parser.y" /* yacc.c:1646 */ { (yyval.uval) = kJoinInner; } -#line 3368 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3378 "bison_parser.cpp" /* yacc.c:1646 */ break; case 166: -#line 843 "bison_parser.y" /* yacc.c:1646 */ +#line 846 "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 3379 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3389 "bison_parser.cpp" /* yacc.c:1646 */ break; case 171: -#line 868 "bison_parser.y" /* yacc.c:1646 */ +#line 871 "bison_parser.y" /* yacc.c:1646 */ { (yyval.str_vec) = new std::vector(); (yyval.str_vec)->push_back((yyvsp[0].sval)); } -#line 3385 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3395 "bison_parser.cpp" /* yacc.c:1646 */ break; case 172: -#line 869 "bison_parser.y" /* yacc.c:1646 */ +#line 872 "bison_parser.y" /* yacc.c:1646 */ { (yyvsp[-2].str_vec)->push_back((yyvsp[0].sval)); (yyval.str_vec) = (yyvsp[-2].str_vec); } -#line 3391 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3401 "bison_parser.cpp" /* yacc.c:1646 */ break; -#line 3395 "bison_parser.cpp" /* yacc.c:1646 */ +#line 3405 "bison_parser.cpp" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -3626,7 +3636,7 @@ yyreturn: #endif return yyresult; } -#line 872 "bison_parser.y" /* yacc.c:1906 */ +#line 875 "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 2790efe..fecc6aa 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 41 "bison_parser.y" /* yacc.c:1909 */ +#line 36 "bison_parser.y" /* yacc.c:1909 */ // %code requires block @@ -214,7 +214,7 @@ extern int hsql_debug; union HSQL_STYPE { -#line 100 "bison_parser.y" /* yacc.c:1909 */ +#line 95 "bison_parser.y" /* yacc.c:1909 */ double fval; int64_t ival; @@ -242,7 +242,7 @@ union HSQL_STYPE hsql::GroupByDescription* group_t; hsql::UpdateClause* update_t; - hsql::SQLParserResult* stmt_list; + std::vector* stmt_vec; std::vector* str_vec; std::vector* table_vec; @@ -275,6 +275,6 @@ struct HSQL_LTYPE -int hsql_parse (hsql::SQLParserResult** result, yyscan_t scanner); +int hsql_parse (hsql::SQLParserResult* result, yyscan_t scanner); #endif /* !YY_HSQL_BISON_PARSER_H_INCLUDED */ diff --git a/src/parser/bison_parser.y b/src/parser/bison_parser.y index 7593212..c0252d0 100644 --- a/src/parser/bison_parser.y +++ b/src/parser/bison_parser.y @@ -18,14 +18,9 @@ using namespace hsql; -int yyerror(YYLTYPE* llocp, SQLParserResult** result, yyscan_t scanner, const char *msg) { - delete *result; - - SQLParserResult* list = new SQLParserResult(); - list->setIsValid(false); - list->setErrorDetails(strdup(msg), llocp->first_line, llocp->first_column); - - *result = list; +int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const char *msg) { + result->setIsValid(false); + result->setErrorDetails(strdup(msg), llocp->first_line, llocp->first_column); return 0; } @@ -90,7 +85,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult** result, yyscan_t scanner, const ch %lex-param { yyscan_t scanner } // Define additional parameters for yyparse -%parse-param { hsql::SQLParserResult** result } +%parse-param { hsql::SQLParserResult* result } %parse-param { yyscan_t scanner } @@ -124,7 +119,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult** result, yyscan_t scanner, const ch hsql::GroupByDescription* group_t; hsql::UpdateClause* update_t; - hsql::SQLParserResult* stmt_list; + std::vector* stmt_vec; std::vector* str_vec; std::vector* table_vec; @@ -147,7 +142,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult** result, yyscan_t scanner, const ch } } delete ($$); -} +} %destructor { delete ($$); } <*> @@ -178,7 +173,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult** result, yyscan_t scanner, const ch /********************************* ** Non-Terminal types (http://www.gnu.org/software/bison/manual/html_node/Type-Decl.html) *********************************/ -%type statement_list +%type statement_list %type statement preparable_statement %type execute_statement %type prepare_statement @@ -243,14 +238,18 @@ int yyerror(YYLTYPE* llocp, SQLParserResult** result, yyscan_t scanner, const ch // Defines our general input. input: statement_list opt_semicolon { - *result = $1; + for (SQLStatement* stmt : *$1) { + // Transfers ownership of the statement. + result->addStatement(stmt); + } + delete $1; } ; statement_list: - statement { $$ = new SQLParserResult($1); } - | statement_list ';' statement { $1->addStatement($3); $$ = $1; } + statement { $$ = new std::vector(); $$->push_back($1); } + | statement_list ';' statement { $1->push_back($3); $$ = $1; } ; statement: @@ -288,7 +287,11 @@ prepare_statement: | PREPARE IDENTIFIER '{' statement_list opt_semicolon '}' { $$ = new PrepareStatement(); $$->name = $2; - $$->query = $4; + $$->query = new SQLParserResult(); + for (SQLStatement* stmt : *$4) { + $$->query->addStatement(stmt); + } + delete $4; } ; @@ -651,8 +654,8 @@ scalar_expr: ; unary_expr: - '-' operand { $$ = Expr::makeOpUnary(Expr::UMINUS, $2); } - | NOT operand { $$ = Expr::makeOpUnary(Expr::NOT, $2); } + '-' operand { $$ = Expr::makeOpUnary(kOpMinus, $2); } + | NOT operand { $$ = Expr::makeOpUnary(kOpNot, $2); } ; binary_expr: @@ -663,20 +666,20 @@ binary_expr: | operand '*' operand { $$ = Expr::makeOpBinary($1, '*', $3); } | operand '%' operand { $$ = Expr::makeOpBinary($1, '%', $3); } | operand '^' operand { $$ = Expr::makeOpBinary($1, '^', $3); } - | operand LIKE operand { $$ = Expr::makeOpBinary($1, Expr::LIKE, $3); } - | operand NOT LIKE operand { $$ = Expr::makeOpBinary($1, Expr::NOT_LIKE, $4); } + | operand LIKE operand { $$ = Expr::makeOpBinary($1, kOpLike, $3); } + | operand NOT LIKE operand { $$ = Expr::makeOpBinary($1, kOpNotLike, $4); } ; logic_expr: - expr AND expr { $$ = Expr::makeOpBinary($1, Expr::AND, $3); } - | expr OR expr { $$ = Expr::makeOpBinary($1, Expr::OR, $3); } + expr AND expr { $$ = Expr::makeOpBinary($1, kOpAnd, $3); } + | expr OR expr { $$ = Expr::makeOpBinary($1, kOpOr, $3); } ; in_expr: operand IN '(' expr_list ')' { $$ = Expr::makeInOperator($1, $4); } - | operand NOT IN '(' expr_list ')' { $$ = Expr::makeOpUnary(Expr::NOT, Expr::makeInOperator($1, $5)); } + | operand NOT IN '(' expr_list ')' { $$ = Expr::makeOpUnary(kOpNot, Expr::makeInOperator($1, $5)); } | operand IN '(' select_no_paren ')' { $$ = Expr::makeInOperator($1, $4); } - | operand NOT IN '(' select_no_paren ')' { $$ = Expr::makeOpUnary(Expr::NOT, Expr::makeInOperator($1, $5)); } + | operand NOT IN '(' select_no_paren ')' { $$ = Expr::makeOpUnary(kOpNot, Expr::makeInOperator($1, $5)); } ; // TODO: allow no else specified @@ -686,16 +689,16 @@ case_expr: exists_expr: EXISTS '(' select_no_paren ')' { $$ = Expr::makeExists($3); } - | NOT EXISTS '(' select_no_paren ')' { $$ = Expr::makeOpUnary(Expr::NOT, Expr::makeExists($4)); } + | NOT EXISTS '(' select_no_paren ')' { $$ = Expr::makeOpUnary(kOpNot, Expr::makeExists($4)); } ; comp_expr: operand '=' operand { $$ = Expr::makeOpBinary($1, '=', $3); } - | operand NOTEQUALS operand { $$ = Expr::makeOpBinary($1, Expr::NOT_EQUALS, $3); } + | operand NOTEQUALS operand { $$ = Expr::makeOpBinary($1, kOpNotEquals, $3); } | operand '<' operand { $$ = Expr::makeOpBinary($1, '<', $3); } | operand '>' operand { $$ = Expr::makeOpBinary($1, '>', $3); } - | operand LESSEQ operand { $$ = Expr::makeOpBinary($1, Expr::LESS_EQ, $3); } - | operand GREATEREQ operand { $$ = Expr::makeOpBinary($1, Expr::GREATER_EQ, $3); } + | operand LESSEQ operand { $$ = Expr::makeOpBinary($1, kOpLessEq, $3); } + | operand GREATEREQ operand { $$ = Expr::makeOpBinary($1, kOpGreaterEq, $3); } ; function_expr: diff --git a/src/sql/CreateStatement.h b/src/sql/CreateStatement.h index 5b96d33..92e4d39 100644 --- a/src/sql/CreateStatement.h +++ b/src/sql/CreateStatement.h @@ -1,5 +1,5 @@ -#ifndef __CREATE_STATEMENT_H__ -#define __CREATE_STATEMENT_H__ +#ifndef __SQLPARSER__CREATE_STATEMENT_H__ +#define __SQLPARSER__CREATE_STATEMENT_H__ #include "SQLStatement.h" diff --git a/src/sql/DeleteStatement.h b/src/sql/DeleteStatement.h index ed4d77d..af34352 100644 --- a/src/sql/DeleteStatement.h +++ b/src/sql/DeleteStatement.h @@ -1,5 +1,5 @@ -#ifndef __DELETE_STATEMENT_H__ -#define __DELETE_STATEMENT_H__ +#ifndef __SQLPARSER__DELETE_STATEMENT_H__ +#define __SQLPARSER__DELETE_STATEMENT_H__ #include "SQLStatement.h" diff --git a/src/sql/DropStatement.h b/src/sql/DropStatement.h index 08c1b53..18b1363 100644 --- a/src/sql/DropStatement.h +++ b/src/sql/DropStatement.h @@ -1,5 +1,5 @@ -#ifndef __DROP_STATEMENT_H__ -#define __DROP_STATEMENT_H__ +#ifndef __SQLPARSER__DROP_STATEMENT_H__ +#define __SQLPARSER__DROP_STATEMENT_H__ #include "SQLStatement.h" diff --git a/src/sql/ExecuteStatement.h b/src/sql/ExecuteStatement.h index 2f5db10..0bd9c42 100644 --- a/src/sql/ExecuteStatement.h +++ b/src/sql/ExecuteStatement.h @@ -1,5 +1,5 @@ -#ifndef __EXECUTE_STATEMENT_H__ -#define __EXECUTE_STATEMENT_H__ +#ifndef __SQLPARSER__EXECUTE_STATEMENT_H__ +#define __SQLPARSER__EXECUTE_STATEMENT_H__ #include "SQLStatement.h" diff --git a/src/sql/Expr.cpp b/src/sql/Expr.cpp index f1ebe9b..1345714 100644 --- a/src/sql/Expr.cpp +++ b/src/sql/Expr.cpp @@ -51,7 +51,7 @@ namespace hsql { Expr* Expr::makeOpBinary(Expr* expr1, char op, Expr* expr2) { Expr* e = new Expr(kExprOperator); - e->opType = SIMPLE_OP; + e->opType = kOpSimple; e->opChar = op; e->expr = expr1; e->expr2 = expr2; @@ -61,7 +61,7 @@ namespace hsql { Expr* Expr::makeBetween(Expr* expr, Expr* left, Expr* right) { Expr* e = new Expr(kExprOperator); e->expr = expr; - e->opType = BETWEEN; + e->opType = kOpBetween; e->exprList = new std::vector(); e->exprList->push_back(left); e->exprList->push_back(right); @@ -71,7 +71,7 @@ namespace hsql { Expr* Expr::makeCase(Expr* expr, Expr* then, Expr* other) { Expr* e = new Expr(kExprOperator); e->expr = expr; - e->opType = CASE; + e->opType = kOpCase; e->exprList = new std::vector(); e->exprList->push_back(then); e->exprList->push_back(other); @@ -132,14 +132,14 @@ namespace hsql { Expr* Expr::makeExists(SelectStatement* select) { Expr* e = new Expr(kExprOperator); - e->opType = EXISTS; + e->opType = kOpExists; e->select = select; return e; } Expr* Expr::makeInOperator(Expr* expr, std::vector* exprList) { Expr* e = new Expr(kExprOperator); - e->opType = IN; + e->opType = kOpIn; e->expr = expr; e->exprList = exprList; @@ -148,39 +148,39 @@ namespace hsql { Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select) { Expr* e = new Expr(kExprOperator); - e->opType = IN; + e->opType = kOpIn; e->expr = expr; e->select = select; return e; } - bool Expr::isType(ExprType e_type) { - return e_type == type; + bool Expr::isType(ExprType exprType) const { + return exprType == type; } - bool Expr::isLiteral() { + bool Expr::isLiteral() const { return isType(kExprLiteralInt) || isType(kExprLiteralFloat) || isType(kExprLiteralString) || isType(kExprPlaceholder); } - bool Expr::hasAlias() { + bool Expr::hasAlias() const { return alias != NULL; } - bool Expr::hasTable() { + bool Expr::hasTable() const { return table != NULL; } - char* Expr::getName() { + const char* Expr::getName() const { if (alias != NULL) return alias; else return name; } - bool Expr::isSimpleOp() { - return opType == SIMPLE_OP; + bool Expr::isSimpleOp() const { + return opType == kOpSimple; } - bool Expr::isSimpleOp(char op) { + bool Expr::isSimpleOp(char op) const { return isSimpleOp() && opChar == op; } diff --git a/src/sql/Expr.h b/src/sql/Expr.h index 3284802..bba37bd 100644 --- a/src/sql/Expr.h +++ b/src/sql/Expr.h @@ -1,5 +1,5 @@ -#ifndef __EXPRESSION_H__ -#define __EXPRESSION_H__ +#ifndef __SQLPARSER__EXPR_H__ +#define __SQLPARSER__EXPR_H__ #include #include @@ -24,48 +24,45 @@ namespace hsql { kExprSelect }; + // Operator types. These are important for expressions of type kExprOperator. + // Trivial types are those that can be described by a single character e.g: + // + - * / < > = % + // Non-trivial are: <> <= >= LIKE ISNULL NOT + enum OperatorType { + kOpNone, + + // Ternary operators + kOpBetween, + kOpCase, + + // Binary operators. + // Simple operators are identified by the opChar field (e.g. +, -, =, >, <). + kOpSimple, + + kOpNotEquals, + kOpLessEq, + kOpGreaterEq, + kOpLike, + kOpNotLike, + kOpAnd, + kOpOr, + kOpIn, + + // Unary operators. + kOpNot, + kOpMinus, + kOpIsNull, + kOpExists + }; + typedef struct Expr Expr; // Represents SQL expressions (i.e. literals, operators, column_refs). // TODO: When destructing a placeholder expression, we might need to alter the placeholder_list. struct Expr { - // Operator types. These are important for expressions of type kExprOperator. - // Trivial types are those that can be described by a single character e.g: - // + - * / < > = % - // Non-trivial are: <> <= >= LIKE ISNULL NOT - enum OperatorType { - NONE, - - // Ternary operators - BETWEEN, - CASE, - - // Binary operators. - SIMPLE_OP, - NOT_EQUALS, - LESS_EQ, - GREATER_EQ, - LIKE, - NOT_LIKE, - AND, - OR, - IN, - - // Unary operators. - NOT, - UMINUS, - ISNULL, - EXISTS - }; - - Expr(ExprType type); - - // Interesting side-effect: - // Making the destructor virtual used to cause segmentation faults. - // TODO: inspect. - ~Expr(); + virtual ~Expr(); ExprType type; @@ -88,19 +85,19 @@ namespace hsql { // Convenience accessor methods. - bool isType(ExprType e_type); + bool isType(ExprType exprType) const; - bool isLiteral(); + bool isLiteral() const; - bool hasAlias(); + bool hasAlias() const; - bool hasTable(); + bool hasTable() const; - char* getName(); + const char* getName() const; - bool isSimpleOp(); + bool isSimpleOp() const; - bool isSimpleOp(char op); + bool isSimpleOp(char op) const; // Static constructors. diff --git a/src/sql/ImportStatement.h b/src/sql/ImportStatement.h index 4fb3e3e..1290713 100644 --- a/src/sql/ImportStatement.h +++ b/src/sql/ImportStatement.h @@ -1,5 +1,5 @@ -#ifndef __IMPORT_STATEMENT_H__ -#define __IMPORT_STATEMENT_H__ +#ifndef __SQLPARSER__IMPORT_STATEMENT_H__ +#define __SQLPARSER__IMPORT_STATEMENT_H__ #include "SQLStatement.h" diff --git a/src/sql/InsertStatement.h b/src/sql/InsertStatement.h index 06184fa..3aa8fd2 100644 --- a/src/sql/InsertStatement.h +++ b/src/sql/InsertStatement.h @@ -1,5 +1,5 @@ -#ifndef __INSERT_STATEMENT_H__ -#define __INSERT_STATEMENT_H__ +#ifndef __SQLPARSER__INSERT_STATEMENT_H__ +#define __SQLPARSER__INSERT_STATEMENT_H__ #include "SQLStatement.h" #include "SelectStatement.h" diff --git a/src/sql/PrepareStatement.h b/src/sql/PrepareStatement.h index 9455952..62891eb 100644 --- a/src/sql/PrepareStatement.h +++ b/src/sql/PrepareStatement.h @@ -1,5 +1,5 @@ -#ifndef __PREPARE_STATEMENT_H__ -#define __PREPARE_STATEMENT_H__ +#ifndef __SQLPARSER__PREPARE_STATEMENT_H__ +#define __SQLPARSER__PREPARE_STATEMENT_H__ #include "../SQLParserResult.h" #include "SQLStatement.h" @@ -24,6 +24,8 @@ namespace hsql { 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. diff --git a/src/sql/SQLStatement.h b/src/sql/SQLStatement.h index 4c87cb8..9d491d4 100644 --- a/src/sql/SQLStatement.h +++ b/src/sql/SQLStatement.h @@ -1,5 +1,5 @@ -#ifndef __SQLSTATEMENT_H__ -#define __SQLSTATEMENT_H__ +#ifndef __SQLPARSER__SQLSTATEMENT_H__ +#define __SQLPARSER__SQLSTATEMENT_H__ #include "Expr.h" #include @@ -29,11 +29,13 @@ namespace hsql { virtual ~SQLStatement(); - virtual StatementType type() const; + StatementType type() const; + + bool isType(StatementType type) const; private: StatementType type_; }; } // namespace hsql -#endif // __SQLSTATEMENT_H__ +#endif // __SQLPARSER__SQLSTATEMENT_H__ diff --git a/src/sql/SelectStatement.h b/src/sql/SelectStatement.h index bb60836..095310e 100644 --- a/src/sql/SelectStatement.h +++ b/src/sql/SelectStatement.h @@ -1,5 +1,5 @@ -#ifndef __SELECT_STATEMENT_H__ -#define __SELECT_STATEMENT_H__ +#ifndef __SQLPARSER__SELECT_STATEMENT_H__ +#define __SQLPARSER__SELECT_STATEMENT_H__ #include "SQLStatement.h" #include "Expr.h" @@ -13,7 +13,6 @@ namespace hsql { /** * Description of the order by clause within a select statement - * TODO: hold multiple expressions to be sorted by */ struct OrderDescription { OrderDescription(OrderType type, Expr* expr); @@ -41,8 +40,7 @@ namespace hsql { */ struct GroupByDescription { GroupByDescription(); - // TODO: make virtual - ~GroupByDescription(); + virtual ~GroupByDescription(); std::vector* columns; Expr* having; diff --git a/src/sql/Table.h b/src/sql/Table.h index 58ecca4..96ee775 100644 --- a/src/sql/Table.h +++ b/src/sql/Table.h @@ -1,5 +1,5 @@ -#ifndef __TABLEREF_H__ -#define __TABLEREF_H__ +#ifndef __SQLPARSER__TABLEREF_H__ +#define __SQLPARSER__TABLEREF_H__ #include "Expr.h" #include @@ -35,10 +35,10 @@ namespace hsql { JoinDefinition* join; // Returns true if a schema is set. - bool hasSchema(); + bool hasSchema() const; // Returns the alias, if it is set. Otherwise the name. - char* getName(); + const char* getName() const; }; // Possible types of joins. diff --git a/src/sql/UpdateStatement.h b/src/sql/UpdateStatement.h index b4d6e28..744d55b 100644 --- a/src/sql/UpdateStatement.h +++ b/src/sql/UpdateStatement.h @@ -1,5 +1,5 @@ -#ifndef __UPDATE_STATEMENT_H__ -#define __UPDATE_STATEMENT_H__ +#ifndef __SQLPARSER__UPDATE_STATEMENT_H__ +#define __SQLPARSER__UPDATE_STATEMENT_H__ #include "SQLStatement.h" diff --git a/src/sql/statements.cpp b/src/sql/statements.cpp index 69ffc84..bcdece3 100644 --- a/src/sql/statements.cpp +++ b/src/sql/statements.cpp @@ -13,6 +13,10 @@ namespace hsql { return type_; } + bool SQLStatement::isType(StatementType type) const { + return (type_ == type); + } + // ColumnDefinition ColumnDefinition::ColumnDefinition(char* name, DataType type) : name(name), @@ -268,11 +272,11 @@ namespace hsql { } } - bool TableRef::hasSchema() { + bool TableRef::hasSchema() const { return schema != NULL; } - char* TableRef::getName() { + const char* TableRef::getName() const { if (alias != NULL) return alias; else return name; } diff --git a/src/sql/statements.h b/src/sql/statements.h index 13c4a30..d9e59ea 100644 --- a/src/sql/statements.h +++ b/src/sql/statements.h @@ -1,5 +1,5 @@ -#ifndef __STATEMENTS_H__ -#define __STATEMENTS_H__ +#ifndef __SQLPARSER__STATEMENTS_H__ +#define __SQLPARSER__STATEMENTS_H__ #include "SelectStatement.h" #include "ImportStatement.h" @@ -11,4 +11,4 @@ #include "PrepareStatement.h" #include "ExecuteStatement.h" -#endif // __STATEMENTS_H__ \ No newline at end of file +#endif // __SQLPARSER__STATEMENTS_H__ \ No newline at end of file diff --git a/src/sqlhelper.cpp b/src/util/sqlhelper.cpp similarity index 98% rename from src/sqlhelper.cpp rename to src/util/sqlhelper.cpp index 529cead..36aefc8 100644 --- a/src/sqlhelper.cpp +++ b/src/util/sqlhelper.cpp @@ -63,16 +63,16 @@ namespace hsql { } switch (expr->opType) { - case Expr::SIMPLE_OP: + case kOpSimple: inprintC(expr->opChar, numIndent); break; - case Expr::AND: + case kOpAnd: inprint("AND", numIndent); break; - case Expr::OR: + case kOpOr: inprint("OR", numIndent); break; - case Expr::NOT: + case kOpNot: inprint("NOT", numIndent); break; default: diff --git a/src/sqlhelper.h b/src/util/sqlhelper.h similarity index 90% rename from src/sqlhelper.h rename to src/util/sqlhelper.h index ea6edd1..7c7e811 100644 --- a/src/sqlhelper.h +++ b/src/util/sqlhelper.h @@ -1,7 +1,7 @@ -#ifndef __SQLHELPER_H__ -#define __SQLHELPER_H__ +#ifndef __SQLPARSER__SQLHELPER_H__ +#define __SQLPARSER__SQLHELPER_H__ -#include "sql/statements.h" +#include "../sql/statements.h" namespace hsql { diff --git a/test/prepare_tests.cpp b/test/prepare_tests.cpp new file mode 100644 index 0000000..bd8c51d --- /dev/null +++ b/test/prepare_tests.cpp @@ -0,0 +1,82 @@ + +#include "thirdparty/microtest/microtest.h" +#include "sql_asserts.h" +#include "SQLParser.h" + +using hsql::kExprPlaceholder; + +using hsql::kStmtDrop; +using hsql::kStmtExecute; +using hsql::kStmtInsert; +using hsql::kStmtPrepare; +using hsql::kStmtSelect; + +using hsql::DropStatement; +using hsql::ExecuteStatement; +using hsql::InsertStatement; +using hsql::PrepareStatement; +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); + + const SelectStatement* select = (const SelectStatement*) prepare->query->getStatement(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_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, DropStatement::kPreparedStatement); + ASSERT_STREQ(drop->name, "stmt"); +} + + +TEST(ExecuteStatementTest) { + 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/select_tests.cpp b/test/select_tests.cpp index 7a0ddd3..0256cf2 100644 --- a/test/select_tests.cpp +++ b/test/select_tests.cpp @@ -16,8 +16,6 @@ TEST(SelectTest) { ASSERT_NULL(stmt->whereClause); ASSERT_NULL(stmt->groupBy); - - delete result; } TEST(SelectExprTest) { @@ -55,8 +53,6 @@ TEST(SelectExprTest) { ASSERT_EQ(stmt->selectList->at(2)->exprList->at(1)->exprList->size(), 1); ASSERT(stmt->selectList->at(2)->exprList->at(1)->exprList->at(0)->isType(kExprColumnRef)); ASSERT_STREQ(stmt->selectList->at(2)->exprList->at(1)->exprList->at(0)->getName(), "un"); - - delete result; } @@ -76,8 +72,6 @@ TEST(SelectHavingTest) { ASSERT(group->having->isSimpleOp('<')); ASSERT(group->having->expr->isType(kExprFunctionRef)); ASSERT(group->having->expr2->isType(kExprLiteralFloat)); - - delete result; } @@ -91,8 +85,6 @@ TEST(SelectDistinctTest) { ASSERT(stmt->selectDistinct); ASSERT_NULL(stmt->whereClause); - - delete result; } TEST(SelectGroupDistinctTest) { @@ -107,8 +99,6 @@ TEST(SelectGroupDistinctTest) { ASSERT_EQ(stmt->selectList->size(), 3); ASSERT(!stmt->selectList->at(1)->distinct); ASSERT(stmt->selectList->at(2)->distinct); - - delete result; } TEST(OrderByTest) { @@ -128,8 +118,6 @@ TEST(OrderByTest) { ASSERT_EQ(stmt->order->at(1)->type, kOrderDesc); ASSERT_STREQ(stmt->order->at(1)->expr->name, "city"); - - delete result; } TEST(SelectBetweenTest) { @@ -144,7 +132,7 @@ TEST(SelectBetweenTest) { Expr* where = stmt->whereClause; ASSERT_NOTNULL(where); ASSERT(where->isType(kExprOperator)); - ASSERT_EQ(where->opType, Expr::BETWEEN); + ASSERT_EQ(where->opType, kOpBetween); ASSERT_STREQ(where->expr->getName(), "grade"); ASSERT(where->expr->isType(kExprColumnRef)); @@ -154,8 +142,6 @@ TEST(SelectBetweenTest) { ASSERT_EQ(where->exprList->at(0)->ival, 1); ASSERT(where->exprList->at(1)->isType(kExprColumnRef)); ASSERT_STREQ(where->exprList->at(1)->getName(), "c"); - - delete result; } TEST(SelectConditionalSelectTest) { @@ -169,7 +155,7 @@ TEST(SelectConditionalSelectTest) { Expr* where = stmt->whereClause; ASSERT_NOTNULL(where); ASSERT(where->isType(kExprOperator)); - ASSERT_EQ(where->opType, Expr::AND); + ASSERT_EQ(where->opType, kOpAnd); // a = (SELECT ...) Expr* cond1 = where->expr; @@ -189,13 +175,11 @@ TEST(SelectConditionalSelectTest) { // EXISTS (SELECT ...) Expr* cond2 = where->expr2; - ASSERT_EQ(cond2->opType, Expr::EXISTS); + ASSERT_EQ(cond2->opType, kOpExists); ASSERT_NOTNULL(cond2->select); SelectStatement* ex_select = cond2->select; ASSERT_STREQ(ex_select->fromTable->getName(), "test"); - - delete result; } TEST(SelectCaseWhen) { @@ -216,10 +200,8 @@ TEST(SelectCaseWhen) { Expr* caseExpr = func->exprList->at(0); ASSERT_NOTNULL(caseExpr); ASSERT(caseExpr->isType(kExprOperator)); - ASSERT_EQ(caseExpr->opType, Expr::CASE); + ASSERT_EQ(caseExpr->opType, kOpCase); ASSERT(caseExpr->expr->isType(kExprOperator)); ASSERT(caseExpr->expr->isSimpleOp('=')); ASSERT_EQ(caseExpr->exprList->size(), 2); - - delete result; } diff --git a/test/sql_asserts.h b/test/sql_asserts.h index bf3a703..13496cd 100644 --- a/test/sql_asserts.h +++ b/test/sql_asserts.h @@ -3,20 +3,21 @@ #define TEST_PARSE_SQL_QUERY(query, result, numStatements) \ - const SQLParserResult* result = SQLParser::parseSQLString(query); \ - ASSERT(result->isValid()); \ - ASSERT_EQ(result->size(), numStatements); + hsql::SQLParserResult result; \ + hsql::SQLParser::parseSQLString(query, &result); \ + ASSERT(result.isValid()); \ + ASSERT_EQ(result.size(), numStatements); #define TEST_PARSE_SINGLE_SQL(query, stmtType, stmtClass, result, outputVar) \ TEST_PARSE_SQL_QUERY(query, result, 1); \ - ASSERT_EQ(result->getStatement(0)->type(), stmtType); \ - const stmtClass* outputVar = (const stmtClass*) result->getStatement(0); + ASSERT_EQ(result.getStatement(0)->type(), stmtType); \ + const stmtClass* outputVar = (const stmtClass*) result.getStatement(0); #define TEST_CAST_STMT(result, stmt_index, stmtType, stmtClass, outputVar) \ - ASSERT_EQ(result->getStatement(stmt_index)->type(), stmtType); \ - const stmtClass* outputVar = (const stmtClass*) result->getStatement(stmt_index); + ASSERT_EQ(result.getStatement(stmt_index)->type(), stmtType); \ + const stmtClass* outputVar = (const stmtClass*) result.getStatement(stmt_index); #endif diff --git a/test/sql_grammar_test.cpp b/test/sql_grammar_test.cpp index 3bfecc8..0daf0c0 100644 --- a/test/sql_grammar_test.cpp +++ b/test/sql_grammar_test.cpp @@ -79,23 +79,22 @@ TEST(AutoGrammarTest) { start = std::chrono::system_clock::now(); // Parsing - SQLParserResult* result = SQLParser::parseSQLString(sql.c_str()); + SQLParserResult result; + SQLParser::parseSQLString(sql.c_str(), &result); end = std::chrono::system_clock::now(); std::chrono::duration elapsed_seconds = end - start; double us = elapsed_seconds.count() * 1000 * 1000; - if (expectFalse == result->isValid()) { + if (expectFalse == result.isValid()) { printf("\033[0;31m{ failed}\033[0m\n"); - printf("\t\033[0;31m%s (L%d:%d)\n\033[0m", result->errorMsg(), result->errorLine(), result->errorColumn()); + printf("\t\033[0;31m%s (L%d:%d)\n\033[0m", result.errorMsg(), result.errorLine(), result.errorColumn()); printf("\t%s\n", sql.c_str()); numFailed++; } else { // TODO: indicate whether expectFalse was set printf("\033[0;32m{ ok} (%.1fus)\033[0m %s\n", us, sql.c_str()); } - - delete result; } if (numFailed == 0) { diff --git a/test/sql_tests.cpp b/test/sql_tests.cpp index 89ccf60..fce09d9 100644 --- a/test/sql_tests.cpp +++ b/test/sql_tests.cpp @@ -3,36 +3,40 @@ */ #include "thirdparty/microtest/microtest.h" -#include "sql_asserts.h" + #include "SQLParser.h" -#include "sqlhelper.h" +#include "util/sqlhelper.h" + +#include "sql_asserts.h" using namespace hsql; TEST(DeleteStatementTest) { - const SQLParserResult* result = SQLParser::parseSQLString("DELETE FROM students WHERE grade > 2.0;"); - ASSERT(result->isValid()); - ASSERT_EQ(result->size(), 1); - ASSERT(result->getStatement(0)->type() == kStmtDelete); + SQLParserResult result; + SQLParser::parseSQLString("DELETE FROM students WHERE grade > 2.0;", &result); - const DeleteStatement* stmt = (const DeleteStatement*) result->getStatement(0); + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + ASSERT(result.getStatement(0)->type() == kStmtDelete); + + const DeleteStatement* stmt = (const DeleteStatement*) result.getStatement(0); ASSERT_STREQ(stmt->tableName, "students"); ASSERT_NOTNULL(stmt->expr); ASSERT(stmt->expr->isType(kExprOperator)); ASSERT_STREQ(stmt->expr->expr->name, "grade"); ASSERT_EQ(stmt->expr->expr2->fval, 2.0); - - delete result; } TEST(CreateStatementTest) { - const SQLParserResult* result = SQLParser::parseSQLString("CREATE TABLE students (name TEXT, student_number INT, city INTEGER, grade DOUBLE)"); - ASSERT(result->isValid()); - ASSERT_EQ(result->size(), 1); - ASSERT_EQ(result->getStatement(0)->type(), kStmtCreate); + SQLParserResult result; + SQLParser::parseSQLString("CREATE TABLE students (name TEXT, student_number INT, city INTEGER, grade DOUBLE)", &result); - const CreateStatement* stmt = (const CreateStatement*) result->getStatement(0); + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + ASSERT_EQ(result.getStatement(0)->type(), kStmtCreate); + + const CreateStatement* stmt = (const CreateStatement*) result.getStatement(0); ASSERT_EQ(stmt->type, CreateStatement::kTable); ASSERT_STREQ(stmt->tableName, "students"); ASSERT_NOTNULL(stmt->columns); @@ -45,18 +49,18 @@ TEST(CreateStatementTest) { ASSERT_EQ(stmt->columns->at(1)->type, ColumnDefinition::INT); ASSERT_EQ(stmt->columns->at(2)->type, ColumnDefinition::INT); ASSERT_EQ(stmt->columns->at(3)->type, ColumnDefinition::DOUBLE); - - delete result; } TEST(UpdateStatementTest) { - const SQLParserResult* result = SQLParser::parseSQLString("UPDATE students SET grade = 5.0, name = 'test' WHERE name = 'Max Mustermann';"); - ASSERT(result->isValid()); - ASSERT_EQ(result->size(), 1); - ASSERT_EQ(result->getStatement(0)->type(), kStmtUpdate); + SQLParserResult result; + SQLParser::parseSQLString("UPDATE students SET grade = 5.0, name = 'test' WHERE name = 'Max Mustermann';", &result); - const UpdateStatement* stmt = (const UpdateStatement*) result->getStatement(0); + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + ASSERT_EQ(result.getStatement(0)->type(), kStmtUpdate); + + const UpdateStatement* stmt = (const UpdateStatement*) result.getStatement(0); ASSERT_NOTNULL(stmt->table); ASSERT_STREQ(stmt->table->name, "students"); @@ -74,9 +78,6 @@ TEST(UpdateStatementTest) { ASSERT(stmt->where->isSimpleOp('=')); ASSERT_STREQ(stmt->where->expr->name, "name"); ASSERT_STREQ(stmt->where->expr2->name, "Max Mustermann"); - \ - - delete result; } @@ -90,8 +91,6 @@ TEST(InsertStatementTest) { ASSERT_EQ(stmt->values->size(), 4); // TODO - - delete result; } @@ -106,66 +105,26 @@ TEST(DropTableStatementTest) { ASSERT_EQ(stmt->type, DropStatement::kTable); ASSERT_NOTNULL(stmt->name); ASSERT_STREQ(stmt->name, "students"); - - delete result; } +TEST(ReleaseStatementTest) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM students;", + kStmtSelect, + SelectStatement, + result, + stmt); -TEST(PrepareStatementTest) { - 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;"; + ASSERT_EQ(1, result.size()); + ASSERT_NULL(stmt->whereClause); - TEST_PARSE_SQL_QUERY(query, result, 3); + std::vector statements = result.releaseStatements(); - TEST_CAST_STMT(result, 0, kStmtPrepare, PrepareStatement, prep1); - TEST_CAST_STMT(result, 1, kStmtPrepare, PrepareStatement, prep2); - TEST_CAST_STMT(result, 2, kStmtDrop, DropStatement, drop); + ASSERT_EQ(0, result.size()); - // 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, DropStatement::kPreparedStatement); - ASSERT_STREQ(drop->name, "stmt"); - - delete result; + for (SQLStatement* stmt : statements) { + delete stmt; + } } - -TEST(ExecuteStatementTest) { - TEST_PARSE_SINGLE_SQL("EXECUTE test(1, 2);", kStmtExecute, ExecuteStatement, result, stmt); - - ASSERT_STREQ(stmt->name, "test"); - ASSERT_EQ(stmt->parameters->size(), 2); - - delete result; -} - -TEST_MAIN(); \ No newline at end of file +TEST_MAIN(); diff --git a/test/tpc_h_tests.cpp b/test/tpc_h_tests.cpp index 9da1b13..310972d 100644 --- a/test/tpc_h_tests.cpp +++ b/test/tpc_h_tests.cpp @@ -1,7 +1,9 @@ #include "thirdparty/microtest/microtest.h" -#include "sql_asserts.h" + #include "SQLParser.h" -#include "sqlhelper.h" +#include "util/sqlhelper.h" + +#include "sql_asserts.h" #include #include @@ -37,15 +39,15 @@ TEST(TPCHQueryGrammarTests) { for (const std::string& file_path : files) { std::string query = readFileContents(file_path); - SQLParserResult* result = SQLParser::parseSQLString(query.c_str()); - if (!result->isValid()) { + SQLParserResult result; + SQLParser::parseSQLString(query.c_str(), &result); + if (!result.isValid()) { mt::printFailed(file_path.c_str()); - printf("%s %s (L%d:%d)%s\n", mt::red(), result->errorMsg(), result->errorLine(), result->errorColumn(), mt::def()); + printf("%s %s (L%d:%d)%s\n", mt::red(), result.errorMsg(), result.errorLine(), result.errorColumn(), mt::def()); ++testsFailed; } else { mt::printOk(file_path.c_str()); } - delete result; } ASSERT_EQ(testsFailed, 0); } @@ -53,11 +55,12 @@ TEST(TPCHQueryGrammarTests) { TEST(TPCHQueryDetailTest) { std::string query = readFileContents("test/queries/tpc-h-16-22.sql"); - SQLParserResult* result = SQLParser::parseSQLString(query.c_str()); - ASSERT(result->isValid()); - ASSERT_EQ(result->size(), 7); + SQLParserResult result; + SQLParser::parseSQLString(query.c_str(), &result); + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 7); - const SQLStatement* stmt20 = result->getStatement(4); + const SQLStatement* stmt20 = result.getStatement(4); ASSERT_EQ(stmt20->type(), kStmtSelect); const SelectStatement* select20 = (const SelectStatement*) stmt20; @@ -69,18 +72,18 @@ TEST(TPCHQueryDetailTest) { Expr* where = select20->whereClause; ASSERT_NOTNULL(where); ASSERT(where->isType(kExprOperator)); - ASSERT_EQ(where->opType, Expr::AND); + ASSERT_EQ(where->opType, kOpAnd); Expr* andExpr2 = where->expr; ASSERT_NOTNULL(andExpr2); ASSERT(andExpr2->isType(kExprOperator)); - ASSERT_EQ(andExpr2->opType, Expr::AND); + ASSERT_EQ(andExpr2->opType, kOpAnd); // Test IN expression. Expr* inExpr = andExpr2->expr; ASSERT_NOTNULL(inExpr); ASSERT(inExpr->isType(kExprOperator)); - ASSERT_EQ(inExpr->opType, Expr::IN); + ASSERT_EQ(inExpr->opType, kOpIn); ASSERT_STREQ(inExpr->expr->getName(), "S_SUPPKEY"); ASSERT_NOTNULL(inExpr->select); @@ -93,6 +96,4 @@ TEST(TPCHQueryDetailTest) { ASSERT_EQ(select20->order->size(), 1); ASSERT(select20->order->at(0)->expr->isType(kExprColumnRef)); ASSERT_STREQ(select20->order->at(0)->expr->getName(), "S_NAME"); - - delete result; -} \ No newline at end of file +}