From 71dcb986375ad1c461942fbd80cbf4ae2944b25f Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 9 Aug 2023 13:18:37 +0000 Subject: [PATCH] [CP] [to #50575701] fix resolve current of cursor --- src/sql/resolver/dml/ob_dml_resolver.cpp | 11 +++++++---- src/sql/resolver/ob_resolver_define.h | 3 ++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 1e7f776d0c..f59297dc63 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -2756,10 +2756,11 @@ int ObDMLResolver::resolve_qualified_identifier(ObQualifiedName &q_name, if (OB_SUCC(ret)) { if (lib::is_oracle_mode() && NULL != params_.secondary_namespace_ - && get_basic_stmt()->is_insert_stmt() - && !static_cast(get_basic_stmt())->value_from_select() + && ((get_basic_stmt()->is_insert_stmt() + && !static_cast(get_basic_stmt())->value_from_select()) + || T_CURRENT_OF_SCOPE == current_scope_) && T_FIELD_LIST_SCOPE != current_scope_) { - //oracle模式insert语句的values子句,标识符优先解释为变量 + //In Oracle Mode, current of ident, insert values(ident), ident should explain to pl/sql variable if (!q_name.access_idents_.empty()) { //q_name.access_idents_为NULL肯定是列 if (OB_FAIL(resolve_external_name(q_name, columns, real_exprs, real_ref_expr))) { LOG_WARN_IGNORE_COL_NOTFOUND(ret, "resolve external symbol failed", K(ret), K(q_name)); @@ -2770,7 +2771,8 @@ int ObDMLResolver::resolve_qualified_identifier(ObQualifiedName &q_name, LOG_USER_ERROR(OB_NOT_SUPPORTED, "dml with collection or record construction function is"); } else if (ObExtendType == real_ref_expr->get_result_type().get_type() && T_FUN_PL_SQLCODE_SQLERRM != real_ref_expr->get_expr_type() && - (!ob_is_xml_pl_type(real_ref_expr->get_data_type(), real_ref_expr->get_udt_id()))) { + (!ob_is_xml_pl_type(real_ref_expr->get_data_type(), real_ref_expr->get_udt_id())) && + current_scope_ != T_CURRENT_OF_SCOPE) { bool is_support = false; const ObUserDefinedType *user_type = NULL; uint64_t udt_id = real_ref_expr->get_result_type().get_udt_id(); @@ -5894,6 +5896,7 @@ int ObDMLResolver::resolve_current_of(const ParseNode &node, int ret = OB_SUCCESS; ObRawExpr *cursor_expr = NULL; ObRawExpr *equal_expr = NULL; + current_scope_ = T_CURRENT_OF_SCOPE; if (OB_ISNULL(params_.secondary_namespace_)) { // secondary_namespace_ 为空, 说明不是在PL中 ret = OB_UNIMPLEMENTED_FEATURE; diff --git a/src/sql/resolver/ob_resolver_define.h b/src/sql/resolver/ob_resolver_define.h index 1d5c1558c6..555357a05c 100644 --- a/src/sql/resolver/ob_resolver_define.h +++ b/src/sql/resolver/ob_resolver_define.h @@ -63,7 +63,8 @@ enum ObStmtScope T_NAMED_WINDOWS_SCOPE, T_PL_SCOPE, T_LOAD_DATA_SCOPE, - T_DBLINK_SCOPE + T_DBLINK_SCOPE, + T_CURRENT_OF_SCOPE }; inline const char *get_scope_name(const ObStmtScope &scope)