openGauss源码解析(131)

openGauss源码解析:执行器解析(24)

表7-30中列举代码“execQual.cpp”文件中的部分主要函数,下面将依次详细介绍每个函数的功能、核心代码和执行流程。

表7-30 表达式计算的主要函数

主要函数

说明

ExecMakeFunctionResultNoSets

表达式计算(非集合)

ExecMakeFunctionResult

表达式计算(集合)

ExecEvalFunc/ExecEvalOper

调用表达式计算函数

ExecQual

检查条件表达式

ExecEvalOr

处理or表达式

ExecTargetList

计算targetlist中的所有表达式

ExecProject

计算投影信息

ExecEvalParamExec

获取Exec类型参数

ExecEvalParamExtern

获取Extern类型参数

ExecMakeFunctionResult函数和ExecMakeFunctionResultNoSets函数是表达式计算的核心函数,主要作用是通过获取表达式的参数来计算出表达式结果。ExecMakeFunctionResultNoSets函数是ExecMakeFunctionResult函数的简化版,只能处理返回值是非集合情况。ExecMakeFunctionResult函数核心代码如下:

fcinfo = &fcache->fcinfo_data; /* 声明fcinfo */

InitFunctionCallInfoArgs(*fcinfo, list_length(fcache->args), 1); /*初始化fcinfo */

econtext->is_cursor = false;

foreach (arg, fcache->args) { /* 遍历获取参数值 */

ExprState* argstate = (ExprState*)lfirst(arg);

fcinfo->argTypes[i] = argstate->resultType;

fcinfo->arg[i] = ExecEvalExpr(argstate, econtext, &fcinfo->argnull[i], NULL);

if (fcache->func.fn_strict) /* 判断参数是否存在空值 */

……

result = FunctionCallInvoke(fcinfo); /* 计算表达式结果 */

return result;

ExecMakeFunctionResultNoSets函数的执行流程如下。

(1) 声明fcinfo来存储表达式需要的参数信息,通过InitFunctionCallInfoArgs函数初始化fcinfo中的字段。
(2) 遍历表达式中的参数args,通过ExecEvalExpr宏调用接口获取每一个参数的值,存储到“fcinfo->arg[i]”中。
(3) 根据func.fn_strict函数来判断是否需要检查参数空值情况。如果不需要检查,则通过“FunctionCalllv-oke”宏将参数传入表达式并计算出表达式的结果。否则进行判空处理,若存在空值则直接返回空,若不存在空值则通过FunctionCalllvoke宏计算表达式结果。
(4) 返回计算结果。

流程如图7-14所示。

图7-14 “ExecMakeFunctionResultNoSets”函数执行流程

posted @ 2024-04-30 10:50  openGauss-bot  阅读(3)  评论(0编辑  收藏  举报