openGauss源码解析(132)
openGauss源码解析:执行器解析(25)
ExecMakeFunctionResult函数的执行流程如图7-15所示。
(1) 判断funcResultStore是否存在,如果存在则从中获取结果返回(注:如果下文(3)中的模式是SFRM_Materialize,则会直接跳到此处)。
(2) 计算出参数值存入到fcinfo中。
(3) 把参数传入到表达式函数中计算表达式,首先判断参数args是否存在空,然后判断返回集合的函数的返回模式,SFRM_ValuePerCall模式是每次调用返回一个值,SFRM_Materialize模式是在Tuplestore中实例化的结果集。
(4) 根据不同的模式进行计算并返回结果。
图7-15 ExecMakeFunctionResult函数执行流程
ExecEvalFunc和ExecEvalOper这两个函数的功能类似。通过调用结果处理函数来获取结果。如果函数本身或者它的任何输入参数都可以返回一个集合,那么就会调ExecMakeFunctionResult函数来计算结果,否则调用ExecMakeFunctionResultNoSets函数来计算结果。核心代码如下:
init_fcache<false>(func->funcid,func->inputcollid,fcache, econtext->ecxt_per_query_memory, true); /* 初始化fcache */
if (fcache->func.fn_retset) { /* 判断返回结果类型 */
……
return ExecMakeFunctionResult<true, true, true>(fcache, econtext, isNull, isDone);
} else if (expression_returns_set((Node*)func->args)) {
……
return ExecMakeFunctionResult<true, true, false>(fcache, econtext, isNull, isDone);
} else {
……
return ExecMakeFunctionResultNoSets<true, true>(fcache, econtext, isNull, isDone);
}
ExecEvalFunc函数的执行流程如下。
(1) 是通过init_fcache函数初始化FuncExprState节点,包括初始化参数、内存管理等等。
(2) 根据FuncExprState函数中的数据判断返回结果是否为set类型,并调用相应的函数计算结果。
ExecEvalFunc函数执行流程如图7-16所示。
图7-16 ExecEvalFunc函数执行流程