| 419 | } |
| 420 | |
| 421 | void SQLSDKQueryTest::RequestExecuteSQL(hybridse::sqlcase::SqlCase& sql_case, // NOLINT |
| 422 | std::shared_ptr<SQLRouter> router, bool has_batch_request, bool is_procedure, |
| 423 | bool is_asyn) { |
| 424 | hybridse::sdk::Status status; |
| 425 | // execute SQL |
| 426 | std::string sql = sql_case.sql_str(); |
| 427 | for (size_t i = 0; i < sql_case.inputs().size(); i++) { |
| 428 | std::string placeholder = "{" + std::to_string(i) + "}"; |
| 429 | boost::replace_all(sql, placeholder, sql_case.inputs()[i].name_); |
| 430 | } |
| 431 | boost::replace_all(sql, "{auto}", hybridse::sqlcase::SqlCase::GenRand("auto_t")); |
| 432 | LOG(INFO) << sql; |
| 433 | std::string lower_sql = sql; |
| 434 | boost::to_lower(lower_sql); |
| 435 | if (boost::algorithm::starts_with(lower_sql, "select")) { |
| 436 | LOG(INFO) << "GetRequestRow start"; |
| 437 | auto request_row = router->GetRequestRow(sql_case.db(), sql, &status); |
| 438 | LOG(INFO) << "GetRequestRow done"; |
| 439 | // success check |
| 440 | LOG(INFO) << "sql case success check: required success " << (sql_case.expect().success_ ? "true" : "false"); |
| 441 | if (!sql_case.expect().success_) { |
| 442 | if ((request_row)) { |
| 443 | FAIL() << "sql case expect success == false"; |
| 444 | } |
| 445 | LOG(INFO) << "sql case success false check done!"; |
| 446 | return; |
| 447 | } |
| 448 | if (!request_row) { |
| 449 | FAIL() << "sql case expect success == true"; |
| 450 | } |
| 451 | |
| 452 | hybridse::type::TableDef insert_table; |
| 453 | std::vector<hybridse::codec::Row> insert_rows; |
| 454 | std::vector<std::string> inserts; |
| 455 | if (!has_batch_request) { |
| 456 | ASSERT_TRUE(sql_case.ExtractInputTableDef(insert_table, 0)); |
| 457 | ASSERT_TRUE(sql_case.ExtractInputData(insert_rows, 0)); |
| 458 | sql_case.BuildInsertSqlListFromInput(0, &inserts); |
| 459 | } else { |
| 460 | ASSERT_TRUE(sql_case.ExtractInputTableDef(sql_case.batch_request_, insert_table)); |
| 461 | ASSERT_TRUE(sql_case.ExtractInputData(sql_case.batch_request_, insert_rows)); |
| 462 | } |
| 463 | CheckSchema(insert_table.columns(), *(request_row->GetSchema().get())); |
| 464 | LOG(INFO) << "Request Row:\n"; |
| 465 | PrintRows(insert_table.columns(), insert_rows); |
| 466 | |
| 467 | hybridse::codec::RowView row_view(insert_table.columns()); |
| 468 | std::vector<std::shared_ptr<hybridse::sdk::ResultSet>> results; |
| 469 | LOG(INFO) << "Request execute sql start!"; |
| 470 | for (size_t i = 0; i < insert_rows.size(); i++) { |
| 471 | row_view.Reset(insert_rows[i].buf()); |
| 472 | CovertHybridSERowToRequestRow(&row_view, request_row); |
| 473 | std::shared_ptr<hybridse::sdk::ResultSet> rs; |
| 474 | if (is_procedure) { |
| 475 | if (is_asyn) { |
| 476 | LOG(INFO) << "-------asyn procedure----------"; |
| 477 | auto future = router->CallProcedure(sql_case.db(), sql_case.sp_name_, 1000, request_row, &status); |
| 478 | if (!future || status.code != 0) FAIL() << "sql case expect success == true"; |
nothing calls this directly
no test coverage detected