[CP] [to #2024110600104964418] fix: filter some error codes not to be overwritten during resolving

This commit is contained in:
0xacc 2024-11-11 14:47:32 +00:00 committed by ob-robot
parent 1925f87dd7
commit f2302d9266
5 changed files with 40 additions and 11 deletions

View File

@ -14266,12 +14266,11 @@ int ObPLResolver::resolve_routine(ObObjAccessIdent &access_ident,
}
if (OB_FAIL(ret)
&& OB_ERR_UNEXPECTED != ret
&& OB_ERR_SP_WRONG_ARG_NUM != ret
&& OB_ERR_CALL_WRONG_ARG != ret
&& OB_ERR_FUNC_DUP != ret
&& OB_ERR_POSITIONAL_FOLLOW_NAME != ret
&& OB_ALLOCATE_MEMORY_FAILED != ret) {
&& !is_unrecoverable_error(ret)) {
// Not A Routine, try compostie access again.
if (access_idxs.count() > 0
&& (access_idxs.at(access_idxs.count() - 1)).elem_type_.is_composite_type()

View File

@ -627,6 +627,16 @@ public:
static int replace_udf_param_expr(ObObjAccessIdent &access_ident,
ObIArray<ObQualifiedName> &columns,
ObIArray<ObRawExpr*> &real_exprs);
static OB_INLINE bool is_unrecoverable_error(int ret)
{
return OB_ALLOCATE_MEMORY_FAILED == ret
|| OB_ERR_UNEXPECTED == ret
|| OB_EXCEED_QUERY_MEM_LIMIT == ret
|| OB_TIMEOUT == ret
|| OB_SIZE_OVERFLOW == ret;
}
private:
int resolve_declare_var(const ObStmtNodeTree *parse_tree, ObPLDeclareVarStmt *stmt, ObPLFunctionAST &func_ast);
int resolve_declare_var(const ObStmtNodeTree *parse_tree, ObPLPackageAST &package_ast);

View File

@ -1729,11 +1729,13 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name,
}
const ObRoutineInfo *routine_info = NULL;
OZ (schema_guard.get_standalone_procedure_info(tenant_id, db_id, name, routine_info));
if (NULL == routine_info) {
if (NULL == routine_info && !ObPLResolver::is_unrecoverable_error(ret)) {
ret = OB_SUCCESS;
OZ (schema_guard.get_standalone_function_info(tenant_id, db_id, name, routine_info));
}
if (NULL == routine_info) {
if (ObPLResolver::is_unrecoverable_error(ret)) {
// do nothing
} else if (NULL == routine_info) {
ret = OB_SUCCESS;
type = ObPLExternalNS::INVALID_VAR;
} else {

View File

@ -3225,7 +3225,9 @@ int ObDMLResolver::resolve_qualified_identifier(ObQualifiedName &q_name,
if (OB_ERR_BAD_FIELD_ERROR == ret) {
if (OB_FAIL(resolve_pseudo_column(q_name, real_ref_expr))) {
LOG_WARN_IGNORE_COL_NOTFOUND(ret, "resolve pseudo column failed", K(ret), K(q_name));
ret = OB_ERR_BAD_FIELD_ERROR;
if (!ObPLResolver::is_unrecoverable_error(ret)) {
ret = OB_ERR_BAD_FIELD_ERROR;
}
}
}
}
@ -3249,7 +3251,9 @@ int ObDMLResolver::resolve_qualified_identifier(ObQualifiedName &q_name,
if (OB_ERR_BAD_FIELD_ERROR == ret && !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));
ret = OB_ERR_BAD_FIELD_ERROR; // TODO: 单测test_resolver_select.test:465 select 1 as a from t1,t2 having c1=1; 失败
if (!ObPLResolver::is_unrecoverable_error(ret)) {
ret = OB_ERR_BAD_FIELD_ERROR; // TODO: 单测test_resolver_select.test:465 select 1 as a from t1,t2 having c1=1; 失败
}
} else {
is_external = true;
}

View File

@ -808,7 +808,10 @@ if ((OB_FAIL(ret) || 0 == routines.count()) \
} else if (OB_FAIL(schema_checker.get_package_id( // try user package now!
tenant_id, object_db_id, object_name, compatible_mode, package_id))
|| OB_INVALID_ID == package_id) {
if (OB_FAIL(schema_checker.get_udt_id( // try user type now!
if (ObPLResolver::is_unrecoverable_error(ret)) {
LOG_WARN("failed to get_package_id",
K(ret), K(tenant_id), K(object_db_id), K(object_name), K(compatible_mode), K(package_id));
} else if (OB_FAIL(schema_checker.get_udt_id( // try user type now!
tenant_id, object_db_id, OB_INVALID_ID, object_name, package_id))
|| OB_INVALID_ID == package_id) {
bool need_try_synonym = false;
@ -817,10 +820,16 @@ if ((OB_FAIL(ret) || 0 == routines.count()) \
if (OB_FAIL(schema_checker.get_package_id( // try synonym user package now!
tenant_id, object_db_id, object_name, compatible_mode, package_id))
|| OB_INVALID_ID == package_id) {
if ((is_sys_database_id(object_db_id)
if (ObPLResolver::is_unrecoverable_error(ret)) {
LOG_WARN("failed to get_package_id",
K(ret), K(tenant_id), K(object_db_id), K(object_name), K(compatible_mode), K(package_id));
} else if ((is_sys_database_id(object_db_id)
&& OB_FAIL(schema_checker.get_package_id(OB_SYS_TENANT_ID, object_db_id, object_name, compatible_mode, package_id)))
|| OB_INVALID_ID == package_id) {
if (OB_FAIL(schema_checker.get_udt_id( // try synonym user type now!
if (ObPLResolver::is_unrecoverable_error(ret)) {
LOG_WARN("failed to get_package_id",
K(ret), K(OB_SYS_TENANT_ID), K(object_db_id), K(object_name), K(compatible_mode), K(package_id));
} else if (OB_FAIL(schema_checker.get_udt_id( // try synonym user type now!
tenant_id, object_db_id, OB_INVALID_ID, object_name, package_id))
|| OB_INVALID_ID == package_id) {
LOG_WARN("failed to get package id", K(ret));
@ -847,13 +856,18 @@ if ((OB_FAIL(ret) || 0 == routines.count()) \
}
// try system package or udt
if (OB_FAIL(ret) || OB_INVALID_ID == package_id) {
if (lib::is_oracle_mode() && (db_name.empty()
if (ObPLResolver::is_unrecoverable_error(ret)) {
// do nothing
} else if (lib::is_oracle_mode() && (db_name.empty()
|| 0 == db_name.case_compare(OB_SYS_DATABASE_NAME)
|| 0 == db_name.case_compare(OB_ORA_SYS_SCHEMA_NAME))) {
if (OB_FAIL(schema_checker.get_package_id( // try system pacakge
OB_SYS_TENANT_ID, OB_SYS_DATABASE_NAME, object_name, compatible_mode, package_id))
|| OB_INVALID_ID == package_id) {
if (OB_FAIL(schema_checker.get_udt_id( // try system udt
if (ObPLResolver::is_unrecoverable_error(ret)) {
LOG_WARN("failed to get_package_id",
K(ret), K(OB_SYS_TENANT_ID), K(OB_SYS_DATABASE_NAME), K(object_name), K(compatible_mode), K(package_id));
} else if (OB_FAIL(schema_checker.get_udt_id( // try system udt
OB_SYS_TENANT_ID, OB_SYS_DATABASE_NAME, object_name, package_id))
|| OB_INVALID_ID == package_id) {
LOG_WARN("failed to get package id", K(ret));