diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.cpp b/src/sql/resolver/ddl/ob_ddl_resolver.cpp index c0bf7024e0..19d9ebc79c 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.cpp +++ b/src/sql/resolver/ddl/ob_ddl_resolver.cpp @@ -5925,34 +5925,38 @@ int ObDDLResolver::add_udt_default_dependency(ObRawExpr *expr, { int ret = OB_SUCCESS; if (OB_ISNULL(expr)) { - } else if (OB_ISNULL(schema_checker)) { + } else if (OB_ISNULL(schema_checker) || OB_ISNULL(schema_checker->get_schema_guard())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("need schema checker to validate udt dependency", K(ret)); } else { bool need_dependency = false; ObSchemaObjVersion obj_version; + ObArray obj_versions; if (expr->get_expr_type() == T_FUN_PL_OBJECT_CONSTRUCT) { ObObjectConstructRawExpr *obj_cons_expr = static_cast(expr); // refer to ObDMLResolver::resolve_external_name need_dependency = obj_cons_expr->need_add_dependency(); if (need_dependency) { - ret = obj_cons_expr->get_schema_object_version(obj_version); + OZ(obj_cons_expr->get_schema_object_version(obj_version)); + OZ(obj_versions.push_back(obj_version)); } } else if (expr->get_expr_type() == T_FUN_PL_COLLECTION_CONSTRUCT) { ObCollectionConstructRawExpr *obj_coll_expr = static_cast(expr); need_dependency = obj_coll_expr->need_add_dependency(); if (need_dependency) { - ret = obj_coll_expr->get_schema_object_version(obj_version); + OZ(obj_coll_expr->get_schema_object_version(obj_version)); + OZ(obj_versions.push_back(obj_version)); } } else if (expr->is_udf_expr()) { ObUDFRawExpr *udf_expr = static_cast(expr); need_dependency = udf_expr->need_add_dependency(); if (need_dependency) { - ret = udf_expr->get_schema_object_version(obj_version); + OZ(udf_expr->get_schema_object_version(*schema_checker->get_schema_guard(), obj_versions)); } } - if (need_dependency && OB_SUCC(ret)) { + for (int64_t i = 0; need_dependency && OB_SUCC(ret) && i < obj_versions.count(); ++i) { + obj_version = obj_versions.at(i); uint64_t object_id = obj_version.get_object_id(); uint64_t tenant_id = pl::get_tenant_id_by_object_id(object_id); ObSchemaType schema_type = obj_version.get_schema_type(); diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 91a598e3a3..1fb575c71b 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -4745,9 +4745,13 @@ int ObDMLResolver::resolve_function_table_item(const ParseNode &parse_tree, } else if (udf->need_add_dependency()) { uint64_t dep_obj_id = view_ref_id_; uint64_t dep_db_id = database_id; - OZ (udf->get_schema_object_version(table_version)); - OZ (stmt->add_global_dependency_table(table_version)); - OZ (stmt->add_ref_obj_version(dep_obj_id, dep_db_id, ObObjectType::VIEW, table_version, *allocator_)); + ObArray vers; + OZ (udf->get_schema_object_version(*schema_guard, vers)); + for (int64_t i = 0; OB_SUCC(ret) && i < vers.count(); ++i) { + table_version = vers.at(i); + OZ (stmt->add_global_dependency_table(table_version)); + OZ (stmt->add_ref_obj_version(dep_obj_id, dep_db_id, ObObjectType::VIEW, table_version, *allocator_)); + } } OX (stmt_->get_query_ctx()->disable_udf_parallel_ |= !udf->is_parallel_enable()); } else if (OB_SUCC(ret) && function_table_expr->is_sys_func_expr()) { @@ -11283,9 +11287,12 @@ int ObDMLResolver::collect_schema_version(ObRawExpr *expr) if (OB_SUCC(ret) && udf_expr->need_add_dependency()) { uint64_t dep_obj_id = view_ref_id_; uint64_t dep_db_id = database_id; - OZ (udf_expr->get_schema_object_version(udf_version)); - OZ (stmt->add_global_dependency_table(udf_version)); - OZ (stmt->add_ref_obj_version(dep_obj_id, dep_db_id, ObObjectType::VIEW, udf_version, *allocator_)); + ObArray vers; + OZ (udf_expr->get_schema_object_version(*schema_guard, vers)); + for (int64_t i = 0; OB_SUCC(ret) && i < vers.count(); ++i) { + OZ (stmt->add_global_dependency_table(vers.at(i))); + OZ (stmt->add_ref_obj_version(dep_obj_id, dep_db_id, ObObjectType::VIEW, vers.at(i), *allocator_)); + } //for udf without params, we just set called_in_sql = true, //if this expr go through pl :: build_raw_expr later, //the flag will change to false; diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index 366a729413..a91b5fffe1 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -4930,9 +4930,11 @@ bool ObUDFRawExpr::inner_same_as(const ObRawExpr &expr, return bool_ret; } -int ObUDFRawExpr::get_schema_object_version(share::schema::ObSchemaObjVersion &obj_version) +int ObUDFRawExpr::get_schema_object_version(share::schema::ObSchemaGetterGuard &schema_guard, + ObIArray &obj_versions) { int ret = OB_SUCCESS; + share::schema::ObSchemaObjVersion obj_version; /*! * schema_version will be set when call ObRawExprUtils::resolve_udf_common_info * @@ -4967,6 +4969,27 @@ int ObUDFRawExpr::get_schema_object_version(share::schema::ObSchemaObjVersion &o CK (udf_schema_version_ == OB_INVALID_VERSION && pkg_schema_version_ == OB_INVALID_VERSION); // do nothing ... } + if (OB_FAIL(ret)) { + } else if (common::OB_INVALID_ID != pkg_id_ && !is_udt_udf_) { + const ObPackageInfo *spec_info = NULL; + const ObPackageInfo *body_info = NULL; + ObSchemaObjVersion ver; + OZ (pl::ObPLPackageManager::get_package_schema_info(schema_guard, pkg_id_, spec_info, body_info)); + if (OB_NOT_NULL(spec_info)) { + OX (ver.object_id_ = spec_info->get_package_id()); + OX (ver.version_ = spec_info->get_schema_version()); + OX (ver.object_type_ = DEPENDENCY_PACKAGE); + OZ (obj_versions.push_back(ver)); + } + if (OB_NOT_NULL(body_info)) { + OX (ver.object_id_ = body_info->get_package_id()); + OX (ver.version_ = body_info->get_schema_version()); + OX (ver.object_type_ = DEPENDENCY_PACKAGE_BODY); + OZ (obj_versions.push_back(ver)); + } + } else { + OZ (obj_versions.push_back(obj_version)); + } return ret; } diff --git a/src/sql/resolver/expr/ob_raw_expr.h b/src/sql/resolver/expr/ob_raw_expr.h index 054e2f8cd5..4b90ca3476 100644 --- a/src/sql/resolver/expr/ob_raw_expr.h +++ b/src/sql/resolver/expr/ob_raw_expr.h @@ -3975,7 +3975,8 @@ public: || pkg_schema_version_ != common::OB_INVALID_VERSION; } - int get_schema_object_version(share::schema::ObSchemaObjVersion &obj_version); + int get_schema_object_version(share::schema::ObSchemaGetterGuard &schema_guard, + ObIArray &obj_versions); inline void set_pkg_body_udf(bool v) { is_pkg_body_udf_ = v; } inline bool is_pkg_body_udf() const { return is_pkg_body_udf_; } diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index 4e54504011..e97799c1a3 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -3773,9 +3773,11 @@ int ObTransformPreProcess::calc_policy_function(ObDMLStmt &stmt, policy_expr = udf_expr; } if (OB_SUCC(ret) && udf_expr->need_add_dependency()) { - ObSchemaObjVersion udf_version; - OZ (udf_expr->get_schema_object_version(udf_version)); - OZ (stmt.add_global_dependency_table(udf_version)); + ObArray vers; + OZ (udf_expr->get_schema_object_version(*schema_checker->get_schema_guard(), vers)); + for (int64_t i = 0; OB_SUCC(ret) && i < vers.count(); ++i) { + OZ (stmt.add_global_dependency_table(vers.at(i))); + } } } return ret;