From 5997d9b4a1d027593adb4a2355685a0f77bf7e8e Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 26 Nov 2014 14:43:22 +0100 Subject: [PATCH] extended create and added delete/truncate statement --- src/lib/CreateStatement.h | 25 ++++++++++---- src/lib/DeleteStatement.h | 30 +++++++++++++++++ src/lib/InsertStatement.h | 5 +++ src/lib/destructors.cpp | 4 +++ src/lib/sqllib.h | 2 +- src/parser/bison_parser.y | 68 +++++++++++++++++++++++++++++++++------ test/valid_queries.sql | 7 +++- 7 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 src/lib/DeleteStatement.h diff --git a/src/lib/CreateStatement.h b/src/lib/CreateStatement.h index d7059a5..ccc93c3 100644 --- a/src/lib/CreateStatement.h +++ b/src/lib/CreateStatement.h @@ -6,16 +6,31 @@ namespace hsql { -typedef enum { - kTable, - kTableFromTbl, // Hyrise file format -} CreateType; +/** + * @struct ColumnDefinition + */ +struct ColumnDefinition { + enum DataType { + TEXT, + INT, + DOUBLE + }; + char* name; + DataType type; +}; /** * @struct CreateStatement + * CREATE TABLE students (name TEXT, student_number INTEGER, city TEXT, grade DOUBLE) + * CREATE TABLE students FROM TBL FILE 'test/students.tbl' */ struct CreateStatement : Statement { + enum CreateType { + kTable, + kTableFromTbl, // Hyrise file format + }; + CreateStatement() : Statement(kStmtCreate), if_not_exists(false), @@ -33,6 +48,4 @@ struct CreateStatement : Statement { } // namespace hsql - - #endif \ No newline at end of file diff --git a/src/lib/DeleteStatement.h b/src/lib/DeleteStatement.h new file mode 100644 index 0000000..db20552 --- /dev/null +++ b/src/lib/DeleteStatement.h @@ -0,0 +1,30 @@ +#ifndef __DELETE_STATEMENT_H__ +#define __DELETE_STATEMENT_H__ + +#include "Statement.h" + +namespace hsql { + + +/** + * @struct DeleteStatement + * DELETE FROM students WHERE grade > 3.0 + * DELETE FROM students <=> TRUNCATE students + * + * If expr == NULL => delete all rows (truncate) + */ +struct DeleteStatement : Statement { + DeleteStatement() : + Statement(kStmtDelete), + expr(NULL) {}; + + virtual ~DeleteStatement(); // defined in destructors.cpp + + char* table_name; + Expr* expr; +}; + + + +} // namespace hsql +#endif \ No newline at end of file diff --git a/src/lib/InsertStatement.h b/src/lib/InsertStatement.h index 4c0fafb..a2f7329 100644 --- a/src/lib/InsertStatement.h +++ b/src/lib/InsertStatement.h @@ -7,6 +7,11 @@ namespace hsql { +/** + * @struct InsertStatement + * INSERT INTO students VALUES ('Max', 1112233, 'Musterhausen', 2.3) + * INSERT INTO employees SELECT * FROM stundents + */ struct InsertStatement : Statement { typedef enum { kInsertValues, diff --git a/src/lib/destructors.cpp b/src/lib/destructors.cpp index 919b7bf..6d2a51f 100644 --- a/src/lib/destructors.cpp +++ b/src/lib/destructors.cpp @@ -36,6 +36,10 @@ InsertStatement::~InsertStatement() { delete select; } +DeleteStatement::~DeleteStatement() { + delete expr; +} + OrderDescription::~OrderDescription() { diff --git a/src/lib/sqllib.h b/src/lib/sqllib.h index 6a9d716..31049ae 100644 --- a/src/lib/sqllib.h +++ b/src/lib/sqllib.h @@ -7,6 +7,6 @@ #include "CreateStatement.h" #include "InsertStatement.h" #include "UpdateStatement.h" - +#include "DeleteStatement.h" #endif \ No newline at end of file diff --git a/src/parser/bison_parser.y b/src/parser/bison_parser.y index 8a966e0..4a1c851 100644 --- a/src/parser/bison_parser.y +++ b/src/parser/bison_parser.y @@ -83,6 +83,7 @@ typedef void* yyscan_t; hsql::ImportStatement* import_stmt; hsql::CreateStatement* create_stmt; hsql::InsertStatement* insert_stmt; + hsql::DeleteStatement* delete_stmt; hsql::TableRef* table; hsql::Expr* expr; @@ -131,6 +132,7 @@ typedef void* yyscan_t; %type import_statement %type create_statement %type insert_statement +%type delete_statement truncate_statement %type table_name opt_alias alias file_path %type opt_not_exists %type from_clause table_ref table_ref_atomic table_ref_name @@ -190,12 +192,14 @@ statement: | import_statement { $$ = $1; } | create_statement { $$ = $1; } | insert_statement { $$ = $1; } + | delete_statement { $$ = $1; } + | truncate_statement { $$ = $1; } ; /****************************** - ** Import Statement + * Import Statement ******************************/ import_statement: IMPORT FROM import_file_type FILE file_path INTO table_name { @@ -216,16 +220,25 @@ file_path: /****************************** - ** Create Statement + * Create Statement + * CREATE TABLE students (name TEXT, student_number INTEGER, city TEXT, grade DOUBLE) + * CREATE TABLE students FROM TBL FILE 'test/students.tbl' ******************************/ create_statement: CREATE TABLE opt_not_exists table_name FROM TBL FILE file_path { $$ = new CreateStatement(); - $$->create_type = kTableFromTbl; + $$->create_type = CreateStatement::kTableFromTbl; $$->if_not_exists = $3; $$->table_name = $4; $$->file_path = $8; } + | CREATE TABLE opt_not_exists table_name '(' column_def_commalist ')' { + $$ = new CreateStatement(); + $$->create_type = CreateStatement::kTable; + $$->if_not_exists = $3; + $$->table_name = $4; + // TODO: build into object + } ; opt_not_exists: @@ -233,9 +246,46 @@ opt_not_exists: | /* empty */ { $$ = false; } ; +column_def_commalist: + column_def + | column_def_commalist ',' column_def + ; + +column_def: + IDENTIFIER column_type + ; + +column_type: + INTEGER + | DOUBLE + | TEXT + ; + /****************************** - ** Insert Statement + * Delete Statement / Truncate statement + * DELETE FROM students WHERE grade > 3.0 + * DELETE FROM students <=> TRUNCATE students + ******************************/ +delete_statement: + DELETE FROM table_name opt_where { + $$ = new DeleteStatement(); + $$->table_name = $3; + $$->expr = $4; + } + ; + +truncate_statement: + TRUNCATE table_name { + $$ = new DeleteStatement(); + $$->table_name = $2; + } + ; + +/****************************** + * Insert Statement + * INSERT INTO students VALUES ('Max', 1112233, 'Musterhausen', 2.3) + * INSERT INTO employees SELECT * FROM stundents ******************************/ insert_statement: INSERT INTO table_name opt_column_list VALUES '(' literal_list ')' { @@ -261,7 +311,7 @@ opt_column_list: ; /****************************** - ** Select Statement + * Select Statement ******************************/ select_statement: @@ -349,7 +399,7 @@ opt_limit: ; /****************************** - ** Expressions + * Expressions ******************************/ expr_list: expr_alias { $$ = new List($1); } @@ -445,7 +495,7 @@ star_expr: /****************************** - ** Table + * Table ******************************/ table_ref: table_ref_atomic @@ -502,7 +552,7 @@ opt_alias: /****************************** - ** Join Statements + * Join Statements ******************************/ join_clause: @@ -543,7 +593,7 @@ join_condition: /****************************** - ** Misc + * Misc ******************************/ opt_semicolon: diff --git a/test/valid_queries.sql b/test/valid_queries.sql index dfa0c96..b3d7e35 100644 --- a/test/valid_queries.sql +++ b/test/valid_queries.sql @@ -13,9 +13,14 @@ SELECT * FROM t1 JOIN t2 ON c1 = c2; # CREATE statement CREATE TABLE "table" FROM TBL FILE 'students.tbl' CREATE TABLE IF NOT EXISTS "table" FROM TBL FILE 'students.tbl' +CREATE TABLE students (name TEXT, student_number INTEGER, city TEXT, grade DOUBLE) # Multiple statements CREATE TABLE "table" FROM TBL FILE 'students.tbl'; SELECT * FROM "table"; # INSERT INSERT INTO test_table VALUES (1, 2, 'test'); INSERT INTO test_table (id, value, name) VALUES (1, 2, 'test'); -INSERT INTO test_table SELECT * FROM students; \ No newline at end of file +INSERT INTO test_table SELECT * FROM students; +# DELETE +DELETE FROM students WHERE grade > 3.0 +DELETE FROM students +TRUNCATE students \ No newline at end of file