From 057b8cf550e72f95107dc09936d849aa84ba7e08 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 22 Apr 2024 06:46:11 +0000 Subject: [PATCH] [CP] [to #54388714] fix anonymous in arguments resolve & udf expr location & symbol compare with new interface --- src/pl/ob_pl_compile.cpp | 3 ++- src/pl/ob_pl_resolver.cpp | 23 +++++++++++++++---- src/pl/ob_pl_resolver.h | 1 + src/pl/ob_pl_stmt.cpp | 2 +- src/pl/ob_pl_user_type.cpp | 6 ++--- .../ddl/ob_create_package_resolver.cpp | 2 +- 6 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/pl/ob_pl_compile.cpp b/src/pl/ob_pl_compile.cpp index 35b6c0c27..0d6359244 100644 --- a/src/pl/ob_pl_compile.cpp +++ b/src/pl/ob_pl_compile.cpp @@ -252,7 +252,8 @@ int ObPLCompiler::compile( } else if (!symbol->is_readonly()) { OZ (func.add_out_arg(i)); if (OB_SUCC(ret) - && 0 == symbol->get_name().case_compare(ObPLResolver::ANONYMOUS_INOUT_ARG)) { + && (0 == symbol->get_name().case_compare(ObPLResolver::ANONYMOUS_INOUT_ARG) + || 0 == symbol->get_name().case_compare(ObPLResolver::ANONYMOUS_SQL_ARG))) { OZ (func.add_in_arg(i)); } } else { diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 813bae80c..54b9318f4 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -9709,6 +9709,22 @@ int ObPLResolver::analyze_expr_type(ObRawExpr *&expr, return ret; } +int ObPLResolver::set_udf_expr_line_number(ObRawExpr *expr, uint64_t line_number) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(expr)) { + if (expr->is_udf_expr()) { + ObUDFRawExpr *udf_expr = static_cast(expr); + udf_expr->set_loc(line_number); + } else { + for (int64_t i = 0; i < expr->get_children_count(); ++i) { + OZ (SMART_CALL(set_udf_expr_line_number(expr->get_param_expr(i), line_number))); + } + } + } + return ret; +} + int ObPLResolver::resolve_expr(const ParseNode *node, ObPLCompileUnitAST &unit_ast, ObRawExpr *&expr, @@ -9763,11 +9779,10 @@ int ObPLResolver::resolve_expr(const ParseNode *node, if (OB_SUCC(ret) && lib::is_oracle_mode()) { OZ (add_pl_integer_checker_expr(expr_factory_, expr, need_replace)); } - if (OB_SUCC(ret) && expr->is_udf_expr()) { - ObUDFRawExpr *udf_expr = static_cast(expr); - udf_expr->set_loc(line_number); + if (OB_SUCC(ret)) { + OZ (set_udf_expr_line_number(expr, line_number)); } - if (is_mysql_mode()) { + if (OB_SUCC(ret) && is_mysql_mode()) { ObRawExprWrapEnumSet enum_set_wrapper(expr_factory_, &resolve_ctx_.session_info_); OZ (enum_set_wrapper.analyze_expr(expr)); } diff --git a/src/pl/ob_pl_resolver.h b/src/pl/ob_pl_resolver.h index 1fcee1b04..84a0e6dee 100644 --- a/src/pl/ob_pl_resolver.h +++ b/src/pl/ob_pl_resolver.h @@ -748,6 +748,7 @@ private: int set_cm_warn_on_fail(ObRawExpr *&expr); int analyze_expr_type(ObRawExpr *&expr, ObPLCompileUnitAST &unit_ast); + int set_udf_expr_line_number(ObRawExpr *expr, uint64_t line_number); int resolve_expr(const ParseNode *node, ObPLCompileUnitAST &unit_ast, sql::ObRawExpr *&expr, uint64_t line_number = 0, /* where this expr called */ bool need_add = true, const ObPLDataType *expected_type = NULL, diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index e53fbbc95..6b1acdd5e 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -2762,7 +2762,7 @@ int ObPLBlockNS::resolve_symbol(const ObString &var_name, const ObPLRoutineInfo *routine = NULL; OZ (get_routine_info(routines.at(i), routine)); CK (OB_NOT_NULL(routine)); - if (OB_SUCC(ret) && 0 == routine->get_routine_name().case_compare(var_name)) { + if (OB_SUCC(ret) && ObCharset::case_compat_mode_equal(routine->get_routine_name(), var_name)) { if (get_block_type() != BLOCK_ROUTINE // subprogram is not member function, distingish with block type && routine->is_udt_routine() && !routine->is_udt_cons() && !routine->is_udt_static_routine()) { // only care about member routine without prefix. diff --git a/src/pl/ob_pl_user_type.cpp b/src/pl/ob_pl_user_type.cpp index 8953f6642..288ea0dd0 100644 --- a/src/pl/ob_pl_user_type.cpp +++ b/src/pl/ob_pl_user_type.cpp @@ -1128,7 +1128,7 @@ int ObRecordType::add_record_member(const ObRecordMember &record) LOG_ERROR("record member count is too many", K(record_members_.count())); } else { for (int64_t i = 0; OB_SUCC(ret) && i < record_members_.count(); ++i) { - if (common::ObCharset::case_insensitive_equal( + if (common::ObCharset::case_compat_mode_equal( record_members_.at(i).member_name_, record.member_name_)) { ret = OB_ENTRY_EXIST; LOG_WARN("dup record member found", K(ret), K(record.member_name_), K(i)); @@ -1154,7 +1154,7 @@ int ObRecordType::add_record_member(const ObString &record_name, LOG_WARN("record member with not null modifier must hava default value", K(ret)); } else { for (int64_t i = 0; OB_SUCC(ret) && i < record_members_.count(); ++i) { - if (common::ObCharset::case_insensitive_equal( + if (common::ObCharset::case_compat_mode_equal( record_members_.at(i).member_name_, record_name)) { ret = OB_ENTRY_EXIST; LOG_WARN("dup record member found", K(ret), K(record_name), K(i)); @@ -1192,7 +1192,7 @@ int64_t ObRecordType::get_record_member_index(const ObString &record_name) const { int64_t index = OB_INVALID_INDEX; for (int64_t i = 0; i < record_members_.count(); ++i) { - if (common::ObCharset::case_insensitive_equal( + if (common::ObCharset::case_compat_mode_equal( record_members_.at(i).member_name_, record_name)) { index = i; break; diff --git a/src/sql/resolver/ddl/ob_create_package_resolver.cpp b/src/sql/resolver/ddl/ob_create_package_resolver.cpp index 6b8ffbc9d..a6c92ffdf 100644 --- a/src/sql/resolver/ddl/ob_create_package_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_package_resolver.cpp @@ -459,7 +459,7 @@ int ObCreatePackageResolver::resolve_functions_spec(const ObPackageInfo &package routine_info.set_overload(NO_OVERLOAD_IDX); //no overload for (int64_t k = routine_list.count(); OB_SUCC(ret) && k>0; k--) { ObRoutineInfo &tmp_routine_info = routine_list.at(k-1); - if (ObCharset::case_insensitive_equal(routine_info.get_routine_name(), + if (ObCharset::case_compat_mode_equal(routine_info.get_routine_name(), tmp_routine_info.get_routine_name())) { if (NO_OVERLOAD_IDX == tmp_routine_info.get_overload()) { tmp_routine_info.set_overload(OVERLOAD_START_IDX);