diff --git a/src/share/schema/ob_schema_service_sql_impl.cpp b/src/share/schema/ob_schema_service_sql_impl.cpp index af8007b3d7..c4779df6a6 100644 --- a/src/share/schema/ob_schema_service_sql_impl.cpp +++ b/src/share/schema/ob_schema_service_sql_impl.cpp @@ -8463,6 +8463,7 @@ int ObSchemaServiceSQLImpl::fetch_link_table_info(uint64_t tenant_id, next_sql_req_level == 1 && (ObNCharType == column_schema.get_data_type() || ObNVarchar2Type == column_schema.get_data_type())) { if (DBLINK_DRV_OB == link_type && + sql::DblinkGetConnType::TEMP_CONN != conn_type && OB_FAIL(fetch_desc_table(dblink_id, link_type, database_name, diff --git a/src/sql/resolver/ddl/ob_drop_table_resolver.cpp b/src/sql/resolver/ddl/ob_drop_table_resolver.cpp index 2ca0ec6451..37727e2fc8 100644 --- a/src/sql/resolver/ddl/ob_drop_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_drop_table_resolver.cpp @@ -131,15 +131,22 @@ int ObDropTableResolver::resolve(const ParseNode &parse_tree) : parse_tree.children_[TABLE_LIST_NODE]->children_[i]; ObString dblink_name; bool has_reverse_link = false; + bool has_dblink_node = false; if (NULL == table_node) { ret = OB_ERR_UNEXPECTED; SQL_RESV_LOG(WARN, "table_node is null", K(ret)); - } else if (OB_FAIL(resolve_dblink_name(table_node, dblink_name, has_reverse_link))) { + } else if (OB_FAIL(resolve_dblink_name(table_node, dblink_name, has_reverse_link, has_dblink_node))) { SQL_RESV_LOG(WARN, "failed to resolv dblink name", K(ret)); - } else if (has_reverse_link || !dblink_name.empty()) { - ret = OB_ERR_DDL_ON_REMOTE_DATABASE; - SQL_RESV_LOG(WARN, "drop table on remote database by dblink.", K(ret)); - LOG_USER_ERROR(OB_ERR_DDL_ON_REMOTE_DATABASE); + } else if (has_dblink_node) { + if (has_reverse_link || !dblink_name.empty()) { + ret = OB_ERR_DDL_ON_REMOTE_DATABASE; + SQL_RESV_LOG(WARN, "drop table on remote database by dblink", K(ret)); + LOG_USER_ERROR(OB_ERR_DDL_ON_REMOTE_DATABASE); + } else { + ret = OB_ERR_DATABASE_LINK_EXPECTED; + SQL_RESV_LOG(WARN, "database link name expected", K(ret)); + LOG_USER_ERROR(OB_ERR_DATABASE_LINK_EXPECTED); + } } else { db_name.reset(); table_name.reset(); diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index b7ad48eb1b..eac056d014 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -7150,10 +7150,11 @@ int ObDMLResolver::resolve_table_relation_factor(const ParseNode *node, ObIArray &ref_obj_ids) { int ret = OB_SUCCESS; + bool has_dblink_node = false; if (OB_ISNULL(session_info_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("session info is NULL", K(ret)); - } else if (OB_FAIL(resolve_dblink_name(node, dblink_name, is_reverse_link))) { + } else if (OB_FAIL(resolve_dblink_name(node, dblink_name, is_reverse_link, has_dblink_node))) { LOG_WARN("resolve dblink name failed", K(ret)); } else { LOG_DEBUG("resolve dblink name", K(dblink_name), K(is_reverse_link)); diff --git a/src/sql/resolver/ob_stmt_resolver.cpp b/src/sql/resolver/ob_stmt_resolver.cpp index a42332680c..d7b9bcd534 100644 --- a/src/sql/resolver/ob_stmt_resolver.cpp +++ b/src/sql/resolver/ob_stmt_resolver.cpp @@ -170,13 +170,14 @@ int ObStmtResolver::resolve_table_relation_node_v2(const ParseNode *node, return ret; } -int ObStmtResolver::resolve_dblink_name(const ParseNode *table_node, ObString &dblink_name, bool &is_reverse_link) +int ObStmtResolver::resolve_dblink_name(const ParseNode *table_node, ObString &dblink_name, bool &is_reverse_link, bool &has_dblink_node) { int ret = OB_SUCCESS; dblink_name.reset(); if (!OB_ISNULL(table_node) && table_node->num_child_ > 2 && !OB_ISNULL(table_node->children_) && !OB_ISNULL(table_node->children_[2])) { const ParseNode *dblink_node = table_node->children_[2]; + has_dblink_node = true; if (2 == dblink_node->num_child_ && !OB_ISNULL(dblink_node->children_) && !OB_ISNULL(dblink_node->children_[0]) && !OB_ISNULL(dblink_node->children_[1])) { int32_t dblink_name_len = static_cast(dblink_node->children_[0]->str_len_); diff --git a/src/sql/resolver/ob_stmt_resolver.h b/src/sql/resolver/ob_stmt_resolver.h index 621c1fd678..0f02b6cc21 100644 --- a/src/sql/resolver/ob_stmt_resolver.h +++ b/src/sql/resolver/ob_stmt_resolver.h @@ -84,7 +84,7 @@ public: * */ static int resolve_ref_factor(const ParseNode *node, ObSQLSessionInfo *session_info, common::ObString &table_name, common::ObString &db_name); - static int resolve_dblink_name(const ParseNode *table_node, ObString &dblink_name, bool &is_reverse_link); + static int resolve_dblink_name(const ParseNode *table_node, ObString &dblink_name, bool &is_reverse_link, bool &has_dblink_node); int resolve_database_factor(const ParseNode *node, uint64_t tenant_id, uint64_t &database_id,