From 9a5a352a0b57a70fab793805cd0e90491cfc9c49 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 8 Mar 2017 16:55:29 +0100 Subject: [PATCH] add explicit test to TPC-H query properties --- src/sql/Expr.cpp | 2 +- test/tpc_h_tests.cpp | 58 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/sql/Expr.cpp b/src/sql/Expr.cpp index a4d4c80..f1ebe9b 100644 --- a/src/sql/Expr.cpp +++ b/src/sql/Expr.cpp @@ -151,7 +151,7 @@ namespace hsql { e->opType = IN; e->expr = expr; e->select = select; - + return e; } diff --git a/test/tpc_h_tests.cpp b/test/tpc_h_tests.cpp index 614d18f..9da1b13 100644 --- a/test/tpc_h_tests.cpp +++ b/test/tpc_h_tests.cpp @@ -10,6 +10,13 @@ using namespace hsql; +std::string readFileContents(std::string file_path) { + std::ifstream t(file_path.c_str()); + std::string text((std::istreambuf_iterator(t)), + std::istreambuf_iterator()); + return text; +} + TEST(TPCHQueryGrammarTests) { std::vector files = { "test/queries/tpc-h-01.sql", @@ -28,9 +35,7 @@ TEST(TPCHQueryGrammarTests) { int testsFailed = 0; for (const std::string& file_path : files) { - std::ifstream t(file_path.c_str()); - std::string query((std::istreambuf_iterator(t)), - std::istreambuf_iterator()); + std::string query = readFileContents(file_path); SQLParserResult* result = SQLParser::parseSQLString(query.c_str()); if (!result->isValid()) { @@ -44,3 +49,50 @@ TEST(TPCHQueryGrammarTests) { } ASSERT_EQ(testsFailed, 0); } + +TEST(TPCHQueryDetailTest) { + std::string query = readFileContents("test/queries/tpc-h-16-22.sql"); + + SQLParserResult* result = SQLParser::parseSQLString(query.c_str()); + ASSERT(result->isValid()); + ASSERT_EQ(result->size(), 7); + + const SQLStatement* stmt20 = result->getStatement(4); + ASSERT_EQ(stmt20->type(), kStmtSelect); + + const SelectStatement* select20 = (const SelectStatement*) stmt20; + ASSERT_EQ(select20->selectList->size(), 2); + ASSERT_STREQ(select20->selectList->at(0)->getName(), "S_NAME"); + ASSERT_STREQ(select20->selectList->at(1)->getName(), "S_ADDRESS"); + + // Test WHERE Clause. + Expr* where = select20->whereClause; + ASSERT_NOTNULL(where); + ASSERT(where->isType(kExprOperator)); + ASSERT_EQ(where->opType, Expr::AND); + + Expr* andExpr2 = where->expr; + ASSERT_NOTNULL(andExpr2); + ASSERT(andExpr2->isType(kExprOperator)); + ASSERT_EQ(andExpr2->opType, Expr::AND); + + // Test IN expression. + Expr* inExpr = andExpr2->expr; + ASSERT_NOTNULL(inExpr); + ASSERT(inExpr->isType(kExprOperator)); + ASSERT_EQ(inExpr->opType, Expr::IN); + + ASSERT_STREQ(inExpr->expr->getName(), "S_SUPPKEY"); + ASSERT_NOTNULL(inExpr->select); + ASSERT_EQ(inExpr->select->selectList->size(), 1); + ASSERT(inExpr->select->selectList->at(0)->isType(kExprColumnRef)); + ASSERT_STREQ(inExpr->select->selectList->at(0)->getName(), "PS_SUPPKEY"); + + // Test ORDER BY clause. + ASSERT_NOTNULL(select20->order); + ASSERT_EQ(select20->order->size(), 1); + ASSERT(select20->order->at(0)->expr->isType(kExprColumnRef)); + ASSERT_STREQ(select20->order->at(0)->expr->getName(), "S_NAME"); + + delete result; +} \ No newline at end of file