From b22956285d92b40421a56c64919f7c0b49d99075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AD=90=E6=81=92?= Date: Wed, 19 Jul 2023 17:03:45 +0800 Subject: [PATCH 1/3] create_table_like_hive_when_db_not_found_commit1 --- src/sdk/db_sdk.cc | 18 ++++++++++++++++++ src/sdk/db_sdk.h | 2 ++ src/sdk/sql_cluster_router.cc | 14 ++++++++++---- src/sdk/sql_cluster_test.cc | 10 ++++++++++ 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/sdk/db_sdk.cc b/src/sdk/db_sdk.cc index 6b78d4069ec..1850cf9c342 100644 --- a/src/sdk/db_sdk.cc +++ b/src/sdk/db_sdk.cc @@ -426,6 +426,24 @@ bool ClusterSDK::BuildCatalog() { return UpdateCatalog(table_datas, sp_datas); } +std::map> DBSDK::GetDbInfo(const std::string& db) { + std::lock_guard<::openmldb::base::SpinMutex> lock(mu_); + auto it = table_to_tablets_.find(db); + if (it == table_to_tablets_.end()) { + return {}; + } + auto db_info = it->second; + return db_info; +} + +std::vector DBSDK::GetAllDbs() { + std::vector all_dbs; + for (auto db_name_iter = table_to_tablets_.begin(); db_name_iter != table_to_tablets_.end(); db_name_iter++) { + all_dbs.push_back(db_name_iter->first); + } + return all_dbs; +} + uint32_t DBSDK::GetTableId(const std::string& db, const std::string& tname) { auto table_handler = GetCatalog()->GetTable(db, tname); auto* sdk_table_handler = dynamic_cast<::openmldb::catalog::SDKTableHandler*>(table_handler.get()); diff --git a/src/sdk/db_sdk.h b/src/sdk/db_sdk.h index 48bb1ea80ab..32f53f46d8b 100644 --- a/src/sdk/db_sdk.h +++ b/src/sdk/db_sdk.h @@ -77,6 +77,8 @@ class DBSDK { std::shared_ptr<::openmldb::client::TaskManagerClient> GetTaskManagerClient(); + std::map> GetDbInfo(const std::string& db); + std::vector GetAllDbs(); uint32_t GetTableId(const std::string& db, const std::string& tname); std::shared_ptr<::openmldb::nameserver::TableInfo> GetTableInfo(const std::string& db, const std::string& tname); std::vector> GetTables(const std::string& db); diff --git a/src/sdk/sql_cluster_router.cc b/src/sdk/sql_cluster_router.cc index 68fd1026cba..050bee5dd64 100644 --- a/src/sdk/sql_cluster_router.cc +++ b/src/sdk/sql_cluster_router.cc @@ -1941,11 +1941,12 @@ base::Status SQLClusterRouter::HandleSQLCreateTable(hybridse::node::CreatePlanNo return base::Status(base::ReturnCode::kSQLCmdRunError, "fail to execute plan : null pointer"); } - if (create_node->like_clause_ == nullptr) { - std::string db_name = create_node->GetDatabase().empty() ? db : create_node->GetDatabase(); - if (db_name.empty()) { - return base::Status(base::ReturnCode::kSQLCmdRunError, "ERROR: Please use database first"); + std::string db_name = create_node->GetDatabase().empty() ? db : create_node->GetDatabase(); + if (db_name.empty()) { + return base::Status(base::ReturnCode::kSQLCmdRunError, "ERROR: Please use database first"); } + + if (create_node->like_clause_ == nullptr) { ::openmldb::nameserver::TableInfo table_info; table_info.set_db(db_name); @@ -1966,6 +1967,11 @@ base::Status SQLClusterRouter::HandleSQLCreateTable(hybridse::node::CreatePlanNo return base::Status(base::ReturnCode::kSQLCmdRunError, msg); } } else { + auto db_info = cluster_sdk_->GetDbInfo(db_name); + if (db_info.empty()) { + return base::Status(base::ReturnCode::kSQLCmdRunError, "fail to create, database does not exist!"); + } + LOG(WARNING) << "CREATE TABLE LIKE will run in offline job, please wait."; std::map config; diff --git a/src/sdk/sql_cluster_test.cc b/src/sdk/sql_cluster_test.cc index b4251011bfa..9f15ef6ca0a 100644 --- a/src/sdk/sql_cluster_test.cc +++ b/src/sdk/sql_cluster_test.cc @@ -97,6 +97,16 @@ class SQLClusterDDLTest : public SQLClusterTest { std::shared_ptr router; std::string db; }; + +TEST_F(SQLClusterDDLTest, TestCreateTableLike) { + std::string db2 = "db" + GenRand(); + ::hybridse::sdk::Status status; + std::string ddl; + + ASSERT_FALSE(router->ExecuteDDL(db, "create table " + db2 + ".tb like hive 'hive://db.tb';", &status)); + ASSERT_FALSE(router->ExecuteDDL(db, "drop table " + db2 + ".tb;", &status)); +} + TEST_F(SQLClusterDDLTest, CreateTableWithDatabase) { std::string name = "test" + GenRand(); ::hybridse::sdk::Status status; From e888ce8e82a681d90196e4e64df2b51a0d9f8e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AD=90=E6=81=92?= Date: Wed, 19 Jul 2023 18:27:30 +0800 Subject: [PATCH 2/3] create_table_like_hive_when_db_not_found_commit2 --- src/sdk/db_sdk.cc | 10 ---------- src/sdk/db_sdk.h | 1 - src/sdk/sql_cluster_router.cc | 9 +++++---- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/sdk/db_sdk.cc b/src/sdk/db_sdk.cc index 1850cf9c342..41a5fa2728b 100644 --- a/src/sdk/db_sdk.cc +++ b/src/sdk/db_sdk.cc @@ -426,16 +426,6 @@ bool ClusterSDK::BuildCatalog() { return UpdateCatalog(table_datas, sp_datas); } -std::map> DBSDK::GetDbInfo(const std::string& db) { - std::lock_guard<::openmldb::base::SpinMutex> lock(mu_); - auto it = table_to_tablets_.find(db); - if (it == table_to_tablets_.end()) { - return {}; - } - auto db_info = it->second; - return db_info; -} - std::vector DBSDK::GetAllDbs() { std::vector all_dbs; for (auto db_name_iter = table_to_tablets_.begin(); db_name_iter != table_to_tablets_.end(); db_name_iter++) { diff --git a/src/sdk/db_sdk.h b/src/sdk/db_sdk.h index 32f53f46d8b..71e3e321241 100644 --- a/src/sdk/db_sdk.h +++ b/src/sdk/db_sdk.h @@ -77,7 +77,6 @@ class DBSDK { std::shared_ptr<::openmldb::client::TaskManagerClient> GetTaskManagerClient(); - std::map> GetDbInfo(const std::string& db); std::vector GetAllDbs(); uint32_t GetTableId(const std::string& db, const std::string& tname); std::shared_ptr<::openmldb::nameserver::TableInfo> GetTableInfo(const std::string& db, const std::string& tname); diff --git a/src/sdk/sql_cluster_router.cc b/src/sdk/sql_cluster_router.cc index 050bee5dd64..5bffca4e5bf 100644 --- a/src/sdk/sql_cluster_router.cc +++ b/src/sdk/sql_cluster_router.cc @@ -1967,10 +1967,11 @@ base::Status SQLClusterRouter::HandleSQLCreateTable(hybridse::node::CreatePlanNo return base::Status(base::ReturnCode::kSQLCmdRunError, msg); } } else { - auto db_info = cluster_sdk_->GetDbInfo(db_name); - if (db_info.empty()) { - return base::Status(base::ReturnCode::kSQLCmdRunError, "fail to create, database does not exist!"); - } + auto dbs = cluster_sdk_->GetAllDbs(); + auto it = std::find(dbs.begin(), dbs.end(), db_name); + if (it == dbs.end()) { + return base::Status(base::ReturnCode::kSQLCmdRunError, "fail to create, database does not exist!"); + } LOG(WARNING) << "CREATE TABLE LIKE will run in offline job, please wait."; From 6f192c24b5a89e6bf2939b87108b84dece8a1c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AD=90=E6=81=92?= Date: Thu, 20 Jul 2023 10:46:10 +0800 Subject: [PATCH 3/3] create_table_like_hive_when_db_not_found_commit4 --- src/sdk/db_sdk.cc | 1 + src/sdk/sql_cluster_test.cc | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/sdk/db_sdk.cc b/src/sdk/db_sdk.cc index 41a5fa2728b..c04e86d4f03 100644 --- a/src/sdk/db_sdk.cc +++ b/src/sdk/db_sdk.cc @@ -427,6 +427,7 @@ bool ClusterSDK::BuildCatalog() { } std::vector DBSDK::GetAllDbs() { + std::lock_guard<::openmldb::base::SpinMutex> lock(mu_); std::vector all_dbs; for (auto db_name_iter = table_to_tablets_.begin(); db_name_iter != table_to_tablets_.end(); db_name_iter++) { all_dbs.push_back(db_name_iter->first); diff --git a/src/sdk/sql_cluster_test.cc b/src/sdk/sql_cluster_test.cc index 19b3787c4e4..b7ef300fee1 100644 --- a/src/sdk/sql_cluster_test.cc +++ b/src/sdk/sql_cluster_test.cc @@ -99,12 +99,10 @@ class SQLClusterDDLTest : public SQLClusterTest { }; TEST_F(SQLClusterDDLTest, TestCreateTableLike) { - std::string db2 = "db" + GenRand(); ::hybridse::sdk::Status status; - std::string ddl; - ASSERT_FALSE(router->ExecuteDDL(db, "create table " + db2 + ".tb like hive 'hive://db.tb';", &status)); - ASSERT_FALSE(router->ExecuteDDL(db, "drop table " + db2 + ".tb;", &status)); + ASSERT_FALSE(router->ExecuteDDL(db, "create table db2.tb like hive 'hive://db.tb';", &status)); + ASSERT_FALSE(router->ExecuteDDL(db, "drop table db2.tb;", &status)); } TEST_F(SQLClusterDDLTest, TestIfExists) {