[CP] [to #46708308] add ObPLCtxGuard for udf calc

This commit is contained in:
obdev 2022-12-28 03:08:07 +00:00 committed by ob-robot
parent 8ac1a5ef1e
commit 4d6995673a
2 changed files with 29 additions and 2 deletions

View File

@ -614,6 +614,9 @@ public:
int add(ObObj &obj) {
return objects_.push_back(obj);
}
void clear() {
objects_.reset();
}
void reset_obj();
common::ObIArray<ObObj>& get_objects() { return objects_; }
private:
@ -624,6 +627,28 @@ private:
ObSEArray<ObObj, 32> objects_;
};
class ObPLCtxGuard
{
public:
ObPLCtxGuard(ObPLCtx *ctx, int& ret) : ctx_(ctx), ret_(ret) {
if (OB_NOT_NULL(ctx)) {
ret_ = objects_.assign(ctx->get_objects());
ctx_->clear();
}
}
~ObPLCtxGuard() {
if (OB_SUCCESS == ret_ && OB_NOT_NULL(ctx_)) {
ret_ = ctx_->get_objects().assign(objects_);
}
}
private:
ObPLCtx *ctx_;
int &ret_;
ObSEArray<ObObj, 4> objects_;
};
class ObPLPackageGuard;

View File

@ -480,7 +480,7 @@ 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));
}
pl::ObPLCtxGuard guard(ctx.exec_ctx_.get_pl_ctx(), ret);
ObArenaAllocator allocator;
try {
int64_t package_id = info->is_udt_udf_ ?
@ -512,7 +512,9 @@ int ObExprUDF::eval_udf(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res)
}
if (OB_FAIL(ret)) {
} else if (info->is_called_in_sql_) {
if (tmp_result.is_pl_extend()) {
// memory of ref cursor on session, do not copy it.
if (tmp_result.is_pl_extend()
&& tmp_result.get_meta().get_extend_type() != pl::PL_REF_CURSOR_TYPE) {
OZ (pl::ObUserDefinedType::deep_copy_obj(alloc, tmp_result, result, true));
OZ (pl::ObUserDefinedType::destruct_obj(tmp_result, ctx.exec_ctx_.get_my_session()));
CK (OB_NOT_NULL(ctx.exec_ctx_.get_pl_ctx()));