MCPcopy Create free account
hub / github.com/apache/cloudberry / plpgsql_param_compile

Function plpgsql_param_compile

src/pl/plpgsql/src/pl_exec.c:6370–6437  ·  view source on GitHub ↗

* plpgsql_param_compile paramCompile callback for plpgsql parameters */

Source from the content-addressed store, hash-verified

6368 * plpgsql_param_compile paramCompile callback for plpgsql parameters
6369 */
6370static void
6371plpgsql_param_compile(ParamListInfo params, Param *param,
6372 ExprState *state,
6373 Datum *resv, bool *resnull)
6374{
6375 PLpgSQL_execstate *estate;
6376 PLpgSQL_expr *expr;
6377 int dno;
6378 PLpgSQL_datum *datum;
6379 ExprEvalStep scratch;
6380
6381 /* fetch back the hook data */
6382 estate = (PLpgSQL_execstate *) params->paramFetchArg;
6383 expr = (PLpgSQL_expr *) params->parserSetupArg;
6384
6385 /* paramid's are 1-based, but dnos are 0-based */
6386 dno = param->paramid - 1;
6387 Assert(dno >= 0 && dno < estate->ndatums);
6388
6389 /* now we can access the target datum */
6390 datum = estate->datums[dno];
6391
6392 scratch.opcode = EEOP_PARAM_CALLBACK;
6393 scratch.resvalue = resv;
6394 scratch.resnull = resnull;
6395
6396 /*
6397 * Select appropriate eval function. It seems worth special-casing
6398 * DTYPE_VAR and DTYPE_RECFIELD for performance. Also, we can determine
6399 * in advance whether MakeExpandedObjectReadOnly() will be required.
6400 * Currently, only VAR/PROMISE and REC datums could contain read/write
6401 * expanded objects.
6402 */
6403 if (datum->dtype == PLPGSQL_DTYPE_VAR)
6404 {
6405 if (param != expr->expr_rw_param &&
6406 ((PLpgSQL_var *) datum)->datatype->typlen == -1)
6407 scratch.d.cparam.paramfunc = plpgsql_param_eval_var_ro;
6408 else
6409 scratch.d.cparam.paramfunc = plpgsql_param_eval_var;
6410 }
6411 else if (datum->dtype == PLPGSQL_DTYPE_RECFIELD)
6412 scratch.d.cparam.paramfunc = plpgsql_param_eval_recfield;
6413 else if (datum->dtype == PLPGSQL_DTYPE_PROMISE)
6414 {
6415 if (param != expr->expr_rw_param &&
6416 ((PLpgSQL_var *) datum)->datatype->typlen == -1)
6417 scratch.d.cparam.paramfunc = plpgsql_param_eval_generic_ro;
6418 else
6419 scratch.d.cparam.paramfunc = plpgsql_param_eval_generic;
6420 }
6421 else if (datum->dtype == PLPGSQL_DTYPE_REC &&
6422 param != expr->expr_rw_param)
6423 scratch.d.cparam.paramfunc = plpgsql_param_eval_generic_ro;
6424 else
6425 scratch.d.cparam.paramfunc = plpgsql_param_eval_generic;
6426
6427 /*

Callers

nothing calls this directly

Calls 1

ExprEvalPushStepFunction · 0.85

Tested by

no test coverage detected