HyriseSQLParser/src/sql/statements.cpp
Julian Menzler 6003ab58d1 Support WITH (#125)
* Add struct WithDescription in SelectStatement.h

* Add test for With statements

* Implement With draft

* tm

* Fix Grammar

* Fix commented code

* naming improvements

* naming improvements

* introduce memory leak1

* removed memory leak

* Create two WITH-tests

* Add bad queries reg. WITH
2019-05-24 16:42:28 +02:00

363 lines
7.3 KiB
C++
Executable File

#include "statements.h"
namespace hsql {
// ColumnDefinition
ColumnDefinition::ColumnDefinition(char* name, ColumnType type, bool nullable) :
name(name),
type(type),
nullable(nullable) {};
ColumnDefinition::~ColumnDefinition() {
free(name);
}
ColumnType::ColumnType(DataType data_type, int64_t length) :
data_type(data_type),
length(length) {};
bool operator==(const ColumnType& lhs, const ColumnType& rhs) {
if (lhs.data_type != rhs.data_type) return false;
if (lhs.data_type == DataType::VARCHAR || lhs.data_type == DataType::CHAR) {
return lhs.length == rhs.length;
}
return true;
}
bool operator!=(const ColumnType& lhs, const ColumnType& rhs) {
return !(lhs == rhs);
}
std::ostream& operator<<(std::ostream& stream, const ColumnType& column_type) {
switch (column_type.data_type) {
case DataType::UNKNOWN:
stream << "UNKNOWN";
break;
case DataType::INT:
stream << "INT";
break;
case DataType::LONG:
stream << "LONG";
break;
case DataType::FLOAT:
stream << "FLOAT";
break;
case DataType::DOUBLE:
stream << "DOUBLE";
break;
case DataType::CHAR:
stream << "CHAR(" << column_type.length << ")";
break;
case DataType::VARCHAR:
stream << "VARCHAR(" << column_type.length << ")";
break;
case DataType::TEXT:
stream << "TEXT";
break;
}
return stream;
}
// CreateStatemnet
CreateStatement::CreateStatement(CreateType type) :
SQLStatement(kStmtCreate),
type(type),
ifNotExists(false),
filePath(nullptr),
schema(nullptr),
tableName(nullptr),
columns(nullptr),
viewColumns(nullptr),
select(nullptr) {};
CreateStatement::~CreateStatement() {
free(filePath);
free(schema);
free(tableName);
delete select;
if (columns != nullptr) {
for (ColumnDefinition* def : *columns) {
delete def;
}
delete columns;
}
if (viewColumns != nullptr) {
for (char* column : *viewColumns) {
free(column);
}
delete viewColumns;
}
}
// DeleteStatement
DeleteStatement::DeleteStatement() :
SQLStatement(kStmtDelete),
schema(nullptr),
tableName(nullptr),
expr(nullptr) {};
DeleteStatement::~DeleteStatement() {
free(schema);
free(tableName);
delete expr;
}
// DropStatament
DropStatement::DropStatement(DropType type) :
SQLStatement(kStmtDrop),
type(type),
schema(nullptr),
name(nullptr) {}
DropStatement::~DropStatement() {
free(schema);
free(name);
}
// ExecuteStatement
ExecuteStatement::ExecuteStatement() :
SQLStatement(kStmtExecute),
name(nullptr),
parameters(nullptr) {}
ExecuteStatement::~ExecuteStatement() {
free(name);
if (parameters != nullptr) {
for (Expr* param : *parameters) {
delete param;
}
delete parameters;
}
}
// ImportStatement
ImportStatement::ImportStatement(ImportType type) :
SQLStatement(kStmtImport),
type(type),
filePath(nullptr),
schema(nullptr),
tableName(nullptr) {};
ImportStatement::~ImportStatement() {
free(filePath);
free(schema);
free(tableName);
}
// InsertStatement
InsertStatement::InsertStatement(InsertType type) :
SQLStatement(kStmtInsert),
type(type),
schema(nullptr),
tableName(nullptr),
columns(nullptr),
values(nullptr),
select(nullptr) {}
InsertStatement::~InsertStatement() {
free(schema);
free(tableName);
delete select;
if (columns != nullptr) {
for (char* column : *columns) {
free(column);
}
delete columns;
}
if (values != nullptr) {
for (Expr* expr : *values) {
delete expr;
}
delete values;
}
}
// ShowStatament
ShowStatement::ShowStatement(ShowType type) :
SQLStatement(kStmtShow),
type(type),
schema(nullptr),
name(nullptr) {}
ShowStatement::~ShowStatement() {
free(schema);
free(name);
}
// SelectStatement.h
// OrderDescription
OrderDescription::OrderDescription(OrderType type, Expr* expr) :
type(type),
expr(expr) {}
OrderDescription::~OrderDescription() {
delete expr;
}
// LimitDescription
LimitDescription::LimitDescription(Expr* limit, Expr* offset) :
limit(limit),
offset(offset) {}
LimitDescription::~LimitDescription() {
delete limit;
delete offset;
}
// GroypByDescription
GroupByDescription::GroupByDescription() :
columns(nullptr),
having(nullptr) {}
GroupByDescription::~GroupByDescription() {
delete having;
if (columns != nullptr) {
for (Expr* expr : *columns) {
delete expr;
}
delete columns;
}
}
WithDescription::~WithDescription() {
free(alias);
delete select;
}
// SelectStatement
SelectStatement::SelectStatement() :
SQLStatement(kStmtSelect),
fromTable(nullptr),
selectDistinct(false),
selectList(nullptr),
whereClause(nullptr),
groupBy(nullptr),
unionSelect(nullptr),
order(nullptr),
withDescriptions(nullptr),
limit(nullptr) {};
SelectStatement::~SelectStatement() {
delete fromTable;
delete whereClause;
delete groupBy;
delete unionSelect;
delete limit;
// Delete each element in the select list.
if (selectList != nullptr) {
for (Expr* expr : *selectList) {
delete expr;
}
delete selectList;
}
if (order != nullptr) {
for (OrderDescription* desc : *order) {
delete desc;
}
delete order;
}
if (withDescriptions != nullptr) {
for (WithDescription* desc : *withDescriptions) {
delete desc;
}
delete withDescriptions;
}
}
// UpdateStatement
UpdateStatement::UpdateStatement() :
SQLStatement(kStmtUpdate),
table(nullptr),
updates(nullptr),
where(nullptr) {}
UpdateStatement::~UpdateStatement() {
delete table;
delete where;
if (updates != nullptr) {
for (UpdateClause* update : *updates) {
free(update->column);
delete update->value;
delete update;
}
delete updates;
}
}
// Alias
Alias::Alias(char* name, std::vector<char*>* columns) :
name(name),
columns(columns) {}
Alias::~Alias() {
free(name);
if (columns) {
for (char* column : *columns) {
free(column);
}
delete columns;
}
}
// TableRef
TableRef::TableRef(TableRefType type) :
type(type),
schema(nullptr),
name(nullptr),
alias(nullptr),
select(nullptr),
list(nullptr),
join(nullptr) {}
TableRef::~TableRef() {
free(schema);
free(name);
delete select;
delete join;
delete alias;
if (list != nullptr) {
for (TableRef* table : *list) {
delete table;
}
delete list;
}
}
bool TableRef::hasSchema() const {
return schema != nullptr;
}
const char* TableRef::getName() const {
if (alias) return alias->name;
else return name;
}
// JoinDefinition
JoinDefinition::JoinDefinition() :
left(nullptr),
right(nullptr),
condition(nullptr),
type(kJoinInner) {}
JoinDefinition::~JoinDefinition() {
delete left;
delete right;
delete condition;
}
} // namespace hsql