diff --git a/src/parser/bison_parser.cpp b/src/parser/bison_parser.cpp index f790a65..68d29d5 100644 --- a/src/parser/bison_parser.cpp +++ b/src/parser/bison_parser.cpp @@ -1967,7 +1967,7 @@ yyreduce: case 22: #line 306 "bison_parser.y" /* yacc.c:1646 */ - { (yyval.sval) = (yyvsp[0].expr)->name; } + { (yyval.sval) = strdup((yyvsp[0].expr)->name); delete (yyvsp[0].expr); } #line 1972 "bison_parser.cpp" /* yacc.c:1646 */ break; diff --git a/src/parser/bison_parser.y b/src/parser/bison_parser.y index d15ce12..bf90685 100644 --- a/src/parser/bison_parser.y +++ b/src/parser/bison_parser.y @@ -303,7 +303,7 @@ import_file_type: ; file_path: - string_literal { $$ = $1->name; } + string_literal { $$ = strdup($1->name); delete $1; } ; diff --git a/src/sql/statements.cpp b/src/sql/statements.cpp index 22f2b14..c57982e 100644 --- a/src/sql/statements.cpp +++ b/src/sql/statements.cpp @@ -192,6 +192,7 @@ namespace hsql { delete fromTable; delete whereClause; delete groupBy; + delete unionSelect; delete order; delete limit; @@ -236,10 +237,19 @@ namespace hsql { join(NULL) {} TableRef::~TableRef() { + free(schema); free(name); free(alias); + delete select; - delete list; + delete join; + + if (list != NULL) { + for (TableRef* table : *list) { + delete table; + } + delete list; + } } bool TableRef::hasSchema() { diff --git a/test/lib/valid_queries.sql b/test/lib/valid_queries.sql index 7ebfa61..2d4468f 100644 --- a/test/lib/valid_queries.sql +++ b/test/lib/valid_queries.sql @@ -6,7 +6,7 @@ SELECT * from "table" JOIN table2 ON a = b WHERE (b OR NOT a) AND a = 12.5 (SELECT a FROM foo WHERE a > 12 OR b > 3 AND c NOT LIKE 's%' LIMIT 10); SELECT * FROM "table" LIMIT 10 OFFSET 10; SELECT * FROM second; SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY col1; -# SELECT * FROM t1 UNION (SELECT * FROM t2 UNION SELECT * FROM t3) ORDER BY col1; +-- SELECT * FROM t1 UNION (SELECT * FROM t2 UNION SELECT * FROM t3) ORDER BY col1; # JOIN SELECT t1.a, t1.b, t2.c FROM "table" AS t1 JOIN (SELECT * FROM foo JOIN bar ON foo.id = bar.id) t2 ON t1.a = t2.b WHERE (t1.b OR NOT t1.a) AND t2.c = 12.5 SELECT * FROM t1 JOIN t2 ON c1 = c2; diff --git a/test/sql_grammar_test.cpp b/test/sql_grammar_test.cpp index 177bfea..f273865 100644 --- a/test/sql_grammar_test.cpp +++ b/test/sql_grammar_test.cpp @@ -18,9 +18,12 @@ std::vector readlines(std::string path) { std::istringstream iss(line); // Skip comments - if (line[0] != '#') { - lines.push_back(line); + if (line[0] == '#' || + (line[0] == '-' && line[1] == '-')) { + continue; } + + lines.push_back(line); } return lines; } @@ -82,6 +85,8 @@ int main(int argc, char *argv[]) { // 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) {