[CP] [to #54388714] fix anonymous in arguments resolve & udf expr location & symbol compare with new interface

This commit is contained in:
obdev 2024-04-22 06:46:11 +00:00 committed by ob-robot
parent 772c61d04b
commit 057b8cf550
6 changed files with 27 additions and 10 deletions

View File

@ -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 {

View File

@ -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<ObUDFRawExpr *>(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<ObUDFRawExpr *>(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));
}

View File

@ -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,

View File

@ -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.

View File

@ -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;

View File

@ -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);