ParamListInfoData是参数的统一抽象,例如
- 在pl中执行
raise notice '%', n;
n的值会拼成select n
到SQL层取值,但值在哪呢,还是在pl层。对sql层来说,n的一种可能性是参数,在这种可能性中,n的数据放在ParamListInfoData
结构中。执行时,走表达式框架,从ExecEvalParamExtern函数中取值。 - 在sql中执行prepare时也会用占位符替代具体的值,在execute时,具体的值放在
ParamListInfoData
中,在执行时从该数据结构中取值执行。
以pl为例,分析ParamListInfoData变量含义:
代码语言:javascript复制typedef struct ParamListInfoData
{
ParamFetchHook paramFetch; /* parameter fetch hook */
void *paramFetchArg;
ParamCompileHook paramCompile; /* parameter compile hook */
void *paramCompileArg;
ParserSetupHook parserSetup; /* parser setup hook */
void *parserSetupArg;
char *paramValuesStr; /* params as a single string for errors */
int numParams; /* nominal/maximum # of Params represented */
/*
* params[] may be of length zero if paramFetch is supplied; otherwise it
* must be of length numParams.
*/
ParamExternData params[FLEXIBLE_ARRAY_MEMBER];
} ParamListInfoData;
typedef struct ParamExecData
{
void *execPlan; /* should be "SubPlanState *" */
Datum value;
bool isnull;
} ParamExecData;
其中:
- paramFetch:指向plpgsql_param_fetch函数,动态取值用。
- paramFetchArg:指向pl的estate,拿到任何所需的pl的运行状态。
- paramCompile:配置取值函数。
- paramCompileArg:pl不需要,为空。
- parserSetup:配置上述钩子函数。
- parserSetupArg:pl不需要,为空。
- numParams:和estate->ndatums相同。
- params:结构体后置数组,每个数组元素对应一个datum包含
- value:数据值或指针。
- isnull:为空?
- pflags:状态位。
- ptype:值的类型。
值放在后置数组中,在exec_eval_using_params函数中赋值。