diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 3de07a01d5..86fd59a14a 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -11380,8 +11380,8 @@ int ObPLResolver::resolve_collection_construct(const ObQualifiedName &q_name, OX (coll_expr->set_result_type(res_type)); CK (OB_NOT_NULL(udf_info.ref_expr_)); for (int64_t i = 0; OB_SUCC(ret) && i < udf_info.ref_expr_->get_param_exprs().count(); ++i) { + ObRawExpr *child = udf_info.ref_expr_->get_param_exprs().at(i); if (coll_type->get_element_type().is_obj_type()) { - ObRawExpr *child = udf_info.ref_expr_->get_param_exprs().at(i); const ObDataType *data_type = coll_type->get_element_type().get_data_type(); CK (OB_NOT_NULL(data_type)); OZ (ObRawExprUtils::build_column_conv_expr(&resolve_ctx_.session_info_, @@ -11396,7 +11396,36 @@ int ObPLResolver::resolve_collection_construct(const ObQualifiedName &q_name, true)); OZ (coll_expr->add_param_expr(child)); } else { - OZ (coll_expr->add_param_expr(udf_info.ref_expr_->get_param_exprs().at(i))); + bool is_legal = true; + uint64_t actual_udt_id = OB_INVALID_ID; + if (child->get_result_type().is_null()) { + } else if (child->get_result_type().is_ext()) { + if (child->is_obj_access_expr()) { + ObPLDataType actually_type; + const ObObjAccessRawExpr *obj_access = NULL; + CK (OB_NOT_NULL(obj_access = static_cast(child))); + OZ (obj_access->get_final_type(actually_type)); + OX (actual_udt_id = actually_type.get_user_type_id()); + } else { + actual_udt_id = child->get_result_type().get_udt_id(); + } + if (actual_udt_id != coll_type->get_element_type().get_user_type_id()) { + OZ (check_composite_compatible(current_block_->get_namespace(), + actual_udt_id, + coll_type->get_element_type().get_user_type_id(), + is_legal)); + } + } else { + is_legal = false; + } + if (OB_FAIL(ret)) { + } else if (!is_legal) { + ret = OB_ERR_CALL_WRONG_ARG; + LOG_WARN("PLS-00306: wrong number or types of arguments in call stmt", + K(ret), K(actual_udt_id), K(coll_type->get_element_type())); + } else { + OZ (coll_expr->add_param_expr(child)); + } } } OX (expr = coll_expr); diff --git a/src/rootserver/ob_ddl_operator.cpp b/src/rootserver/ob_ddl_operator.cpp index 505d0ba347..6398c306d7 100644 --- a/src/rootserver/ob_ddl_operator.cpp +++ b/src/rootserver/ob_ddl_operator.cpp @@ -8651,6 +8651,7 @@ int ObDDLOperator::create_package(const ObPackageInfo *old_package_info, } int ObDDLOperator::alter_package(const ObPackageInfo &package_info, + ObSchemaGetterGuard &schema_guard, ObMySQLTransaction &trans, ObIArray &public_routine_infos, ObErrorInfo &error_info, @@ -8663,16 +8664,32 @@ int ObDDLOperator::alter_package(const ObPackageInfo &package_info, int64_t new_schema_version = OB_INVALID_VERSION; uint64_t package_id = package_info.get_package_id(); ObPackageInfo new_package_info; + ObArray routine_infos; + bool need_create = false; OV (OB_NOT_NULL(schema_service_impl), OB_ERR_SYS); OV (OB_INVALID_ID != tenant_id && OB_INVALID_ID != package_id, OB_INVALID_ARGUMENT); + OZ (schema_guard.get_routine_infos_in_package(tenant_id, + package_id, + routine_infos)); + OX (need_create = (0 == routine_infos.count())); if (OB_SUCC(ret)) { if (public_routine_infos.count() > 0) { // update routine route sql ARRAY_FOREACH(public_routine_infos, routine_idx) { ObRoutineInfo &routine_info = public_routine_infos.at(routine_idx); - OZ (schema_service_.gen_new_schema_version(tenant_id, new_schema_version)); - OX (routine_info.set_schema_version(new_schema_version)); - OZ (schema_service_impl->get_routine_sql_service().update_routine(routine_info, &trans)); + if (need_create) { + CK (OB_INVALID_ID == routine_info.get_routine_id()); + OZ (update_routine_info(routine_info, + tenant_id, + routine_info.get_package_id(), + routine_info.get_owner_id(), + routine_info.get_database_id())); + OZ (schema_service_impl->get_routine_sql_service().create_routine(routine_info, &trans, NULL)); + } else { + OZ (schema_service_.gen_new_schema_version(tenant_id, new_schema_version)); + OX (routine_info.set_schema_version(new_schema_version)); + OZ (schema_service_impl->get_routine_sql_service().update_routine(routine_info, &trans)); + } } OZ (new_package_info.assign(package_info)); OZ (schema_service_.gen_new_schema_version(tenant_id, new_schema_version)); diff --git a/src/rootserver/ob_ddl_operator.h b/src/rootserver/ob_ddl_operator.h index 2a5665c269..14210b081b 100644 --- a/src/rootserver/ob_ddl_operator.h +++ b/src/rootserver/ob_ddl_operator.h @@ -779,6 +779,7 @@ public: common::ObIArray &dep_infos, const common::ObString *ddl_stmt_str/*=NULL*/); int alter_package(const share::schema::ObPackageInfo &package_info, + ObSchemaGetterGuard &schema_guard, common::ObMySQLTransaction &trans, ObIArray &public_routine_infos, share::schema::ObErrorInfo &error_info, diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index a579de094c..85366504ca 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -32644,7 +32644,7 @@ int ObDDLService::alter_package(ObSchemaGetterGuard &schema_guard, LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); } else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) { LOG_WARN("start transaction failed", KR(ret), K(tenant_id), K(refreshed_schema_version)); - } else if (OB_FAIL(ddl_operator.alter_package(package_info, trans, public_routine_infos, + } else if (OB_FAIL(ddl_operator.alter_package(package_info, schema_guard, trans, public_routine_infos, error_info, ddl_stmt_str))) { LOG_WARN("alter package failed", K(package_info), K(ret)); } diff --git a/src/sql/resolver/ddl/ob_create_package_resolver.cpp b/src/sql/resolver/ddl/ob_create_package_resolver.cpp index a229074f1c..6b8ffbc9df 100644 --- a/src/sql/resolver/ddl/ob_create_package_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_package_resolver.cpp @@ -679,6 +679,9 @@ int ObCreatePackageBodyResolver::resolve(const ParseNode &parse_tree) OZ (update_routine_route_sql(*allocator_, *session_info_, routine_list, spec_routine_table, body_routine_table, routine_infos)); + if (OB_FAIL(ret)) { + routine_list.reset(); + } } if (OB_FAIL(ret) && ret != OB_ERR_UNEXPECTED && ret != OB_ERR_TOO_LONG_IDENT) { LOG_USER_WARN(OB_ERR_PACKAGE_COMPILE_ERROR, "PACKAGE BODY",