一. 前言
在OpenGuass中,如果where 条件中包含where 1= 0 等固定为否条件的查询语句,在生成执行计划的时候,执行计划是BaseResult类型,此类型的执行计划不会进行物理数据扫描,如下所示:
对于非固定为否条件(如where id = 1)的语句,对应的执行计划则是SeqScan,此类计划会先执行物理扫描数据,扫描数据后在根据谓词条件进行优化,如下所示:
本文主要是通过代码走读来了解在OpenGuass中对于where 1 = 0的固定为伪条件的处理流程。
二. 计算1= 0的结果为常量 false
OpenGuass在生成执行计划的时候,会先进行常量表达式的计算和替换,对于 1=0的计算表达式,计算完成之后直接用常量false代替,对应的实现代码如下所示:
preprocess_const_params
preprocess_const_params_worker
eval_const_expressions
eval_const_expressions_mutator
simple = simplify_function // 计算1=0表达式的结果为false,用false常量替换成1=0
三. 生成执行计划中对于where false的处理
在生成计划的时候,如果发现计划中有where false固定为伪的条件,OpenGuass会执行生成BaseResult的执行计划而不是Scan的执行计划,此步骤是在create_gating_plan函数中实现的,主要的代码执行流程如下所示:
create_scan_plan
if (root->hasPseudoConstantQuals) { // hasPseudoConstantQuals的意思是有where条件,且where条件的结果为常量false
create_gating_plan
pseudoconstants = extract_actual_clauses(quals, true); // extract_actual_clauses结果将返回谓词条件中是否有常量false
if (pseudoconstants == NIL) {
return plan; // 没有常见false的话,继续返回原来的Scan计划
}
make_result
BaseResult* node = makeNode(BaseResult); // 直接返回BaseResult计划
四. 执行BaseResult计划
在执行BaseResult的执行计划中,如果发现有谓词条件,且谓词条件的计算结果固定为false,则执行返回NULL,则空结果,此功能入口是在ExecResult中,主要执行流程如下所示:
ExecResult
bool qualResult = ExecQual((List*)node->resconstantqual, econtext, false); // 计算where的结果
if (!qualResult) {
return NULL; // 如果固定为fasle,则返回空结果
}