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”函数执行流程