* plpgsql_param_compile paramCompile callback for plpgsql parameters */
| 6368 | * plpgsql_param_compile paramCompile callback for plpgsql parameters |
| 6369 | */ |
| 6370 | static void |
| 6371 | plpgsql_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 | /* |
nothing calls this directly
no test coverage detected