added destructors
This commit is contained in:
parent
c5d3a84395
commit
0b444c1955
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
# Makefile
|
# Makefile
|
||||||
|
|
||||||
LIB_FILES = parser/bison_parser.cpp parser/flex_lexer.cpp parser/SQLParser.cpp lib/Expr.cpp lib/sqlhelper.cpp
|
LIB_FILES = parser/bison_parser.cpp parser/flex_lexer.cpp parser/SQLParser.cpp lib/Expr.cpp lib/sqlhelper.cpp lib/destructors.cpp
|
||||||
|
|
||||||
TESTS_MAIN = sql_tests.cpp
|
TESTS_MAIN = sql_tests.cpp
|
||||||
TESTS_BIN = bin/tests
|
TESTS_BIN = bin/tests
|
||||||
|
|
|
@ -9,15 +9,15 @@ make grammar_test
|
||||||
|
|
||||||
echo "\n\n"
|
echo "\n\n"
|
||||||
|
|
||||||
./bin/grammar_test "SELECT a FROM foo WHERE a > 12 OR b > 3 AND c = 3 LIMIT 10"
|
./bin/grammar_test "SELECT a FROM foo WHERE a > 12 OR b > 3 AND NOT c LIMIT 10"
|
||||||
./bin/grammar_test "SELECT col1, col2, 'test' FROM table, foo AS t WHERE age > 12 AND zipcode = 12345 GROUP BY col1;"
|
# ./bin/grammar_test "SELECT col1, col2, 'test' FROM table, foo AS t WHERE age > 12 AND zipcode = 12345 GROUP BY col1;"
|
||||||
./bin/grammar_test "SELECT age FROM table AS t1, (SELECT * FROM table2) AS t2 ORDER BY age DESC"
|
./bin/grammar_test "SELECT age FROM table AS t1, (SELECT * FROM table2) AS t2 ORDER BY age DESC LIMIT 10; SELECT * AS table;"
|
||||||
./bin/grammar_test "SELECT * from table JOIN table2 ON a = b WHERE (b OR NOT a) AND a = 12.5"
|
# ./bin/grammar_test "SELECT * from table JOIN table2 ON a = b WHERE (b OR NOT a) AND a = 12.5"
|
||||||
./bin/grammar_test "(SELECT a FROM foo WHERE a > 12 OR b > 3 AND c LIKE 's%' LIMIT 10);"
|
# ./bin/grammar_test "(SELECT a FROM foo WHERE a > 12 OR b > 3 AND c LIKE 's%' LIMIT 10);"
|
||||||
./bin/grammar_test "(SELECT a FROM foo WHERE a > 12 OR b > 3 AND c NOT LIKE 's%' LIMIT 10);"
|
# ./bin/grammar_test "(SELECT a FROM foo WHERE a > 12 OR b > 3 AND c NOT LIKE 's%' LIMIT 10);"
|
||||||
./bin/grammar_test "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"
|
# ./bin/grammar_test "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"
|
||||||
|
|
||||||
./bin/grammar_test "IMPORT FROM TBL FILE 'students.tbl' INTO table"
|
# ./bin/grammar_test "IMPORT FROM TBL FILE 'students.tbl' INTO table"
|
||||||
|
|
||||||
# Error: Where clause in between join statement
|
# Error: Where clause in between join statement
|
||||||
# ./bin/grammar_test -f "SELECT * from table WHERE (b OR NOT a) AND a = 12.5 AS t1 JOIN table2 ON a = b"
|
# ./bin/grammar_test -f "SELECT * from table WHERE (b OR NOT a) AND a = 12.5 AS t1 JOIN table2 ON a = b"
|
||||||
|
@ -32,8 +32,8 @@ echo "\n\n"
|
||||||
# ./bin/analysis "-- test
|
# ./bin/analysis "-- test
|
||||||
# SELECT * FROM table WHERE a NOT LIKE '%s' -- inline comment
|
# SELECT * FROM table WHERE a NOT LIKE '%s' -- inline comment
|
||||||
# --my comment"
|
# --my comment"
|
||||||
./bin/analysis "
|
# ./bin/analysis "
|
||||||
IMPORT FROM TBL FILE 'students.tbl' INTO table;
|
# IMPORT FROM TBL FILE 'students.tbl' INTO table;
|
||||||
SELECT * FROM table;"
|
# SELECT * FROM table;"
|
||||||
|
|
||||||
echo "\n\n"
|
echo "\n\n"
|
|
@ -86,8 +86,11 @@ Expr* Expr::makeFunctionRef(char* func_name, Expr* expr) {
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expr::~Expr() {
|
Expr::~Expr() {
|
||||||
|
delete expr;
|
||||||
// }
|
delete expr2;
|
||||||
|
delete name;
|
||||||
|
delete table;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace hsql
|
} // namespace hsql
|
|
@ -2,6 +2,7 @@
|
||||||
#define __EXPRESSION_H__
|
#define __EXPRESSION_H__
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
namespace hsql {
|
namespace hsql {
|
||||||
|
|
||||||
|
@ -45,7 +46,10 @@ struct Expr {
|
||||||
|
|
||||||
|
|
||||||
Expr(ExprType type) : type(type) {};
|
Expr(ExprType type) : type(type) {};
|
||||||
// virtual ~Expr();
|
|
||||||
|
// Interesting side-effect:
|
||||||
|
// Making the destructor virtual causes segmentation faults
|
||||||
|
~Expr();
|
||||||
|
|
||||||
ExprType type;
|
ExprType type;
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ typedef enum {
|
||||||
*/
|
*/
|
||||||
struct ImportStatement : Statement {
|
struct ImportStatement : Statement {
|
||||||
ImportStatement() : Statement(kStmtImport) {};
|
ImportStatement() : Statement(kStmtImport) {};
|
||||||
|
virtual ~ImportStatement(); // defined in destructors.cpp
|
||||||
|
|
||||||
ImportFileType file_type;
|
ImportFileType file_type;
|
||||||
const char* file_path;
|
const char* file_path;
|
||||||
|
|
|
@ -17,6 +17,10 @@ public:
|
||||||
_vector.push_back(first_value);
|
_vector.push_back(first_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual ~List() {
|
||||||
|
for (_T e : _vector) delete e;
|
||||||
|
}
|
||||||
|
|
||||||
inline size_t size() { return _vector.size(); };
|
inline size_t size() { return _vector.size(); };
|
||||||
|
|
||||||
inline _T at(int i) { return _vector[i]; }
|
inline _T at(int i) { return _vector[i]; }
|
||||||
|
|
|
@ -21,6 +21,8 @@ typedef enum {
|
||||||
|
|
||||||
struct OrderDescription {
|
struct OrderDescription {
|
||||||
OrderDescription(OrderType type, Expr* expr) : type(type), expr(expr) {}
|
OrderDescription(OrderType type, Expr* expr) : type(type), expr(expr) {}
|
||||||
|
virtual ~OrderDescription(); // defined in destructors.cpp
|
||||||
|
|
||||||
OrderType type;
|
OrderType type;
|
||||||
Expr* expr;
|
Expr* expr;
|
||||||
};
|
};
|
||||||
|
@ -43,6 +45,7 @@ struct LimitDescription {
|
||||||
*/
|
*/
|
||||||
struct SelectStatement : Statement {
|
struct SelectStatement : Statement {
|
||||||
SelectStatement() : Statement(kStmtSelect) {};
|
SelectStatement() : Statement(kStmtSelect) {};
|
||||||
|
virtual ~SelectStatement(); // defined in destructors.cpp
|
||||||
|
|
||||||
TableRef* from_table;
|
TableRef* from_table;
|
||||||
List<Expr*>* select_list;
|
List<Expr*>* select_list;
|
||||||
|
|
|
@ -27,6 +27,7 @@ typedef enum {
|
||||||
|
|
||||||
struct Statement {
|
struct Statement {
|
||||||
Statement(StatementType type) : type(type) {};
|
Statement(StatementType type) : type(type) {};
|
||||||
|
virtual ~Statement(); // defined in destructors.cpp
|
||||||
|
|
||||||
StatementType type;
|
StatementType type;
|
||||||
};
|
};
|
||||||
|
@ -36,6 +37,7 @@ class StatementList : public List<Statement*> {
|
||||||
public:
|
public:
|
||||||
StatementList() : List<Statement*>(), isValid(true) {};
|
StatementList() : List<Statement*>(), isValid(true) {};
|
||||||
StatementList(Statement* stmt) : List<Statement*>(stmt), isValid(true) {};
|
StatementList(Statement* stmt) : List<Statement*>(stmt), isValid(true) {};
|
||||||
|
virtual ~StatementList(); // defined in destructors.cpp
|
||||||
|
|
||||||
bool isValid;
|
bool isValid;
|
||||||
const char* parser_msg;
|
const char* parser_msg;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __TABLEREF_H__
|
#ifndef __TABLEREF_H__
|
||||||
#define __TABLEREF_H__
|
#define __TABLEREF_H__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
namespace hsql {
|
namespace hsql {
|
||||||
|
|
||||||
class SelectStatement;
|
class SelectStatement;
|
||||||
|
@ -30,6 +30,7 @@ typedef struct TableRef TableRef;
|
||||||
|
|
||||||
struct TableRef {
|
struct TableRef {
|
||||||
TableRef(TableRefType type) : type(type) {}
|
TableRef(TableRefType type) : type(type) {}
|
||||||
|
virtual ~TableRef(); // defined in destructors.cpp
|
||||||
|
|
||||||
TableRefType type;
|
TableRefType type;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
|
||||||
|
#include "sqllib.h"
|
||||||
|
|
||||||
|
namespace hsql {
|
||||||
|
|
||||||
|
Statement::~Statement() {
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
|
||||||
|
StatementList::~StatementList() {
|
||||||
|
delete parser_msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
TableRef::~TableRef() {
|
||||||
|
delete name;
|
||||||
|
delete alias;
|
||||||
|
delete select;
|
||||||
|
delete list;
|
||||||
|
delete left;
|
||||||
|
delete right;
|
||||||
|
delete join_condition;
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectStatement::~SelectStatement() {
|
||||||
|
delete from_table;
|
||||||
|
delete select_list;
|
||||||
|
delete where_clause;
|
||||||
|
delete group_by;
|
||||||
|
delete order;
|
||||||
|
delete limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
OrderDescription::~OrderDescription() {
|
||||||
|
delete expr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImportStatement::~ImportStatement() {
|
||||||
|
delete file_path;
|
||||||
|
delete table_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace hsql
|
|
@ -36,9 +36,10 @@ int main(int argc, char *argv[]) {
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "\tStatement Type %u. No detailed print method available.\n", stmt->type);
|
fprintf(stderr, "\tStatement Type %u. No detailed print method available.\n", stmt->type);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
// delete stmt;
|
||||||
}
|
}
|
||||||
|
delete stmt_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue