From 52b1cf673bfedc041ecee58cd90d755a135d3978 Mon Sep 17 00:00:00 2001 From: hanr881 <1741282579@qq.com> Date: Thu, 18 May 2023 08:46:47 +0000 Subject: [PATCH] fix issue<49765208><49775511><49758358>:fix dml with udf parallel execute issues --- src/pl/ob_pl_resolver.cpp | 7 ++-- src/sql/ob_spi.cpp | 3 +- src/sql/resolver/dml/ob_dml_resolver.cpp | 17 +++++++++- src/sql/resolver/ob_resolver_utils.cpp | 43 ++++++++++++++++++++++++ src/sql/resolver/ob_resolver_utils.h | 5 +++ 5 files changed, 69 insertions(+), 6 deletions(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index d4f5761817..3be981d137 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -8305,7 +8305,8 @@ int ObPLResolver::analyze_expr_type(ObRawExpr *&expr, OX (unit_ast.set_rps()); } else if (T_FUN_UDF == expr->get_expr_type() || T_OP_GET_SYS_VAR == expr->get_expr_type() || - T_OP_GET_USER_VAR == expr->get_expr_type()) { + T_OP_GET_USER_VAR == expr->get_expr_type() || + (T_FUN_SUBQUERY == expr->get_expr_type() && lib::is_mysql_mode())) { // user var expr has been rewrite to subquery expr in mysql mode OX (unit_ast.set_external_state()); } else { for (int64_t i = 0; @@ -10380,7 +10381,7 @@ int ObPLResolver::resolve_udf_info( OX (udf_raw_expr->set_is_udt_cons(udf_info.is_udf_udt_cons())); OX (udf_raw_expr->set_is_udt_udf(routine_info->is_udt_routine())); OX (udf_raw_expr->set_is_deterministic(routine_info->is_deterministic())); - if (OB_SUCC(ret)) { + /*if (OB_SUCC(ret)) { bool enable_parallel = true; if (udf_raw_expr->is_parallel_enable()) { //do nothing @@ -10396,7 +10397,7 @@ int ObPLResolver::resolve_udf_info( } OX (udf_raw_expr->set_parallel_enable(enable_parallel)); } - } + }*/ if (OB_SUCC(ret) && udf_info.is_udf_udt_cons() && OB_NOT_NULL(udf_raw_expr->get_param_expr(0))) { diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index 95f1ccf5f2..8399868405 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -4239,9 +4239,8 @@ int ObSPIService::spi_set_pl_exception_code(pl::ObPLExecCtx *ctx, int64_t code, LOG_ORACLE_USER_ERROR(OB_SP_RAISE_APPLICATION_ERROR, code, 0, ""); } } - if (is_pop_warning_buf && lib::is_mysql_mode()) { + if (is_pop_warning_buf && lib::is_mysql_mode() && sqlcode_info->get_stack_warning_buf().count() > 0) { int64_t idx = sqlcode_info->get_stack_warning_buf().count() - 1; - CK (idx >= 0); OX (sqlcode_info->get_stack_warning_buf().at(idx).~ObWarningBuffer()); OX (sqlcode_info->get_stack_warning_buf().pop_back()); OX (ctx->exec_ctx_->get_my_session()->set_show_warnings_buf(OB_SUCCESS)); diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 7633659bf6..264f36f748 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -10776,6 +10776,7 @@ int ObDMLResolver::resolve_external_name(ObQualifiedName &q_name, ObSchemaObjVersion udf_version; share::schema::ObSchemaGetterGuard *schema_guard = NULL; uint64_t database_id = OB_INVALID_ID; + CK (OB_NOT_NULL(stmt)); CK (OB_NOT_NULL(udf_expr)); if (OB_FAIL(ret)) { } else if (OB_ISNULL(schema_guard = params_.schema_checker_->get_schema_guard())) { @@ -10789,7 +10790,6 @@ int ObDMLResolver::resolve_external_name(ObQualifiedName &q_name, uint64_t dep_obj_id = view_ref_id_; uint64_t dep_db_id = database_id; OZ (udf_expr->get_schema_object_version(udf_version)); - CK (OB_NOT_NULL(stmt)); 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_)); //for udf without params, we just set called_in_sql = true, @@ -10797,6 +10797,21 @@ int ObDMLResolver::resolve_external_name(ObQualifiedName &q_name, //the flag will change to false; OX (expr->set_is_called_in_sql(true)); } + + bool is_dml_stmt = false; + if (OB_FAIL(ret)) { + } else if (ObStmt::is_dml_write_stmt(stmt->get_stmt_type())) { + is_dml_stmt = true; + } else if (stmt::T_SELECT == stmt->get_stmt_type()) { + bool has_for_update = false; + OZ (stmt->check_if_contain_select_for_update(has_for_update)); + OX (is_dml_stmt = has_for_update); + } + + OZ (ObResolverUtils::set_parallel_info(*params_.session_info_, + *params_.schema_checker_->get_schema_guard(), + *expr, + is_dml_stmt)); OX (stmt_->get_query_ctx()->disable_udf_parallel_ |= !udf_expr->is_parallel_enable()); if (OB_SUCC(ret) && udf_expr->get_result_type().is_ext() && diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index b76a8f514f..fca09c53e0 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -6407,6 +6407,49 @@ int ObResolverUtils::resolve_string(const ParseNode *node, ObString &string) return ret; } +int ObResolverUtils::set_parallel_info(sql::ObSQLSessionInfo &session_info, + share::schema::ObSchemaGetterGuard &schema_guard, + ObRawExpr &expr, + bool is_dml_stmt) +{ + int ret = OB_SUCCESS; + const ObRoutineInfo *routine_info = NULL; + ObUDFRawExpr &udf_raw_expr = static_cast(expr); + + if (udf_raw_expr.is_parallel_enable()) { + //do nothing + } else { + uint64_t tenant_id = session_info.get_effective_tenant_id(); + bool enable_parallel = true; + if (udf_raw_expr.get_is_udt_udf()) { + tenant_id = pl::get_tenant_id_by_object_id(udf_raw_expr.get_pkg_id()); + OZ (schema_guard.get_routine_info_in_udt(tenant_id, udf_raw_expr.get_pkg_id(), udf_raw_expr.get_udf_id(), routine_info)); + } else if (udf_raw_expr.get_pkg_id() != OB_INVALID_ID) { + tenant_id = pl::get_tenant_id_by_object_id(udf_raw_expr.get_pkg_id()); + OZ (schema_guard.get_routine_info_in_package(tenant_id, udf_raw_expr.get_pkg_id(), udf_raw_expr.get_udf_id(), routine_info)); + } else { + OZ (schema_guard.get_routine_info(tenant_id, + udf_raw_expr.get_udf_id(), + routine_info)); + } + + if (OB_SUCC(ret) && OB_NOT_NULL(routine_info)) { + if (routine_info->is_modifies_sql_data() || + routine_info->is_wps() || + routine_info->is_rps() || + routine_info->is_has_sequence() || + routine_info->is_external_state()) { + enable_parallel = false; + } else if (is_dml_stmt && routine_info->is_reads_sql_data()) { + enable_parallel = false; + } + OX (udf_raw_expr.set_parallel_enable(enable_parallel)); + } + } + return ret; +} + + int ObResolverUtils::resolve_external_symbol(common::ObIAllocator &allocator, sql::ObRawExprFactory &expr_factory, sql::ObSQLSessionInfo &session_info, diff --git a/src/sql/resolver/ob_resolver_utils.h b/src/sql/resolver/ob_resolver_utils.h index 31640a4504..8113b1ba28 100644 --- a/src/sql/resolver/ob_resolver_utils.h +++ b/src/sql/resolver/ob_resolver_utils.h @@ -281,6 +281,11 @@ public: ObQualifiedName &q_name, const ObSQLSessionInfo &session_info); + static int set_parallel_info(sql::ObSQLSessionInfo &session_info, + share::schema::ObSchemaGetterGuard &schema_guard, + ObRawExpr &expr, + bool is_dml_stmt); + static int resolve_external_symbol(common::ObIAllocator &allocator, sql::ObRawExprFactory &expr_factory, sql::ObSQLSessionInfo &session_info,