From 2f110b81681e457b5055e7022fa1563b2f1f3373 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 7 Jan 2015 13:42:11 +0100 Subject: [PATCH] implemented DEALLOCATE PREPARE --- src/lib/statements/DropStatement.h | 3 ++- src/parser/bison_parser.y | 8 +++++++- src/sql_tests.cpp | 26 +++++++++++++------------- src/tests/helper.h | 5 +++++ src/tests/valid_queries.sql | 3 ++- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/lib/statements/DropStatement.h b/src/lib/statements/DropStatement.h index 5f1b3cd..32a7b1c 100644 --- a/src/lib/statements/DropStatement.h +++ b/src/lib/statements/DropStatement.h @@ -15,7 +15,8 @@ struct DropStatement : SQLStatement { kTable, kSchema, kIndex, - kView + kView, + kPreparedStatement }; diff --git a/src/parser/bison_parser.y b/src/parser/bison_parser.y index ed1c345..90bd532 100644 --- a/src/parser/bison_parser.y +++ b/src/parser/bison_parser.y @@ -353,7 +353,8 @@ column_type: /****************************** * Drop Statement - * DROP TABLE students + * DROP TABLE students; + * DEALLOCATE PREPARE stmt; ******************************/ drop_statement: @@ -361,6 +362,11 @@ drop_statement: $$ = new DropStatement(DropStatement::kTable); $$->name = $3; } + | DEALLOCATE PREPARE IDENTIFIER { + $$ = new DropStatement(DropStatement::kPreparedStatement); + $$->name = $3; + } + ; /****************************** * Delete Statement / Truncate statement diff --git a/src/sql_tests.cpp b/src/sql_tests.cpp index 2162ba0..bb29555 100644 --- a/src/sql_tests.cpp +++ b/src/sql_tests.cpp @@ -96,26 +96,22 @@ TEST(PrepareStatementTest) { "INSERT INTO test VALUES(?);" "SELECT ?, test FROM test WHERE c1 = ?;" "};" - "PREPARE stmt: SELECT * FROM data WHERE c1 = ?;"; + "PREPARE stmt: SELECT * FROM data WHERE c1 = ?;" + "DEALLOCATE PREPARE stmt;"; - TEST_PARSE_SQL_QUERY(query, stmt_list, 2); + TEST_PARSE_SQL_QUERY(query, stmt_list, 3); - ASSERT_EQ(stmt_list->getStatement(0)->type(), kStmtPrepare); - ASSERT_EQ(stmt_list->getStatement(1)->type(), kStmtPrepare); - - PrepareStatement* prep1 = (PrepareStatement*) stmt_list->getStatement(0); - PrepareStatement* prep2 = (PrepareStatement*) stmt_list->getStatement(1); + TEST_CAST_STMT(stmt_list, 0, kStmtPrepare, PrepareStatement, prep1); + TEST_CAST_STMT(stmt_list, 1, kStmtPrepare, PrepareStatement, prep2); + TEST_CAST_STMT(stmt_list, 2, kStmtDrop, DropStatement, drop); // Prepare Statement #1 ASSERT_STREQ(prep1->name, "test"); ASSERT_EQ(prep1->placeholders.size(), 3); - ASSERT_EQ(prep1->query->numStatements(), 2); - ASSERT_EQ(prep1->query->getStatement(0)->type(), kStmtInsert); - ASSERT_EQ(prep1->query->getStatement(1)->type(), kStmtSelect); - - InsertStatement* insert = (InsertStatement*) prep1->query->getStatement(0); - SelectStatement* select = (SelectStatement*) prep1->query->getStatement(1); + + TEST_CAST_STMT(prep1->query, 0, kStmtInsert, InsertStatement, insert); + TEST_CAST_STMT(prep1->query, 1, kStmtSelect, SelectStatement, select); ASSERT(insert->values->at(0)->isType(kExprPlaceholder)); ASSERT(select->select_list->at(0)->isType(kExprPlaceholder)); @@ -134,6 +130,10 @@ TEST(PrepareStatementTest) { // Prepare Statement #2 ASSERT_STREQ(prep2->name, "stmt"); ASSERT_EQ(prep2->placeholders.size(), 1); + + // Deallocate Statement + ASSERT_EQ(drop->type, DropStatement::kPreparedStatement); + ASSERT_STREQ(drop->name, "stmt"); } diff --git a/src/tests/helper.h b/src/tests/helper.h index e208977..b6bfc80 100644 --- a/src/tests/helper.h +++ b/src/tests/helper.h @@ -14,4 +14,9 @@ stmt_class* output_var = (stmt_class*) stmt_list->getStatement(0); +#define TEST_CAST_STMT(stmt_list, stmt_index, stmt_type, stmt_class, output_var) \ + ASSERT_EQ(stmt_list->getStatement(stmt_index)->type(), stmt_type); \ + stmt_class* output_var = (stmt_class*) stmt_list->getStatement(stmt_index); + + #endif \ No newline at end of file diff --git a/src/tests/valid_queries.sql b/src/tests/valid_queries.sql index 11b9062..7ebfa61 100644 --- a/src/tests/valid_queries.sql +++ b/src/tests/valid_queries.sql @@ -35,4 +35,5 @@ DROP TABLE students; PREPARE prep_inst: INSERT INTO test VALUES (?, ?, ?); PREPARE prep2 { INSERT INTO test VALUES (?, 0, 0); INSERT INTO test VALUES (0, ?, 0); INSERT INTO test VALUES (0, 0, ?); }; EXECUTE prep_inst(1, 2, 3); -EXECUTE prep; \ No newline at end of file +EXECUTE prep; +DEALLOCATE PREPARE prep; \ No newline at end of file