From a8d994c61e5080e10bc8d2cdf0e389a90247995c Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 18 Oct 2023 02:43:43 +0000 Subject: [PATCH] [CP] [to #44112459] fix serval pl/sql bugs --- src/pl/ob_pl_package.cpp | 14 ++++++++------ src/pl/ob_pl_resolver.cpp | 3 ++- src/pl/ob_pl_resolver.h | 2 +- src/pl/ob_pl_stmt.cpp | 16 +--------------- src/sql/ob_spi.cpp | 12 ++++++++++++ 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/pl/ob_pl_package.cpp b/src/pl/ob_pl_package.cpp index 294c25556..0540ffdaf 100644 --- a/src/pl/ob_pl_package.cpp +++ b/src/pl/ob_pl_package.cpp @@ -188,10 +188,6 @@ int ObPLPackage::instantiate_package_state(const ObPLResolveCtx &resolve_ctx, if (OB_ISNULL(var)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("var is null", K(ret), K(var), K(var_idx)); - } else if (var->is_dup_declare()) { - ret = OB_ERR_DECL_MORE_THAN_ONCE; - LOG_WARN("package var dup", K(ret), K(var_idx)); - LOG_USER_ERROR(OB_ERR_DECL_MORE_THAN_ONCE, var->get_name().length(), var->get_name().ptr()); } else { if (var_type.is_cursor_type() && OB_FAIL(resolve_ctx.session_info_.init_cursor_cache())) { @@ -306,8 +302,14 @@ int ObPLPackage::get_var(const ObString &var_name, const ObPLVar *&var, int64_t ObPLVar *tmp_var = var_table_.at(i); if (!tmp_var->is_formal_param() && ObCharset::case_insensitive_equal(var_name, tmp_var->get_name())) { - var = tmp_var; - var_idx = i; + if (tmp_var->is_dup_declare()) { + ret = OB_ERR_DECL_MORE_THAN_ONCE; + LOG_WARN("package var dup", K(ret), K(var_idx)); + LOG_USER_ERROR(OB_ERR_DECL_MORE_THAN_ONCE, tmp_var->get_name().length(), tmp_var->get_name().ptr()); + } else { + var = tmp_var; + var_idx = i; + } } } return ret; diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 6c9eae61d..c6ec9ffa4 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -11209,7 +11209,8 @@ int ObPLResolver::resolve_object_construct(const sql::ObQualifiedName &q_name, || OB_ERR_FUNCTION_UNKNOWN == ret || OB_ERR_SP_UNDECLARED_VAR == ret || OB_ERR_INVALID_TYPE_FOR_OP == ret - || OB_ERR_PACKAGE_DOSE_NOT_EXIST == ret) { + || OB_ERR_PACKAGE_DOSE_NOT_EXIST == ret + || OB_ERR_SP_DOES_NOT_EXIST == ret) { ret = OB_SUCCESS; pl_reset_warning_buffer(); OZ (resolve_record_construct(q_name, udf_info, user_type, expr)); diff --git a/src/pl/ob_pl_resolver.h b/src/pl/ob_pl_resolver.h index 1dffc29be..e995e0c1c 100644 --- a/src/pl/ob_pl_resolver.h +++ b/src/pl/ob_pl_resolver.h @@ -34,7 +34,7 @@ } while(0); #endif -#ifndef NDEBUG +#ifdef NDEBUG #ifndef SET_LOG_CHECK_MODE #define SET_LOG_CHECK_MODE() \ bool set_check_mode = false; \ diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index 3b32f92e0..e08706b0f 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -2028,21 +2028,7 @@ int ObPLExternalNS::resolve_external_type_by_name(const ObString &db_name, const ObSchemaChecker schema_checker; ObSynonymChecker synonym_checker; OZ (schema_checker.init(resolve_ctx_.schema_guard_, resolve_ctx_.session_info_.get_sessid())); - OZ (ObResolverUtils::resolve_synonym_object_recursively( - schema_checker, synonym_checker, - tenant_id, db_id, type_name, object_db_id, object_name, exist)); - if (OB_FAIL(ret)) { - } else if (exist) { - if (OB_FAIL(resolve_ctx_.schema_guard_.get_udt_info(tenant_id, object_db_id, - OB_INVALID_ID, object_name, - udt_info))) { - LOG_WARN("get udt info failed", K(ret)); - } - } else if (OB_FAIL(resolve_ctx_.schema_guard_.get_udt_info(tenant_id, db_id, - OB_INVALID_ID, type_name, - udt_info))) { - LOG_WARN("get udt info failed", K(ret)); - } + OZ (resolve_ctx_.schema_guard_.get_udt_info(tenant_id, db_id, OB_INVALID_ID, type_name, udt_info)); } if (OB_SUCC(ret) && (is_oracle_sys_user || OB_ISNULL(udt_info))) { // try system udt diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index d6db7c7cf..2769e2395 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -7020,6 +7020,18 @@ int ObSPIService::get_result(ObPLExecCtx *ctx, CK (OB_NOT_NULL(table = reinterpret_cast(result_address.get_ext()))); CK (OB_NOT_NULL(table)); OZ (bulk_tables.push_back(table)); +#ifdef OB_BUILD_ORACLE_PL + if (OB_SUCC(ret) && table->is_varray()) { + ObPLVArray *varray = static_cast(table); + bool append_mode = (NULL == implicit_cursor ? false : implicit_cursor->get_in_forall()); + int64_t new_count = append_mode ? table->get_count() + row_count : row_count; + CK (OB_NOT_NULL(varray)); + if (OB_SUCC(ret) && new_count > varray->get_capacity()) { + ret = OB_ERR_SUBSCRIPT_OUTSIDE_LIMIT; + LOG_WARN("Subscript outside of limit", K(ret), K(append_mode), K(new_count), KPC(varray)); + } + } +#endif } if (OB_SUCC(ret)) { for (int64_t i = 0; OB_SUCC(ret) && i < bulk_tables.count(); ++i) {