diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 615139cb1b..9f05e13dbf 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -2780,7 +2780,12 @@ int ObPLResolver::resolve_extern_type_info(ObSchemaGetterGuard &guard, const uint64_t tenant_id = resolve_ctx_.session_info_.get_effective_tenant_id(); OZ (guard.get_table_schema(tenant_id, access_idxs.at(0).var_index_, table)); CK (OB_NOT_NULL(table)); - OX (extern_type_info->type_owner_ = table->get_database_id()); + if (OB_FAIL(ret)) { + } else if (ObCharset::case_compat_mode_equal(extern_type_info->type_subname_, table->get_table_name_str())) { + OX (extern_type_info->type_owner_ = table->get_database_id()); + } else { + OZ (resolve_ctx_.session_info_.get_database_id(extern_type_info->type_owner_)); + } } OZ (fill_schema_obj_version(guard, ObParamExternType::SP_EXTERN_TAB_COL, @@ -2816,7 +2821,7 @@ int ObPLResolver::resolve_extern_type_info(ObSchemaGetterGuard &guard, OX (package_id = access_idxs.at(0).var_index_); OX (type = access_idxs.at(0).access_type_); } else { - OZ(resolve_ctx_.session_info_.get_database_id(extern_type_info->type_owner_)); + OZ (resolve_ctx_.session_info_.get_database_id(extern_type_info->type_owner_)); OX (package_id = current_block_->get_namespace().get_package_id()); OX (type = ObObjAccessIdx::IS_PKG_NS); } @@ -2841,6 +2846,12 @@ int ObPLResolver::resolve_extern_type_info(ObSchemaGetterGuard &guard, OZ (guard.get_table_schema(tenant_id, access_idxs.at(0).var_index_, table)); CK (OB_NOT_NULL(table)); OX (extern_type_info->type_owner_ = table->get_database_id()); + if (OB_FAIL(ret)) { + } else if (ObCharset::case_compat_mode_equal(extern_type_info->type_name_, table->get_table_name_str())) { + OX (extern_type_info->type_owner_ = table->get_database_id()); + } else { + OZ (resolve_ctx_.session_info_.get_database_id(extern_type_info->type_owner_)); + } } OZ (fill_schema_obj_version(guard, ObParamExternType::SP_EXTERN_TAB, @@ -11479,6 +11490,7 @@ int ObPLResolver::resolve_object_construct(const sql::ObQualifiedName &q_name, OX (expr = udf_info.ref_expr_); // if cant find user define construtor, try default construct if ((OB_SUCCESS == ret && use_buildin_default_constructor) + || OB_ERR_CALL_WRONG_ARG == ret || OB_ERR_SP_WRONG_ARG_NUM == ret || OB_ERR_FUNCTION_UNKNOWN == ret || OB_ERR_SP_UNDECLARED_VAR == ret @@ -14069,6 +14081,11 @@ int ObPLResolver::resolve_construct(ObObjAccessIdent &access_ident, OZ (ns.get_pl_data_type_by_id(user_type_id, user_type)); CK (OB_NOT_NULL(user_type)); if (OB_FAIL(ret)) { + } else if (user_type->is_udt_type()) { + ObString database_name, udt_name; + OZ (get_udt_names(resolve_ctx_.schema_guard_, user_type_id, database_name, udt_name)); + OX (access_ident.udf_info_.udf_name_ = udt_name); + OX (access_ident.udf_info_.udf_database_ = database_name); } else if (access_idxs.count() > 0) { OZ (get_names_by_access_ident(access_ident, access_idxs, diff --git a/src/pl/ob_pl_type.cpp b/src/pl/ob_pl_type.cpp index 067bfb1853..11d9e5eb5a 100644 --- a/src/pl/ob_pl_type.cpp +++ b/src/pl/ob_pl_type.cpp @@ -280,7 +280,7 @@ int ObPLDataType::get_table_type_by_name(uint64_t tenant_id, const ObTableSchema *table_info = NULL; OZ (schema_guard.get_table_schema(tenant_id, owner_id, table, false, table_info)); if (OB_SUCC(ret) && OB_ISNULL(table_info)) { - uint64_t object_owner_id = session_info.get_database_id(); + uint64_t object_owner_id = owner_id; ObString object_name = table; bool exist = false; OZ (get_synonym_object(tenant_id, object_owner_id, object_name, exist, session_info, schema_guard, deps)); @@ -2255,13 +2255,6 @@ int ObPLCursorInfo::set_rowcount(int64_t rowcount) rowcount_ += rowcount; } } else { - // 非forall的dml语句,需要首先清除掉forall中填充的bulk信息 - if (bulk_rowcount_.count() != 0) { - bulk_rowcount_.reset(); - } - if (bulk_exceptions_.count() != 0) { - bulk_exceptions_.reset(); - } rowcount_ = rowcount; } isopen_ = true; // 隐式游标用这个值来判断是否有执行过dml,因此每次set_rowcount都设置这个值 diff --git a/src/sql/resolver/cmd/ob_call_procedure_resolver.cpp b/src/sql/resolver/cmd/ob_call_procedure_resolver.cpp index 88705f5496..7495231973 100644 --- a/src/sql/resolver/cmd/ob_call_procedure_resolver.cpp +++ b/src/sql/resolver/cmd/ob_call_procedure_resolver.cpp @@ -512,20 +512,26 @@ int ObCallProcedureResolver::resolve(const ParseNode &parse_tree) ObString("SYS_REFCURSOR"), ObString(""))); } else if (param_info->is_complex_type()) { // UDT - if (param_info->get_type_owner() == session_info_->get_database_id()) { + int64_t tenant_id = pl::get_tenant_id_by_object_id(pl_type.get_user_type_id()); + int64_t type_owner = OB_INVALID_ID; + const ObUDTTypeInfo *udt_info = NULL; + OZ (schema_checker_->get_udt_info(tenant_id, pl_type.get_user_type_id(), udt_info)); + CK (OB_NOT_NULL(udt_info)); + OX (type_owner = udt_info->get_database_id()); + if (OB_FAIL(ret)) { + } else if (type_owner == session_info_->get_database_id()) { CK (!session_info_->get_database_name().empty()); OZ (call_proc_info->add_out_param(i, param_info->get_mode(), param_info->get_param_name(), pl_type, - param_info->get_type_name(), + udt_info->get_type_name(), session_info_->get_database_name())); } else { const ObDatabaseSchema *db_schema = NULL; CK (OB_NOT_NULL(schema_checker_)); CK (OB_NOT_NULL(schema_checker_->get_schema_mgr())); - OZ (schema_checker_->get_schema_mgr()->get_database_schema(param_info->get_tenant_id(), - param_info->get_type_owner(), db_schema), param_info->get_type_owner()); + OZ (schema_checker_->get_schema_mgr()->get_database_schema(tenant_id, type_owner, db_schema), K(param_info->get_type_owner())); if (OB_SUCC(ret) && OB_ISNULL(db_schema)) { ret = OB_ERR_BAD_DATABASE; LOG_WARN("failed to get type owner", K(param_info->get_type_owner())); @@ -534,9 +540,9 @@ int ObCallProcedureResolver::resolve(const ParseNode &parse_tree) param_info->get_mode(), param_info->get_param_name(), pl_type, - param_info->get_type_name(), + udt_info->get_type_name(), OB_SYS_TENANT_ID == db_schema->get_tenant_id() - ? ObString("SYS") : db_schema->get_database_name_str()), i); + ? ObString("SYS") : db_schema->get_database_name_str()), K(i)); } } else if (pl_type.is_user_type()) { // 通过Call语句执行PL且参数是复杂类型的情况, 仅在PS模式支持, 通过客户端无法构造复杂数据类型; diff --git a/src/sql/resolver/ddl/ob_alter_routine_resolver.cpp b/src/sql/resolver/ddl/ob_alter_routine_resolver.cpp index 6022820a07..f4f634b266 100644 --- a/src/sql/resolver/ddl/ob_alter_routine_resolver.cpp +++ b/src/sql/resolver/ddl/ob_alter_routine_resolver.cpp @@ -357,7 +357,9 @@ int ObAlterRoutineResolver::resolve_routine( int ret = OB_SUCCESS; ParseNode *crt_tree = NULL; CK (OB_NOT_NULL(source_tree)); - CK (T_SP_SOURCE == source_tree->type_ || T_SF_SOURCE == source_tree->type_); + CK (T_SP_SOURCE == source_tree->type_ + || T_SF_SOURCE == source_tree->type_ + || T_SF_AGGREGATE_SOURCE == source_tree->type_); CK (lib::is_oracle_mode()); if (OB_SUCC(ret) && OB_ISNULL(crt_tree = new_non_terminal_node( diff --git a/src/sql/resolver/ddl/ob_create_routine_resolver.cpp b/src/sql/resolver/ddl/ob_create_routine_resolver.cpp index 3e3c023d71..07cdf478d1 100644 --- a/src/sql/resolver/ddl/ob_create_routine_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_routine_resolver.cpp @@ -279,7 +279,9 @@ int ObCreateRoutineResolver::set_routine_param(const ObIArray &a params_.session_info_->get_effective_tenant_id(), access_idxs.at(0).var_index_, table)); CK (OB_NOT_NULL(table)); - OX (routine_param.set_type_owner(table->get_database_id())); + if (OB_SUCC(ret) && ObCharset::case_compat_mode_equal(table->get_table_name_str(), routine_param.get_type_subname())) { + routine_param.set_type_owner(table->get_database_id()); + } } OZ (collect_ref_obj_info(table->get_table_id(), table->get_schema_version(), ObDependencyTableType::DEPENDENCY_TABLE)); @@ -333,7 +335,9 @@ int ObCreateRoutineResolver::set_routine_param(const ObIArray &a params_.session_info_->get_effective_tenant_id(), access_idxs.at(0).var_index_, table)); CK (OB_NOT_NULL(table)); - OX (routine_param.set_type_owner(table->get_database_id())); + if (OB_SUCC(ret) && ObCharset::case_compat_mode_equal(table->get_table_name_str(), routine_param.get_type_name())) { + routine_param.set_type_owner(table->get_database_id()); + } } OZ (collect_ref_obj_info(table->get_table_id(), table->get_schema_version(), ObDependencyTableType::DEPENDENCY_TABLE)); diff --git a/src/sql/resolver/expr/ob_raw_expr.h b/src/sql/resolver/expr/ob_raw_expr.h index bd735f61bd..7fc22822cb 100644 --- a/src/sql/resolver/expr/ob_raw_expr.h +++ b/src/sql/resolver/expr/ob_raw_expr.h @@ -1166,7 +1166,7 @@ public: int check_param_num() const; - TO_STRING_KV(K_(access_name), K_(access_index), K_(type), K_(params)); + TO_STRING_KV(K_(access_name), K_(access_index), K_(type), K_(params), K_(udf_info)); AccessNameType type_; common::ObString access_name_; 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 b4ad965031..6cdcd3c226 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -3124,8 +3124,12 @@ int ObRawExprResolverImpl::process_datatype_or_questionmark(const ParseNode &nod T_QUESTIONMARK == c_expr->get_expr_type() && c_expr->get_result_type().is_ext() && (pl::PL_RECORD_TYPE == c_expr->get_result_type().get_extend_type() || - pl::PL_NESTED_TABLE_TYPE == c_expr->get_result_type().get_extend_type() || - pl::PL_VARRAY_TYPE == c_expr->get_result_type().get_extend_type())) { + pl::PL_NESTED_TABLE_TYPE == c_expr->get_result_type().get_extend_type() || + pl::PL_ASSOCIATIVE_ARRAY_TYPE == c_expr->get_result_type().get_extend_type() || + pl::PL_VARRAY_TYPE == c_expr->get_result_type().get_extend_type() || + pl::PL_CURSOR_TYPE == c_expr->get_result_type().get_extend_type() || + pl::PL_REF_CURSOR_TYPE == c_expr->get_result_type().get_extend_type() || + pl::PL_OPAQUE_TYPE == c_expr->get_result_type().get_extend_type())) { ctx_.stmt_->get_query_ctx()->disable_udf_parallel_ |= true; } } diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index c463d83057..7f87a299f1 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -1801,6 +1801,7 @@ int ObResolverUtils::resolve_synonym_object_recursively(ObSchemaChecker &schema_ is_private_syn)) || !exist_non_syn_object || is_private_syn) { + ret = OB_SUCCESS; OZ (SMART_CALL(resolve_synonym_object_recursively( schema_checker, synonym_checker, tenant_id, object_database_id, object_name, object_database_id, object_name, exist_with_synonym,