extended create and added delete/truncate statement
This commit is contained in:
parent
789a4a5b9b
commit
5997d9b4a1
|
@ -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
|
|
@ -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
|
|
@ -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,
|
||||||
|
|
|
@ -36,6 +36,10 @@ InsertStatement::~InsertStatement() {
|
||||||
delete select;
|
delete select;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DeleteStatement::~DeleteStatement() {
|
||||||
|
delete expr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
OrderDescription::~OrderDescription() {
|
OrderDescription::~OrderDescription() {
|
||||||
|
|
|
@ -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
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue