[CP] [to #46708308] add ObPLCtxGuard for udf calc
This commit is contained in:
parent
8ac1a5ef1e
commit
4d6995673a
@ -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;
|
||||
|
||||
|
@ -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()));
|
||||
|
Loading…
x
Reference in New Issue
Block a user