TEST_F(InsertSQLTests, InsertIntoSelectColumn) { auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance(); auto txn = txn_manager.BeginTransaction(); catalog::Catalog::GetInstance()->CreateDatabase(txn, DEFAULT_DB_NAME); txn_manager.CommitTransaction(txn); CreateAndLoadTable6(); CreateAndLoadTable7(); std::vector<ResultValue> result; std::vector<FieldInfo> tuple_descriptor; std::string error_message; int rows_changed; std::unique_ptr<optimizer::AbstractOptimizer> optimizer( new optimizer::Optimizer()); // TEST CASE 1 std::string query_1("INSERT INTO test6 SELECT b,a,c FROM test7;"); txn = txn_manager.BeginTransaction(); auto plan = TestingSQLUtil::GeneratePlanWithOptimizer(optimizer, query_1, txn); txn_manager.CommitTransaction(txn); EXPECT_EQ(plan->GetPlanNodeType(), PlanNodeType::INSERT); TestingSQLUtil::ExecuteSQLQueryWithOptimizer(optimizer, query_1, result, tuple_descriptor, rows_changed, error_message); EXPECT_EQ(4, rows_changed); TestingSQLUtil::ExecuteSQLQueryWithOptimizer( optimizer, "SELECT * FROM test6 WHERE a=8", result, tuple_descriptor, rows_changed, error_message); EXPECT_EQ(3, result.size()); EXPECT_EQ("8", TestingSQLUtil::GetResultValueAsString(result, 0)); EXPECT_EQ("55", TestingSQLUtil::GetResultValueAsString(result, 1)); EXPECT_EQ("999", TestingSQLUtil::GetResultValueAsString(result, 2)); // TEST CASE 2 std::string query_2("INSERT INTO test7 SELECT * FROM test6 WHERE a=1;"); TestingSQLUtil::ExecuteSQLQueryWithOptimizer(optimizer, query_2, result, tuple_descriptor, rows_changed, error_message); EXPECT_EQ(1, rows_changed); TestingSQLUtil::ExecuteSQLQueryWithOptimizer( optimizer, "SELECT * FROM test7 WHERE a=1", result, tuple_descriptor, rows_changed, error_message); EXPECT_EQ(3, result.size()); EXPECT_EQ("1", TestingSQLUtil::GetResultValueAsString(result, 0)); EXPECT_EQ("22", TestingSQLUtil::GetResultValueAsString(result, 1)); EXPECT_EQ("333", TestingSQLUtil::GetResultValueAsString(result, 2)); // TEST CASE 3 std::string query_3("INSERT INTO test7 SELECT b,a,c FROM test6 WHERE a=2;"); TestingSQLUtil::ExecuteSQLQueryWithOptimizer(optimizer, query_3, result, tuple_descriptor, rows_changed, error_message); EXPECT_EQ(1, rows_changed); TestingSQLUtil::ExecuteSQLQueryWithOptimizer( optimizer, "SELECT * FROM test7 WHERE a=11", result, tuple_descriptor, rows_changed, error_message); EXPECT_EQ(3, result.size()); EXPECT_EQ("11", TestingSQLUtil::GetResultValueAsString(result, 0)); EXPECT_EQ("2", TestingSQLUtil::GetResultValueAsString(result, 1)); EXPECT_EQ("0", TestingSQLUtil::GetResultValueAsString(result, 2)); // free the database just created txn = txn_manager.BeginTransaction(); catalog::Catalog::GetInstance()->DropDatabaseWithName(txn, DEFAULT_DB_NAME); txn_manager.CommitTransaction(txn); }
int main(int argc, char** argv) { if ( argc < 2 ) { std::cerr << "Arg is missing" << std::endl; usage(); return EXIT_FAILURE; } /* * Dealing with settings */ m_settings settings; if ( argc > 2 ) { int c; while ((c = getopt (argc, argv, "h:u:p:d:s:f:")) != -1 ) { switch (c) { case 'h': settings.insert("hostname", optarg); break; case 'u': settings.insert("username", optarg); break; case 'p': settings.insert("password", optarg); break; case 'd': settings.insert("driver", optarg); break; case 's': settings.insert("database", optarg); break; case 'f': settings.insert("import_type", optarg); break; case '?': return EXIT_FAILURE; } } } else { QCoreApplication::setOrganizationName("nsrl_toolkit"); QCoreApplication::setApplicationName("rds_bench"); } if ( check_settings(settings) == false ) return EXIT_FAILURE; QSqlDatabase db; qint64 rows = 0; qint64 total_time = 0; // Create the db object if ( init_db(db, settings) == false ) return EXIT_FAILURE; QSqlQuery query_1(db); QSqlQuery query_2(db); db.transaction(); if ( db.driverName().compare("PGSQL") == 0 ) start_pgsql(rows, total_time, db, query_1, query_2); if ( db.driverName().compare("MYSQL") == 0 ) start_mysql(rows, total_time, db, query_1, query_2); db.rollback(); /* * Ending */ if ( rows > 0 ) { std::cout << "Elapsed time: " << total_time << " milliseconds (" << (float)total_time / 1000.0 << " seconds)" << std::endl; std::cout << "Processed lines: " << rows << std::endl; std::cout << "Speed: " << (float)rows / ((float)total_time / 1000.0 ) << " rows / second" << std::endl; } else { std::cout << "No line returned" << std::endl; } // Close and destroy the db object db.close(); QSqlDatabase::removeDatabase(settings.value("driver")); return EXIT_SUCCESS; }