Обсуждение: Remove redundant code in pl_exec.c
Hi, hackers
I found there are some redundant code in pl_exec.c,
plpgsql_param_eval_generic_ro is same as plpgsql_param_eval_generic
except it invokes MakeExpandedObjectReadOnly.
IMO, we can invoke plpgsql_param_eval_generic in plpgsql_param_eval_generic_ro
to avoid the redundant.
Is there something I missed? Any thoughts?
--
Regrads,
Japin Li.
ChengDu WenWu Information Technology Co.,Ltd.
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 7bd2a9fff1..543419d3da 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -6673,34 +6673,7 @@ static void
plpgsql_param_eval_generic_ro(ExprState *state, ExprEvalStep *op,
ExprContext *econtext)
{
- ParamListInfo params;
- PLpgSQL_execstate *estate;
- int dno = op->d.cparam.paramid - 1;
- PLpgSQL_datum *datum;
- Oid datumtype;
- int32 datumtypmod;
-
- /* fetch back the hook data */
- params = econtext->ecxt_param_list_info;
- estate = (PLpgSQL_execstate *) params->paramFetchArg;
- Assert(dno >= 0 && dno < estate->ndatums);
-
- /* now we can access the target datum */
- datum = estate->datums[dno];
-
- /* fetch datum's value */
- exec_eval_datum(estate, datum,
- &datumtype, &datumtypmod,
- op->resvalue, op->resnull);
-
- /* safety check -- needed for, eg, record fields */
- if (unlikely(datumtype != op->d.cparam.paramtype))
- ereport(ERROR,
- (errcode(ERRCODE_DATATYPE_MISMATCH),
- errmsg("type of parameter %d (%s) does not match that when preparing the plan (%s)",
- op->d.cparam.paramid,
- format_type_be(datumtype),
- format_type_be(op->d.cparam.paramtype))));
+ plpgsql_param_eval_generic(state, op, econtext);
/* force the value to read-only */
*op->resvalue = MakeExpandedObjectReadOnly(*op->resvalue,
Japin Li <japinli@hotmail.com> writes:
> I found there are some redundant code in pl_exec.c,
> plpgsql_param_eval_generic_ro is same as plpgsql_param_eval_generic
> except it invokes MakeExpandedObjectReadOnly.
Which is exactly why it's NOT redundant.
> IMO, we can invoke plpgsql_param_eval_generic in plpgsql_param_eval_generic_ro
> to avoid the redundant.
I don't like this particularly --- it puts way too much premium on
the happenstance that the MakeExpandedObjectReadOnly call is the
very last step in the callback function. If that needed to change,
we'd have a mess.
regards, tom lane
On Fri, 09 Sep 2022 at 23:34, Tom Lane <tgl@sss.pgh.pa.us> wrote: > Japin Li <japinli@hotmail.com> writes: >> IMO, we can invoke plpgsql_param_eval_generic in plpgsql_param_eval_generic_ro >> to avoid the redundant. > > I don't like this particularly --- it puts way too much premium on > the happenstance that the MakeExpandedObjectReadOnly call is the > very last step in the callback function. If that needed to change, > we'd have a mess. > Sorry, I don't get your mind. Could you explain it more? Thanks in advance! -- Regrads, Japin Li. ChengDu WenWu Information Technology Co.,Ltd.
Japin Li <japinli@hotmail.com> writes:
> On Fri, 09 Sep 2022 at 23:34, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> I don't like this particularly --- it puts way too much premium on
>> the happenstance that the MakeExpandedObjectReadOnly call is the
>> very last step in the callback function. If that needed to change,
>> we'd have a mess.
> Sorry, I don't get your mind. Could you explain it more? Thanks in advance!
This refactoring cannot support the situation where there is more
code to execute after MakeExpandedObjectReadOnly.
regards, tom lane