2017-04-09 13:34:40 +02:00
|
|
|
|
|
|
|
#include "thirdparty/microtest/microtest.h"
|
|
|
|
#include "sql_asserts.h"
|
|
|
|
#include "SQLParser.h"
|
|
|
|
|
|
|
|
using hsql::kExprPlaceholder;
|
|
|
|
|
|
|
|
using hsql::kStmtDrop;
|
|
|
|
using hsql::kStmtExecute;
|
|
|
|
using hsql::kStmtInsert;
|
|
|
|
using hsql::kStmtPrepare;
|
|
|
|
using hsql::kStmtSelect;
|
|
|
|
|
2017-04-21 16:15:07 +02:00
|
|
|
using hsql::kDropPreparedStatement;
|
|
|
|
|
2017-04-09 13:34:40 +02:00
|
|
|
using hsql::DropStatement;
|
|
|
|
using hsql::ExecuteStatement;
|
|
|
|
using hsql::InsertStatement;
|
|
|
|
using hsql::PrepareStatement;
|
|
|
|
using hsql::SelectStatement;
|
|
|
|
|
|
|
|
|
|
|
|
TEST(PrepareSingleStatementTest) {
|
|
|
|
const std::string query = "PREPARE test: SELECT * FROM students WHERE grade = ?;";
|
|
|
|
TEST_PARSE_SINGLE_SQL(query, kStmtPrepare, PrepareStatement, result, prepare);
|
|
|
|
|
|
|
|
const SelectStatement* select = (const SelectStatement*) prepare->query->getStatement(0);
|
|
|
|
|
|
|
|
ASSERT(select->whereClause->isSimpleOp('='));
|
|
|
|
ASSERT_EQ(select->whereClause->expr2, prepare->placeholders[0])
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(PrepareMultiStatementTest) {
|
|
|
|
const std::string query = "PREPARE test {"
|
|
|
|
"INSERT INTO test VALUES(?);"
|
|
|
|
"SELECT ?, test FROM test WHERE c1 = ?;"
|
|
|
|
"};"
|
|
|
|
"PREPARE stmt: SELECT * FROM data WHERE c1 = ?;"
|
|
|
|
"DEALLOCATE PREPARE stmt;";
|
|
|
|
|
|
|
|
TEST_PARSE_SQL_QUERY(query, result, 3);
|
|
|
|
|
|
|
|
TEST_CAST_STMT(result, 0, kStmtPrepare, PrepareStatement, prep1);
|
|
|
|
TEST_CAST_STMT(result, 1, kStmtPrepare, PrepareStatement, prep2);
|
|
|
|
TEST_CAST_STMT(result, 2, kStmtDrop, DropStatement, drop);
|
|
|
|
|
|
|
|
// Prepare Statement #1
|
|
|
|
ASSERT_STREQ(prep1->name, "test");
|
|
|
|
ASSERT_EQ(prep1->placeholders.size(), 3);
|
|
|
|
ASSERT_EQ(prep1->query->size(), 2);
|
|
|
|
|
|
|
|
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->selectList->at(0)->isType(kExprPlaceholder));
|
|
|
|
ASSERT(select->whereClause->expr2->isType(kExprPlaceholder));
|
|
|
|
|
|
|
|
// Check IDs of placeholders
|
|
|
|
ASSERT_EQ(insert->values->at(0)->ival, 0);
|
|
|
|
ASSERT_EQ(insert->values->at(0), prep1->placeholders[0]);
|
|
|
|
|
|
|
|
ASSERT_EQ(select->selectList->at(0)->ival, 1);
|
|
|
|
ASSERT_EQ(select->selectList->at(0), prep1->placeholders[1]);
|
|
|
|
|
|
|
|
ASSERT_EQ(select->whereClause->expr2->ival, 2);
|
|
|
|
ASSERT_EQ(select->whereClause->expr2, prep1->placeholders[2]);
|
|
|
|
|
|
|
|
// Prepare Statement #2
|
|
|
|
ASSERT_STREQ(prep2->name, "stmt");
|
|
|
|
ASSERT_EQ(prep2->placeholders.size(), 1);
|
|
|
|
|
|
|
|
// Deallocate Statement
|
2017-04-21 16:15:07 +02:00
|
|
|
ASSERT_EQ(drop->type, kDropPreparedStatement);
|
2017-04-09 13:34:40 +02:00
|
|
|
ASSERT_STREQ(drop->name, "stmt");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(ExecuteStatementTest) {
|
|
|
|
TEST_PARSE_SINGLE_SQL("EXECUTE test(1, 2);", kStmtExecute, ExecuteStatement, result, stmt);
|
|
|
|
|
|
|
|
ASSERT_STREQ(stmt->name, "test");
|
|
|
|
ASSERT_EQ(stmt->parameters->size(), 2);
|
|
|
|
}
|