move initialization of SQLParserResult to SQLParser from bison_parser
This commit is contained in:
parent
9e558c7d22
commit
074c564cc4
|
@ -13,20 +13,21 @@ namespace hsql {
|
|||
}
|
||||
|
||||
SQLParserResult* SQLParser::parseSQLString(const char* text) {
|
||||
SQLParserResult* result = NULL;
|
||||
SQLParserResult* result = new SQLParserResult();
|
||||
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");
|
||||
delete result;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
state = hsql__scan_string(text, scanner);
|
||||
|
||||
// Parser and return early if it failed.
|
||||
if (hsql_parse(&result, scanner)) {
|
||||
if (hsql_parse(result, scanner)) {
|
||||
// Returns an error stmt object.
|
||||
hsql__delete_buffer(state, scanner);
|
||||
hsql_lex_destroy(scanner);
|
||||
|
|
|
@ -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<hsql::SQLStatement*>* stmt_vec;
|
||||
|
||||
std::vector<char*>* str_vec;
|
||||
std::vector<hsql::TableRef*>* table_vec;
|
||||
|
@ -147,7 +142,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult** result, yyscan_t scanner, const ch
|
|||
}
|
||||
}
|
||||
delete ($$);
|
||||
} <str_vec> <table_vec> <column_vec> <update_vec> <expr_vec> <order_vec>
|
||||
} <str_vec> <table_vec> <column_vec> <update_vec> <expr_vec> <order_vec> <stmt_vec>
|
||||
%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 <stmt_list> statement_list
|
||||
%type <stmt_vec> statement_list
|
||||
%type <statement> statement preparable_statement
|
||||
%type <exec_stmt> execute_statement
|
||||
%type <prep_stmt> 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<SQLStatement*>(); $$->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;
|
||||
}
|
||||
;
|
||||
|
||||
|
|
Loading…
Reference in New Issue