openGauss源码解析(128)
openGauss源码解析:执行器解析(21)
7.4 表达式计算
表达式计算对应的代码源文件是“execQual.cpp”,openGauss处理SQL语句中的函数调用、计算式和条件表达式时需要用到表达式计算。
表达式的表示方式和查询计划树的计划节点类似,通过生成表达式计划来对每个表达式节点进行计算。表达式继承层次中的公共根类为Expr节点,其他表达式节点都继承Expr节点。表达式状态的公共根类为ExprState,记录了表达式的类型以及实现该表达式节点的函数指针。表达式内存上下文类为ExprContext,ExprContext充当了计划树节点中Estate的角色,表达式计算过程中的参数以及表达式所使用的内存上下文都会存放到此结构中。
表达式计算对应的主要结构体代码如下:
typedef struct Expr {
NodeTag type; /*表达式节点类型*/
} Expr;
struct ExprState {
NodeTag type;
Expr* expr; /*关联的表达式节点*/
ExprStateEvalFunc evalfunc; /*表达式运算的函数指针*/
VectorExprFun vecExprFun;
exprFakeCodeGenSig exprCodeGen; /*运行LLVM汇编函数的指针*/
ScalarVector tmpVector;
Oid resultType;
};
表达式计算的过程分为3个部分:初始化、执行和清理。初始化的过程使用统一接口ExecInitExpr,根据表达式的类型选择不同的处理方式,生成表达式节点树。执行过程使用统一接口宏ExecEvalExpr,执行过程类似于计划节点的递归方式。