extended create and added delete/truncate statement

This commit is contained in:
Pedro 2014-11-26 14:43:22 +01:00
parent 789a4a5b9b
commit 5997d9b4a1
7 changed files with 124 additions and 17 deletions

View File

@ -6,16 +6,31 @@
namespace hsql { namespace hsql {
typedef enum { /**
kTable, * @struct ColumnDefinition
kTableFromTbl, // Hyrise file format */
} CreateType; struct ColumnDefinition {
enum DataType {
TEXT,
INT,
DOUBLE
};
char* name;
DataType type;
};
/** /**
* @struct CreateStatement * @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 { struct CreateStatement : Statement {
enum CreateType {
kTable,
kTableFromTbl, // Hyrise file format
};
CreateStatement() : CreateStatement() :
Statement(kStmtCreate), Statement(kStmtCreate),
if_not_exists(false), if_not_exists(false),
@ -33,6 +48,4 @@ struct CreateStatement : Statement {
} // namespace hsql } // namespace hsql
#endif #endif

30
src/lib/DeleteStatement.h Normal file
View File

@ -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

View File

@ -7,6 +7,11 @@
namespace hsql { namespace hsql {
/**
* @struct InsertStatement
* INSERT INTO students VALUES ('Max', 1112233, 'Musterhausen', 2.3)
* INSERT INTO employees SELECT * FROM stundents
*/
struct InsertStatement : Statement { struct InsertStatement : Statement {
typedef enum { typedef enum {
kInsertValues, kInsertValues,

View File

@ -36,6 +36,10 @@ InsertStatement::~InsertStatement() {
delete select; delete select;
} }
DeleteStatement::~DeleteStatement() {
delete expr;
}
OrderDescription::~OrderDescription() { OrderDescription::~OrderDescription() {

View File

@ -7,6 +7,6 @@
#include "CreateStatement.h" #include "CreateStatement.h"
#include "InsertStatement.h" #include "InsertStatement.h"
#include "UpdateStatement.h" #include "UpdateStatement.h"
#include "DeleteStatement.h"
#endif #endif

View File

@ -83,6 +83,7 @@ typedef void* yyscan_t;
hsql::ImportStatement* import_stmt; hsql::ImportStatement* import_stmt;
hsql::CreateStatement* create_stmt; hsql::CreateStatement* create_stmt;
hsql::InsertStatement* insert_stmt; hsql::InsertStatement* insert_stmt;
hsql::DeleteStatement* delete_stmt;
hsql::TableRef* table; hsql::TableRef* table;
hsql::Expr* expr; hsql::Expr* expr;
@ -131,6 +132,7 @@ typedef void* yyscan_t;
%type <import_stmt> import_statement %type <import_stmt> import_statement
%type <create_stmt> create_statement %type <create_stmt> create_statement
%type <insert_stmt> insert_statement %type <insert_stmt> insert_statement
%type <delete_stmt> delete_statement truncate_statement
%type <sval> table_name opt_alias alias file_path %type <sval> table_name opt_alias alias file_path
%type <bval> opt_not_exists %type <bval> opt_not_exists
%type <table> from_clause table_ref table_ref_atomic table_ref_name %type <table> from_clause table_ref table_ref_atomic table_ref_name
@ -190,12 +192,14 @@ statement:
| import_statement { $$ = $1; } | import_statement { $$ = $1; }
| create_statement { $$ = $1; } | create_statement { $$ = $1; }
| insert_statement { $$ = $1; } | insert_statement { $$ = $1; }
| delete_statement { $$ = $1; }
| truncate_statement { $$ = $1; }
; ;
/****************************** /******************************
** Import Statement * Import Statement
******************************/ ******************************/
import_statement: import_statement:
IMPORT FROM import_file_type FILE file_path INTO table_name { 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_statement:
CREATE TABLE opt_not_exists table_name FROM TBL FILE file_path { CREATE TABLE opt_not_exists table_name FROM TBL FILE file_path {
$$ = new CreateStatement(); $$ = new CreateStatement();
$$->create_type = kTableFromTbl; $$->create_type = CreateStatement::kTableFromTbl;
$$->if_not_exists = $3; $$->if_not_exists = $3;
$$->table_name = $4; $$->table_name = $4;
$$->file_path = $8; $$->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: opt_not_exists:
@ -233,9 +246,46 @@ opt_not_exists:
| /* empty */ { $$ = false; } | /* 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_statement:
INSERT INTO table_name opt_column_list VALUES '(' literal_list ')' { INSERT INTO table_name opt_column_list VALUES '(' literal_list ')' {
@ -261,7 +311,7 @@ opt_column_list:
; ;
/****************************** /******************************
** Select Statement * Select Statement
******************************/ ******************************/
select_statement: select_statement:
@ -349,7 +399,7 @@ opt_limit:
; ;
/****************************** /******************************
** Expressions * Expressions
******************************/ ******************************/
expr_list: expr_list:
expr_alias { $$ = new List<Expr*>($1); } expr_alias { $$ = new List<Expr*>($1); }
@ -445,7 +495,7 @@ star_expr:
/****************************** /******************************
** Table * Table
******************************/ ******************************/
table_ref: table_ref:
table_ref_atomic table_ref_atomic
@ -502,7 +552,7 @@ opt_alias:
/****************************** /******************************
** Join Statements * Join Statements
******************************/ ******************************/
join_clause: join_clause:
@ -543,7 +593,7 @@ join_condition:
/****************************** /******************************
** Misc * Misc
******************************/ ******************************/
opt_semicolon: opt_semicolon:

View File

@ -13,9 +13,14 @@ SELECT * FROM t1 JOIN t2 ON c1 = c2;
# CREATE statement # CREATE statement
CREATE TABLE "table" FROM TBL FILE 'students.tbl' CREATE TABLE "table" FROM TBL FILE 'students.tbl'
CREATE TABLE IF NOT EXISTS "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 # Multiple statements
CREATE TABLE "table" FROM TBL FILE 'students.tbl'; SELECT * FROM "table"; CREATE TABLE "table" FROM TBL FILE 'students.tbl'; SELECT * FROM "table";
# INSERT # INSERT
INSERT INTO test_table VALUES (1, 2, 'test'); INSERT INTO test_table VALUES (1, 2, 'test');
INSERT INTO test_table (id, value, name) VALUES (1, 2, 'test'); INSERT INTO test_table (id, value, name) VALUES (1, 2, 'test');
INSERT INTO test_table SELECT * FROM students; INSERT INTO test_table SELECT * FROM students;
# DELETE
DELETE FROM students WHERE grade > 3.0
DELETE FROM students
TRUNCATE students