fix udf dynamic memory leak of 4.0 branch

This commit is contained in:
obdev
2022-11-07 05:05:35 +00:00
committed by wangzelin.wzl
parent f61b55b314
commit a1f368d6b9
7 changed files with 36 additions and 5 deletions

View File

@ -145,6 +145,7 @@ int ObCallProcedureExecutor::execute(ObExecContext &ctx, ObCallProcedureStmt &st
int64_t pkg_id = stmt.is_udt_routine()
? share::schema::ObUDTObjectType::mask_object_id(package_id) : package_id;
if (OB_FAIL(ctx.get_pl_engine()->execute(ctx,
ctx.get_allocator(),
pkg_id,
routine_id,
path,

View File

@ -403,7 +403,7 @@ int TriggerHandle::calc_trigger_routine(
trigger_id = ObTriggerInfo::get_trigger_spec_package_id(trigger_id);
OV (OB_NOT_NULL(exec_ctx.get_pl_engine()));
OZ (exec_ctx.get_pl_engine()->execute(
exec_ctx, trigger_id, routine_id, path, params, nocopy_params, result),
exec_ctx, exec_ctx.get_allocator(), trigger_id, routine_id, path, params, nocopy_params, result),
trigger_id, routine_id, params);
return ret;
}

View File

@ -407,6 +407,7 @@ int ObExprUDF::build_udf_ctx(int64_t udf_ctx_id,
int ObExprUDF::eval_udf(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res)
{
int ret = OB_SUCCESS;
ObObj tmp_result;
ObObj result;
pl::ObPL *pl_engine = nullptr;
ParamStore *udf_params = nullptr;
@ -479,17 +480,20 @@ int ObExprUDF::eval_udf(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res)
CK (0 < udf_params->count());
OZ (ns.init_complex_obj(alloc, pl_type, udf_params->at(0), false, false));
}
ObEvalCtx::TempAllocGuard tmp_alloc_g(ctx);
try {
int64_t package_id = info->is_udt_udf_ ?
share::schema::ObUDTObjectType::mask_object_id(info->udf_package_id_)
: info->udf_package_id_;
OZ(pl_engine->execute(ctx.exec_ctx_,
info->is_called_in_sql_ ? tmp_alloc_g.get_allocator()
: alloc,
package_id,
info->udf_id_,
info->subprogram_path_,
*udf_params,
info->nocopy_params_,
result,
tmp_result,
nullptr,
false,
true,
@ -499,12 +503,22 @@ int ObExprUDF::eval_udf(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res)
info->udf_id_,
info->udf_package_id_,
info->is_udt_udf_,
result,
tmp_result,
package_id);
} catch(...) {
// OZ(after_calc_result(schema_guard, sql_ctx, ctx.exec_ctx_));
throw;
}
if (OB_SUCC(ret)) {
if (tmp_result.is_pl_extend()) {
OZ (pl::ObUserDefinedType::deep_copy_obj(alloc, tmp_result, result, true));
} else {
OZ (deep_copy_obj(alloc, tmp_result, result));
}
if (info->is_called_in_sql_) {
OX (ctx.exec_ctx_.get_pl_ctx()->reset_obj());
}
}
if (OB_SUCC(ret) && info->is_udt_cons_) {
pl::ObPLComposite *obj_self = reinterpret_cast<pl::ObPLRecord *>(udf_params->at(0).get_ext());
CK (OB_NOT_NULL(obj_self));

View File

@ -110,6 +110,7 @@ int ObPlAggUdfFunction::call_pl_engine_exectue_udf(ParamStore& udf_params,
LOG_WARN("udf parameter number is not equal to params desc count",
K(ret), K(udf_params.count()), K(routine_info->get_param_count()));
} else if (OB_FAIL(pl_engine->execute(*exec_ctx_,
exec_ctx_->get_allocator(),
-1,
routine_info->get_routine_id(),
empty_subprogram_path,