diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 765a68de15..70639e761e 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -1581,6 +1581,7 @@ int ObDMLResolver::resolve_sql_expr(const ParseNode &node, ObRawExpr *&expr, ctx.is_for_pivot_ = !need_analyze_aggr; ctx.is_for_dynamic_sql_ = params_.is_dynamic_sql_; ctx.is_for_dbms_sql_ = params_.is_dbms_sql_; + ctx.view_ref_id_ = view_ref_id_; ObRawExprResolverImpl expr_resolver(ctx); ObIArray &user_var_exprs = get_stmt()->get_user_vars(); bool is_multi_stmt = session_info_->get_cur_exec_ctx() != NULL && diff --git a/src/sql/resolver/expr/ob_raw_expr.h b/src/sql/resolver/expr/ob_raw_expr.h index a9817a05c9..51bfa78416 100644 --- a/src/sql/resolver/expr/ob_raw_expr.h +++ b/src/sql/resolver/expr/ob_raw_expr.h @@ -1558,7 +1558,8 @@ struct ObResolveContext is_for_pivot_(false), is_for_dynamic_sql_(false), is_for_dbms_sql_(false), - tg_timing_event_(TG_TIMING_EVENT_INVALID) + tg_timing_event_(TG_TIMING_EVENT_INVALID), + view_ref_id_(OB_INVALID_ID) { } @@ -1602,6 +1603,7 @@ struct ObResolveContext bool is_for_dynamic_sql_; bool is_for_dbms_sql_; TgTimingEvent tg_timing_event_; // for msyql trigger + uint64_t view_ref_id_; }; typedef ObResolveContext ObExprResolveContext; diff --git a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp index 29c88a3b45..6272b9c632 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -372,6 +372,32 @@ int ObRawExprResolverImpl::do_recursive_resolve(const ParseNode *node, ObRawExpr c_expr->set_udt_id(udt_id); } } + + if (OB_SUCC(ret) && NULL != ctx_.stmt_) { + ObStmt *stmt = ctx_.stmt_; + uint64_t tenant_id = pl::get_tenant_id_by_object_id(udt_id); + const ObUDTTypeInfo *udt_info = NULL; + if (OB_FAIL(ctx_.schema_checker_->get_udt_info(tenant_id, udt_id, udt_info))) { + LOG_WARN("failed to get udt info", K(ret)); + } else if (OB_ISNULL(udt_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get null udt info", K(ret)); + } else if (udt_info->get_schema_version() != common::OB_INVALID_VERSION) { + ObSchemaObjVersion udt_schema_version; + udt_schema_version.object_id_ = udt_id; + udt_schema_version.object_type_ = share::schema::DEPENDENCY_TYPE; + udt_schema_version.version_ = udt_info->get_schema_version(); + uint64_t dep_obj_id = ctx_.view_ref_id_; + if (OB_FAIL(stmt->add_global_dependency_table(udt_schema_version))) { + LOG_WARN("failed to add global dependency", K(ret)); + } else if (stmt->add_ref_obj_version(dep_obj_id, db_id, + ObObjectType::VIEW, + udt_schema_version, + ctx_.expr_factory_.get_allocator())) { + LOG_WARN("failed to add ref obj version", K(ret)); + } + } + } } } } diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index f5b96f3a63..ab3e6be76d 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -8614,7 +8614,8 @@ int ObTransformPreProcess::transform_cast_multiset_for_stmt(ObDMLStmt *&stmt, } else if (OB_ISNULL(expr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("expr is NULL", K(ret)); - } else if (OB_FAIL(transform_cast_multiset_for_expr(expr, + } else if (OB_FAIL(transform_cast_multiset_for_expr(*stmt, + expr, is_happened))) { LOG_WARN("transform expr failed", K(ret)); } else if (OB_FAIL(relation_exprs.at(i).set(expr))) { @@ -8632,7 +8633,8 @@ int ObTransformPreProcess::transform_cast_multiset_for_stmt(ObDMLStmt *&stmt, return ret; } -int ObTransformPreProcess::transform_cast_multiset_for_expr(ObRawExpr *&expr, +int ObTransformPreProcess::transform_cast_multiset_for_expr(ObDMLStmt &stmt, + ObRawExpr *&expr, bool &trans_happened) { int ret = OB_SUCCESS; @@ -8676,7 +8678,8 @@ int ObTransformPreProcess::transform_cast_multiset_for_expr(ObRawExpr *&expr, // create type tbl1 as table of obj1; // cast(multiset(select '1.1','2.2' from dual) as tbl1) // =>cast(multiset(select obj1('1.1','2.2') from dual) as tbl1) - if (OB_FAIL(add_constructor_to_multiset(subquery_expr, + if (OB_FAIL(add_constructor_to_multiset(stmt, + subquery_expr, coll_type->get_element_type(), trans_happened))) { LOG_WARN("failed to add constuctor to multiset", K(ret)); @@ -8693,14 +8696,16 @@ int ObTransformPreProcess::transform_cast_multiset_for_expr(ObRawExpr *&expr, } } else { for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); ++i) { - OZ (SMART_CALL(transform_cast_multiset_for_expr(expr->get_param_expr(i), + OZ (SMART_CALL(transform_cast_multiset_for_expr(stmt, + expr->get_param_expr(i), trans_happened))); } } return ret; } -int ObTransformPreProcess::add_constructor_to_multiset(ObQueryRefRawExpr *multiset_expr, +int ObTransformPreProcess::add_constructor_to_multiset(ObDMLStmt &stmt, + ObQueryRefRawExpr *multiset_expr, const pl::ObPLDataType &elem_type, bool& trans_happened) { @@ -8806,6 +8811,16 @@ int ObTransformPreProcess::add_constructor_to_multiset(ObQueryRefRawExpr *multis object_expr->set_udt_id(object_type->get_user_type_id()); object_expr->set_result_type(res_type); object_expr->set_func_name(object_type->get_name()); + object_expr->set_coll_schema_version(elem_info->get_schema_version()); + // Add udt info to dependency + if (object_expr->need_add_dependency()) { + ObSchemaObjVersion udt_schema_version; + if (OB_FAIL(object_expr->get_schema_object_version(udt_schema_version))) { + LOG_WARN("failed to get schema version", K(ret)); + } else if (OB_FAIL(stmt.add_global_dependency_table(udt_schema_version))) { + LOG_WARN("failed to add dependency", K(ret)); + } + } } for (int64_t i = 0; OB_SUCC(ret) && i < object_type->get_member_count(); ++i) { diff --git a/src/sql/rewrite/ob_transform_pre_process.h b/src/sql/rewrite/ob_transform_pre_process.h index 5c66873d0e..c607cab5ce 100644 --- a/src/sql/rewrite/ob_transform_pre_process.h +++ b/src/sql/rewrite/ob_transform_pre_process.h @@ -586,8 +586,9 @@ struct DistinctObjMeta ObIArray &column_ref_remove_const_exprs); int transform_cast_multiset_for_stmt(ObDMLStmt *&stmt, bool &is_happened); - int transform_cast_multiset_for_expr(ObRawExpr *&expr, bool &trans_happened); - int add_constructor_to_multiset(ObQueryRefRawExpr *multiset_expr, + int transform_cast_multiset_for_expr(ObDMLStmt &stmt, ObRawExpr *&expr, bool &trans_happened); + int add_constructor_to_multiset(ObDMLStmt &stmt, + ObQueryRefRawExpr *multiset_expr, const pl::ObPLDataType &elem_type, bool& trans_happened); int add_column_conv_to_multiset(ObQueryRefRawExpr *multiset_expr,