diff --git a/src/parser/bison_parser.y b/src/parser/bison_parser.y index 2e32ca4..7593212 100644 --- a/src/parser/bison_parser.y +++ b/src/parser/bison_parser.y @@ -343,6 +343,13 @@ create_statement: $$->tableName = $4; $$->columns = $6; } + | CREATE VIEW opt_not_exists table_name opt_column_list AS select_statement { + $$ = new CreateStatement(CreateStatement::kView); + $$->ifNotExists = $3; + $$->tableName = $4; + $$->viewColumns = $5; + $$->select = $7; + } ; opt_not_exists: @@ -380,6 +387,10 @@ drop_statement: $$ = new DropStatement(DropStatement::kTable); $$->name = $3; } + | DROP VIEW table_name { + $$ = new DropStatement(DropStatement::kView); + $$->name = $3; + } | DEALLOCATE PREPARE IDENTIFIER { $$ = new DropStatement(DropStatement::kPreparedStatement); $$->name = $3; diff --git a/src/sql/CreateStatement.h b/src/sql/CreateStatement.h index 2034bc6..5b96d33 100644 --- a/src/sql/CreateStatement.h +++ b/src/sql/CreateStatement.h @@ -5,9 +5,12 @@ // Note: Implementations of constructors and destructors can be found in statements.cpp. namespace hsql { + struct SelectStatement; + // Represents definition of a table column struct ColumnDefinition { enum DataType { + UNKNOWN, TEXT, INT, DOUBLE @@ -26,7 +29,8 @@ namespace hsql { struct CreateStatement : SQLStatement { enum CreateType { kTable, - kTableFromTbl // Hyrise file format + kTableFromTbl, // Hyrise file format + kView }; CreateStatement(CreateType type); @@ -37,6 +41,8 @@ namespace hsql { char* filePath; // default: NULL char* tableName; // default: NULL std::vector* columns; // default: NULL + std::vector* viewColumns; + SelectStatement* select; }; } // namespace hsql diff --git a/src/sql/statements.cpp b/src/sql/statements.cpp index 8d9973b..69ffc84 100644 --- a/src/sql/statements.cpp +++ b/src/sql/statements.cpp @@ -29,11 +29,14 @@ namespace hsql { ifNotExists(false), filePath(NULL), tableName(NULL), - columns(NULL) {}; + columns(NULL), + viewColumns(NULL), + select(NULL) {}; CreateStatement::~CreateStatement() { free(filePath); free(tableName); + delete select; if (columns != NULL) { for (ColumnDefinition* def : *columns) { @@ -41,6 +44,13 @@ namespace hsql { } delete columns; } + + if (viewColumns != NULL) { + for (char* column : *viewColumns) { + free(column); + } + delete viewColumns; + } } // DeleteStatement diff --git a/test/queries/tpc-h-11-15.sql b/test/queries/tpc-h-11-15.sql index 9f5318d..69c755d 100644 --- a/test/queries/tpc-h-11-15.sql +++ b/test/queries/tpc-h-11-15.sql @@ -42,10 +42,10 @@ WHERE L_PARTKEY = P_PARTKEY AND L_SHIPDATE >= '1995-09-01' AND L_SHIPDATE < date -- TPC_H Query 15.1 - Create View for Top Supplier Query --- CREATE VIEW REVENUE0 (SUPPLIER_NO, TOTAL_REVENUE) AS --- SELECT L_SUPPKEY, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) FROM LINEITEM --- WHERE L_SHIPDATE >= '1996-01-01' AND L_SHIPDATE < dateadd(mm, 3, cast('1996-01-01' as datetime)) --- GROUP BY L_SUPPKEY; +CREATE VIEW REVENUE0 (SUPPLIER_NO, TOTAL_REVENUE) AS +SELECT L_SUPPKEY, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) FROM LINEITEM +WHERE L_SHIPDATE >= '1996-01-01' AND L_SHIPDATE < dateadd(mm, 3, cast('1996-01-01' as datetime)) +GROUP BY L_SUPPKEY; -- TPC_H Query 15.2 - Top Supplier @@ -55,5 +55,4 @@ WHERE S_SUPPKEY = SUPPLIER_NO AND TOTAL_REVENUE = (SELECT MAX(TOTAL_REVENUE) FRO ORDER BY S_SUPPKEY; -- TPC_H Query 15.3 - Drop View --- DROP VIEW REVENUE0; - +DROP VIEW REVENUE0;