void StatsTestsUtil::CreateTable(bool has_primary_key) { LOG_INFO("Creating a table..."); auto id_column = catalog::Column( common::Type::INTEGER, common::Type::GetTypeSize(common::Type::INTEGER), "dept_id", true); if (has_primary_key) { catalog::Constraint constraint(CONSTRAINT_TYPE_PRIMARY, "con_primary"); id_column.AddConstraint(constraint); } auto name_column = catalog::Column(common::Type::VARCHAR, 32, "dept_name", false); std::unique_ptr<catalog::Schema> table_schema( new catalog::Schema({id_column, name_column})); auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance(); auto txn = txn_manager.BeginTransaction(); std::unique_ptr<executor::ExecutorContext> context( new executor::ExecutorContext(txn)); planner::CreatePlan node("department_table", "emp_db", std::move(table_schema), CreateType::CREATE_TYPE_TABLE); executor::CreateExecutor create_executor(&node, context.get()); create_executor.Init(); create_executor.Execute(); txn_manager.CommitTransaction(txn); }
TEST_F(DeleteTests, VariousOperations) { LOG_INFO("Bootstrapping..."); catalog::Catalog::GetInstance()->CreateDatabase(DEFAULT_DB_NAME, nullptr); LOG_INFO("Bootstrapping completed!"); // Create a table first LOG_INFO("Creating a table..."); auto id_column = catalog::Column( common::Type::INTEGER, common::Type::GetTypeSize(common::Type::INTEGER), "dept_id", true); auto name_column = catalog::Column(common::Type::VARCHAR, 32, "dept_name", false); std::unique_ptr<catalog::Schema> table_schema( new catalog::Schema({id_column, name_column})); auto& txn_manager = concurrency::TransactionManagerFactory::GetInstance(); auto txn = txn_manager.BeginTransaction(); std::unique_ptr<executor::ExecutorContext> context( new executor::ExecutorContext(txn)); planner::CreatePlan node("department_table", DEFAULT_DB_NAME, std::move(table_schema), CreateType::CREATE_TYPE_TABLE); executor::CreateExecutor create_executor(&node, context.get()); create_executor.Init(); create_executor.Execute(); txn_manager.CommitTransaction(txn); EXPECT_EQ(catalog::Catalog::GetInstance() ->GetDatabaseWithName(DEFAULT_DB_NAME) ->GetTableCount(), 1); LOG_INFO("Table created!"); // Inserting a tuple end-to-end LOG_INFO("Inserting a tuple..."); LOG_INFO( "Query: INSERT INTO department_table(dept_id,dept_name) VALUES " "(1,'hello_1');"); std::unique_ptr<Statement> statement; statement.reset(new Statement( "INSERT", "INSERT INTO department_table(dept_id,dept_name) VALUES (1,'hello_1');")); auto& peloton_parser = parser::Parser::GetInstance(); LOG_INFO("Building parse tree..."); auto insert_stmt = peloton_parser.BuildParseTree( "INSERT INTO department_table(dept_id,dept_name) VALUES (1,'hello_1');"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree( optimizer::SimpleOptimizer::BuildPelotonPlanTree(insert_stmt)); LOG_INFO("Building plan tree completed!"); std::vector<common::Value*> params; std::vector<ResultType> result; bridge::PlanExecutor::PrintPlan(statement->GetPlanTree().get(), "Plan"); LOG_INFO("Executing plan..."); std::vector<int> result_format; result_format = std::move(std::vector<int>(0, 0)); bridge::peloton_status status = bridge::PlanExecutor::ExecutePlan( statement->GetPlanTree().get(), params, result, result_format); LOG_INFO("Statement executed. Result: %d", status.m_result); LOG_INFO("Tuple inserted!"); ShowTable(DEFAULT_DB_NAME, "department_table"); LOG_INFO("Inserting a tuple..."); LOG_INFO( "Query: INSERT INTO department_table(dept_id,dept_name) VALUES " "(2,'hello_2');"); statement.reset(new Statement( "INSERT", "INSERT INTO department_table(dept_id,dept_name) VALUES (2,'hello_2');")); LOG_INFO("Building parse tree..."); insert_stmt = peloton_parser.BuildParseTree( "INSERT INTO department_table(dept_id,dept_name) VALUES (2,'hello_2');"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree( optimizer::SimpleOptimizer::BuildPelotonPlanTree(insert_stmt)); LOG_INFO("Building plan tree completed!"); bridge::PlanExecutor::PrintPlan(statement->GetPlanTree().get(), "Plan"); LOG_INFO("Executing plan..."); result_format = std::move(std::vector<int>(0, 0)); status = bridge::PlanExecutor::ExecutePlan(statement->GetPlanTree().get(), params, result, result_format); LOG_INFO("Statement executed. Result: %d", status.m_result); LOG_INFO("Tuple inserted!"); ShowTable(DEFAULT_DB_NAME, "department_table"); LOG_INFO("Inserting a tuple..."); LOG_INFO( "Query: INSERT INTO department_table(dept_id,dept_name) VALUES " "(3,'hello_2');"); statement.reset(new Statement( "INSERT", "INSERT INTO department_table(dept_id,dept_name) VALUES (3,'hello_2');")); LOG_INFO("Building parse tree..."); insert_stmt = peloton_parser.BuildParseTree( "INSERT INTO department_table(dept_id,dept_name) VALUES (3,'hello_2');"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree( optimizer::SimpleOptimizer::BuildPelotonPlanTree(insert_stmt)); LOG_INFO("Building plan tree completed!"); bridge::PlanExecutor::PrintPlan(statement->GetPlanTree().get(), "Plan"); LOG_INFO("Executing plan..."); result_format = std::move(std::vector<int>(0, 0)); status = bridge::PlanExecutor::ExecutePlan(statement->GetPlanTree().get(), params, result, result_format); LOG_INFO("Statement executed. Result: %d", status.m_result); LOG_INFO("Tuple inserted!"); ShowTable(DEFAULT_DB_NAME, "department_table"); // Just Counting number of tuples in table LOG_INFO("Selecting MAX(dept_id)"); LOG_INFO("Query: SELECT MAX(dept_id) FROM department_table;"); statement.reset( new Statement("MAX", "SELECT MAX(dept_id) FROM department_table;")); LOG_INFO("Building parse tree..."); auto select_stmt = peloton_parser.BuildParseTree( "SELECT MAX(dept_id) FROM department_table;"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree( optimizer::SimpleOptimizer::BuildPelotonPlanTree(select_stmt)); LOG_INFO("Building plan tree completed!"); bridge::PlanExecutor::PrintPlan(statement->GetPlanTree().get(), "Plan"); LOG_INFO("Executing plan..."); auto tuple_descriptor = tcop::TrafficCop::GetInstance().GenerateTupleDescriptor( statement->GetQueryString()); result_format = std::move(std::vector<int>(tuple_descriptor.size(), 0)); status = bridge::PlanExecutor::ExecutePlan(statement->GetPlanTree().get(), params, result, result_format); LOG_INFO("Statement executed. Result: %d", status.m_result); LOG_INFO("Counted Tuples!"); // Now deleting end-to-end LOG_INFO("Deleting a tuple..."); LOG_INFO("Query: DELETE FROM department_table"); statement.reset(new Statement("DELETE", "DELETE FROM department_table")); LOG_INFO("Building parse tree..."); auto delete_stmt = peloton_parser.BuildParseTree("DELETE FROM department_table"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree( optimizer::SimpleOptimizer::BuildPelotonPlanTree(delete_stmt)); LOG_INFO("Building plan tree completed!"); bridge::PlanExecutor::PrintPlan(statement->GetPlanTree().get(), "Plan"); LOG_INFO("Executing plan..."); result_format = std::move(std::vector<int>(0, 0)); status = bridge::PlanExecutor::ExecutePlan(statement->GetPlanTree().get(), params, result, result_format); LOG_INFO("Statement executed. Result: %d", status.m_result); LOG_INFO("Tuple deleted!"); ShowTable(DEFAULT_DB_NAME, "department_table"); // Test Another delete. Should not find any tuple to be deleted LOG_INFO("Deleting a tuple..."); LOG_INFO("Query: DELETE FROM department_table WHERE dept_id < 2"); statement.reset(new Statement( "DELETE", "DELETE FROM department_table WHERE dept_id < 2")); LOG_INFO("Building parse tree..."); auto delete_stmt_2 = peloton_parser.BuildParseTree( "DELETE FROM department_table WHERE dept_id < 2"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree( optimizer::SimpleOptimizer::BuildPelotonPlanTree(delete_stmt_2)); LOG_INFO("Building plan tree completed!"); bridge::PlanExecutor::PrintPlan(statement->GetPlanTree().get(), "Plan"); LOG_INFO("Executing plan..."); result_format = std::move(std::vector<int>(0, 0)); status = bridge::PlanExecutor::ExecutePlan(statement->GetPlanTree().get(), params, result, result_format); LOG_INFO("Statement executed. Result: %d", status.m_result); LOG_INFO("Tuple deleted!"); ShowTable(DEFAULT_DB_NAME, "department_table"); // free the database just created txn = txn_manager.BeginTransaction(); catalog::Catalog::GetInstance()->DropDatabaseWithName(DEFAULT_DB_NAME, txn); txn_manager.CommitTransaction(txn); }
TEST_F(DeleteTests, VariousOperations) { LOG_INFO("Bootstrapping..."); auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance(); auto txn = txn_manager.BeginTransaction(); catalog::Catalog::GetInstance()->CreateDatabase(DEFAULT_DB_NAME, txn); LOG_INFO("Bootstrapping completed!"); // optimizer::SimpleOptimizer optimizer; std::unique_ptr<optimizer::AbstractOptimizer> optimizer; optimizer.reset(new optimizer::Optimizer); auto &traffic_cop = tcop::TrafficCop::GetInstance(); traffic_cop.SetTaskCallback(TestingSQLUtil::UtilTestTaskCallback, &TestingSQLUtil::counter_); // Create a table first LOG_INFO("Creating a table..."); auto id_column = catalog::Column( type::TypeId::INTEGER, type::Type::GetTypeSize(type::TypeId::INTEGER), "dept_id", true); auto name_column = catalog::Column(type::TypeId::VARCHAR, 32, "dept_name", false); std::unique_ptr<catalog::Schema> table_schema( new catalog::Schema({id_column, name_column})); std::unique_ptr<executor::ExecutorContext> context( new executor::ExecutorContext(txn)); planner::CreatePlan node("department_table", DEFUALT_SCHEMA_NAME, DEFAULT_DB_NAME, std::move(table_schema), CreateType::TABLE); executor::CreateExecutor create_executor(&node, context.get()); create_executor.Init(); create_executor.Execute(); LOG_INFO("Table created!"); storage::DataTable *table = catalog::Catalog::GetInstance()->GetTableWithName( DEFAULT_DB_NAME, DEFUALT_SCHEMA_NAME, "department_table", txn); txn_manager.CommitTransaction(txn); txn = txn_manager.BeginTransaction(); traffic_cop.SetTcopTxnState(txn); // Inserting a tuple end-to-end LOG_INFO("Inserting a tuple..."); LOG_INFO( "Query: INSERT INTO department_table(dept_id,dept_name) VALUES " "(1,'hello_1');"); std::unique_ptr<Statement> statement; statement.reset(new Statement( "INSERT", "INSERT INTO department_table(dept_id,dept_name) VALUES (1,'hello_1');")); auto &peloton_parser = parser::PostgresParser::GetInstance(); LOG_INFO("Building parse tree..."); auto insert_stmt = peloton_parser.BuildParseTree( "INSERT INTO department_table(dept_id,dept_name) VALUES (1,'hello_1');"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Binding parse tree..."); auto parse_tree = insert_stmt->GetStatement(0); auto bind_node_visitor = binder::BindNodeVisitor(txn, DEFAULT_DB_NAME); bind_node_visitor.BindNameToNode(parse_tree); LOG_INFO("Binding parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree(optimizer->BuildPelotonPlanTree(insert_stmt, txn)); LOG_INFO("Building plan tree completed!"); std::vector<type::Value> params; std::vector<ResultValue> result; LOG_INFO("Executing plan...\n%s", planner::PlanUtil::GetInfo(statement->GetPlanTree().get()).c_str()); std::vector<int> result_format; result_format = std::vector<int>(0, 0); TestingSQLUtil::counter_.store(1); executor::ExecutionResult status = traffic_cop.ExecuteHelper( statement->GetPlanTree(), params, result, result_format); if (traffic_cop.GetQueuing()) { TestingSQLUtil::ContinueAfterComplete(); traffic_cop.ExecuteStatementPlanGetResult(); status = traffic_cop.p_status_; traffic_cop.SetQueuing(false); } LOG_INFO("Statement executed. Result: %s", ResultTypeToString(status.m_result).c_str()); LOG_INFO("Tuple inserted!"); traffic_cop.CommitQueryHelper(); ShowTable(DEFAULT_DB_NAME, "department_table"); txn = txn_manager.BeginTransaction(); traffic_cop.SetTcopTxnState(txn); LOG_INFO("Inserting a tuple..."); LOG_INFO( "Query: INSERT INTO department_table(dept_id,dept_name) VALUES " "(2,'hello_2');"); statement.reset(new Statement( "INSERT", "INSERT INTO department_table(dept_id,dept_name) VALUES (2,'hello_2');")); LOG_INFO("Building parse tree..."); insert_stmt = peloton_parser.BuildParseTree( "INSERT INTO department_table(dept_id,dept_name) VALUES (2,'hello_2');"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Binding parse tree..."); parse_tree = insert_stmt->GetStatement(0); bind_node_visitor = binder::BindNodeVisitor(txn, DEFAULT_DB_NAME); bind_node_visitor.BindNameToNode(parse_tree); LOG_INFO("Binding parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree(optimizer->BuildPelotonPlanTree(insert_stmt, txn)); LOG_INFO("Building plan tree completed!\n%s", planner::PlanUtil::GetInfo(statement->GetPlanTree().get()).c_str()); LOG_INFO("Executing plan..."); result_format = std::vector<int>(0, 0); TestingSQLUtil::counter_.store(1); status = traffic_cop.ExecuteHelper(statement->GetPlanTree(), params, result, result_format); if (traffic_cop.GetQueuing()) { TestingSQLUtil::ContinueAfterComplete(); traffic_cop.ExecuteStatementPlanGetResult(); status = traffic_cop.p_status_; traffic_cop.SetQueuing(false); } LOG_INFO("Statement executed. Result: %s", ResultTypeToString(status.m_result).c_str()); LOG_INFO("Tuple inserted!"); traffic_cop.CommitQueryHelper(); ShowTable(DEFAULT_DB_NAME, "department_table"); txn = txn_manager.BeginTransaction(); traffic_cop.SetTcopTxnState(txn); LOG_INFO("Inserting a tuple..."); LOG_INFO( "Query: INSERT INTO department_table(dept_id,dept_name) VALUES " "(3,'hello_2');"); statement.reset(new Statement( "INSERT", "INSERT INTO department_table(dept_id,dept_name) VALUES (3,'hello_2');")); LOG_INFO("Building parse tree..."); insert_stmt = peloton_parser.BuildParseTree( "INSERT INTO department_table(dept_id,dept_name) VALUES (3,'hello_2');"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Binding parse tree..."); parse_tree = insert_stmt->GetStatement(0); bind_node_visitor = binder::BindNodeVisitor(txn, DEFAULT_DB_NAME); bind_node_visitor.BindNameToNode(parse_tree); LOG_INFO("Binding parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree(optimizer->BuildPelotonPlanTree(insert_stmt, txn)); LOG_INFO("Building plan tree completed!\n%s", planner::PlanUtil::GetInfo(statement->GetPlanTree().get()).c_str()); LOG_INFO("Executing plan..."); result_format = std::vector<int>(0, 0); TestingSQLUtil::counter_.store(1); status = traffic_cop.ExecuteHelper(statement->GetPlanTree(), params, result, result_format); if (traffic_cop.GetQueuing()) { TestingSQLUtil::ContinueAfterComplete(); traffic_cop.ExecuteStatementPlanGetResult(); status = traffic_cop.p_status_; traffic_cop.SetQueuing(false); } LOG_INFO("Statement executed. Result: %s", ResultTypeToString(status.m_result).c_str()); LOG_INFO("Tuple inserted!"); traffic_cop.CommitQueryHelper(); ShowTable(DEFAULT_DB_NAME, "department_table"); LOG_INFO("%s", table->GetInfo().c_str()); txn = txn_manager.BeginTransaction(); traffic_cop.SetTcopTxnState(txn); // Just Counting number of tuples in table LOG_INFO("Selecting MAX(dept_id)"); LOG_INFO("Query: SELECT MAX(dept_id) FROM department_table;"); statement.reset( new Statement("MAX", "SELECT MAX(dept_id) FROM department_table;")); LOG_INFO("Building parse tree..."); auto select_stmt = peloton_parser.BuildParseTree( "SELECT MAX(dept_id) FROM department_table;"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Binding parse tree..."); parse_tree = select_stmt->GetStatement(0); bind_node_visitor = binder::BindNodeVisitor(txn, DEFAULT_DB_NAME); bind_node_visitor.BindNameToNode(parse_tree); LOG_INFO("Binding parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree(optimizer->BuildPelotonPlanTree(select_stmt, txn)); LOG_INFO("Building plan tree completed!\n%s", planner::PlanUtil::GetInfo(statement->GetPlanTree().get()).c_str()); LOG_INFO("Executing plan..."); auto tuple_descriptor = traffic_cop.GenerateTupleDescriptor(select_stmt->GetStatement(0)); result_format = std::vector<int>(tuple_descriptor.size(), 0); TestingSQLUtil::counter_.store(1); status = traffic_cop.ExecuteHelper(statement->GetPlanTree(), params, result, result_format); if (traffic_cop.GetQueuing()) { TestingSQLUtil::ContinueAfterComplete(); traffic_cop.ExecuteStatementPlanGetResult(); status = traffic_cop.p_status_; traffic_cop.SetQueuing(false); } LOG_INFO("Statement executed. Result: %s", ResultTypeToString(status.m_result).c_str()); LOG_INFO("Counted Tuples!"); traffic_cop.CommitQueryHelper(); txn = txn_manager.BeginTransaction(); traffic_cop.SetTcopTxnState(txn); // Test Another delete. Should not find any tuple to be deleted LOG_INFO("Deleting a tuple..."); LOG_INFO("Query: DELETE FROM department_table WHERE dept_id < 2"); statement.reset(new Statement( "DELETE", "DELETE FROM department_table WHERE dept_id < 2")); LOG_INFO("Building parse tree..."); auto delete_stmt_2 = peloton_parser.BuildParseTree( "DELETE FROM department_table WHERE dept_id < 2"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Binding parse tree..."); parse_tree = delete_stmt_2->GetStatement(0); bind_node_visitor = binder::BindNodeVisitor(txn, DEFAULT_DB_NAME); bind_node_visitor.BindNameToNode(parse_tree); LOG_INFO("Binding parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree(optimizer->BuildPelotonPlanTree(delete_stmt_2, txn)); LOG_INFO("Building plan tree completed!\n%s", planner::PlanUtil::GetInfo(statement->GetPlanTree().get()).c_str()); LOG_INFO("Executing plan..."); result_format = std::vector<int>(0, 0); TestingSQLUtil::counter_.store(1); status = traffic_cop.ExecuteHelper(statement->GetPlanTree(), params, result, result_format); if (traffic_cop.GetQueuing()) { TestingSQLUtil::ContinueAfterComplete(); traffic_cop.ExecuteStatementPlanGetResult(); status = traffic_cop.p_status_; traffic_cop.SetQueuing(false); } LOG_INFO("Statement executed. Result: %s", ResultTypeToString(status.m_result).c_str()); LOG_INFO("Tuple deleted!"); traffic_cop.CommitQueryHelper(); ShowTable(DEFAULT_DB_NAME, "department_table"); LOG_INFO("%s", table->GetInfo().c_str()); txn = txn_manager.BeginTransaction(); traffic_cop.SetTcopTxnState(txn); // Now deleting end-to-end LOG_INFO("Deleting a tuple..."); LOG_INFO("Query: DELETE FROM department_table"); statement.reset(new Statement("DELETE", "DELETE FROM department_table")); LOG_INFO("Building parse tree..."); auto delete_stmt = peloton_parser.BuildParseTree("DELETE FROM department_table"); LOG_INFO("Building parse tree completed!"); LOG_INFO("Binding parse tree..."); parse_tree = delete_stmt->GetStatement(0); bind_node_visitor = binder::BindNodeVisitor(txn, DEFAULT_DB_NAME); bind_node_visitor.BindNameToNode(parse_tree); LOG_INFO("Binding parse tree completed!"); LOG_INFO("Building plan tree..."); statement->SetPlanTree(optimizer->BuildPelotonPlanTree(delete_stmt, txn)); LOG_INFO("Building plan tree completed!\n%s", planner::PlanUtil::GetInfo(statement->GetPlanTree().get()).c_str()); LOG_INFO("Executing plan..."); result_format = std::vector<int>(0, 0); TestingSQLUtil::counter_.store(1); status = traffic_cop.ExecuteHelper(statement->GetPlanTree(), params, result, result_format); if (traffic_cop.GetQueuing()) { TestingSQLUtil::ContinueAfterComplete(); traffic_cop.ExecuteStatementPlanGetResult(); status = traffic_cop.p_status_; traffic_cop.SetQueuing(false); } LOG_INFO("Statement executed. Result: %s", ResultTypeToString(status.m_result).c_str()); LOG_INFO("Tuple deleted!"); traffic_cop.CommitQueryHelper(); ShowTable(DEFAULT_DB_NAME, "department_table"); LOG_INFO("%s", table->GetInfo().c_str()); // free the database just created txn = txn_manager.BeginTransaction(); catalog::Catalog::GetInstance()->DropDatabaseWithName(DEFAULT_DB_NAME, txn); txn_manager.CommitTransaction(txn); }