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

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