diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index d6c8af5db..d350b95c3 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -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() diff --git a/src/pl/ob_pl_resolver.h b/src/pl/ob_pl_resolver.h index abd99f34d..8f9e70668 100644 --- a/src/pl/ob_pl_resolver.h +++ b/src/pl/ob_pl_resolver.h @@ -627,6 +627,16 @@ public: static int replace_udf_param_expr(ObObjAccessIdent &access_ident, ObIArray &columns, ObIArray &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); diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index a74f888a9..1969333ad 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -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 { diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 4c9f75b38..a7c7434c2 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -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; } diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index c95541a2e..7847c88af 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -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));