这里把规范谓词表达式的部分就整理完了。阅读的顺序例如以下:

一、PostgreSQL代码分析,查询优化部分,canonicalize_qual

二、PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()

三、 PostgreSQL代码分析。查询优化部分。process_duplicate_ors

/*
* canonicalize_qual
* Convert a qualification expression to the most useful form.
*
* The name of this routine is a holdover from a time when it would try to
* force the expression into canonical AND-of-ORs or OR-of-ANDs form.
* Eventually, we recognized that that had more theoretical purity than
* actual usefulness, and so now the transformation doesn't involve any
* notion of reaching a canonical form.
*
* NOTE: we assume the input has already been through eval_const_expressions
* and therefore possesses AND/OR flatness. Formerly this function included
* its own flattening logic, but that requires a useless extra pass over the
* tree.
*
* Returns the modified qualification.
*/
/*
* 对WHERE语句或ON语句中的条件进行规范化,从集合的角度对AND和OR两个操作做合并分解。 */
Expr *
canonicalize_qual(Expr *qual)
{
Expr *newqual; /* Quick exit for empty qual */
if (qual == NULL)
return NULL; /*
* Pull up redundant subclauses in OR-of-AND trees. We do this only
* within the top-level AND/OR structure; there's no point in looking
* deeper.
*/
/*
* 查找反复的OR操作。即化简条件语句。 * 假设WHERE条件为:
* (A=1 AND B=1) OR (A=1 AND C=1)
* 能够化简为:
* A=1 AND (B=1 OR C=1)
*
* 另外,这个函数中做了将树状的AND或OR语句平面化(flatten。或拉平)的工作,
* 这两个工作主要体如今pull_ands()和pull_ors()两个函数中。
*/
newqual = find_duplicate_ors(qual); return newqual;
} /*
* find_duplicate_ors
* Given a qualification tree with the NOTs pushed down, search for
* OR clauses to which the inverse OR distributive law might apply.
* Only the top-level AND/OR structure is searched.
*
* Returns the modified qualification. AND/OR flatness is preserved.
*/
static Expr *
find_duplicate_ors(Expr *qual)
{
/*
* “分支一:or_clause”
*
* 假设WHERE表达式中的主操作是OR,比如是例如以下形式:
* A=1 OR B=1 OR (C=1 AND D=1)
* 那么參数qual指针实际指向一个BoolExpr结构体。
typedef struct BoolExpr
{
Expr xpr; = 略
BoolExprType boolop; = OR_EXPR。即对以下的3个进行OR操作
List *args; = 3个,各自是A=1和 B=1和(C=1 AND D=1)
} BoolExpr;
*
* 这里的args是一个list。当中的3个元素的类型分别例如以下:
* 第一个是比較操作,类型是OpExpr
* 第二个是比較操作。类型是OpExpr
* 第三个是AND操作,是一个AND_EXPR类型的BoolExpr,递归调用时会处理
*
* 张大明确的blog:http://blog.csdn.net/shujiezhang
*/
if (or_clause((Node *) qual))
{
List *orlist = NIL;
ListCell *temp; /* Recurse */
/*
* 对BoolExpr中的三个条件分别进行递归处理。 * 在这里须要重点关注上例中的AND_EXPR类型的BoolExpr。由于在递归调用中,他将
* 触发下一个分支(分支二)。
*/
foreach(temp, ((BoolExpr *) qual)->args)
orlist = lappend(orlist, find_duplicate_ors(lfirst(temp))); /*
* Don't need pull_ors() since this routine will never introduce an OR
* where there wasn't one before.***这个原因没理解。***
*/
/* 详情见《PostgreSQL代码分析,查询优化部分,process_duplicate_ors》博文*/
return process_duplicate_ors(orlist);
}
/*
* “分支二:and_clause”
*
* 这里主要做了两个操作:
* 1) 假设子语句中有OR类型的子语句,则递归调用find_duplicate_ors。由于 子OR语句中
* 也许也能提取公共项。
* 2) 对AND操作进行拉平。 */
else if (and_clause((Node *) qual))
{
List *andlist = NIL;
ListCell *temp; /* Recurse */
/*
* 子语句中存在一系列OR的情况。
* 比如对于:
* A=1 AND ((B=1 AND C=1) OR (B=1 AND D=1))
* 这里的qual指针指向一个AND_EXPR类型的BoolExpr结构体,则
*
typedef struct BoolExpr
{
Expr xpr; = 略
BoolExprType boolop; = AND_EXPR,即对以下的2个进行AND操作
List *args; = 2个,各自是“A=1”和 “((B=1 AND C=1) OR (B=1 AND D=1))”
} BoolExpr;
*
* 对于当中的“((B=1 AND C=1) OR (B=1 AND D=1))”。在递归调用中,
* 会进入“分支一:or_clause”,进而转换为:
* B=1 AND (C=1 OR D=1)
*
* 张大明确的blog:http://blog.csdn.net/shujiezhang
*/
foreach(temp, ((BoolExpr *) qual)->args)
andlist = lappend(andlist, find_duplicate_ors(lfirst(temp))); /* Flatten any ANDs introduced just below here */
/*
* 拉平。
*
* 由于主语句是AND类型。子语句也是AND类型。所以能够直接把子语句拉到父节点。 *
*/
andlist = pull_ands(andlist);
/* The AND list can't get shorter, so result is always an AND */
return make_andclause(andlist);
}
else
return qual;
}

PostgreSQL代码分析,查询优化部分。

张大明确的blog:http://blog.csdn.net/shujiezhang

相关博文:PostgreSQL代码分析,查询优化部分,process_duplicate_ors

PostgreSQL代码分析,查询优化部分,canonicalize_qual的更多相关文章

  1. PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()

    PostgreSQL代码分析,查询优化部分. 这里把规范谓词表达式的部分就整理完了,阅读的顺序例如以下: 一.PostgreSQL代码分析,查询优化部分,canonicalize_qual 二.Pos ...

  2. SonarQube-5.6.3 代码分析平台搭建使用

    python代码分析 官网主页: http://docs.sonarqube.org/display/PLUG/Python+Plugin Windows下安装使用: 快速使用: 1.下载jdk ht ...

  3. 静态代码分析工具sonarqube+sonar-runner的安装配置及使用

    配置成功后的代码分析页面: 可以看到对复杂度.语法使用.重复度等等都做了分析,具体到了每一个方法和每一句代码. 四种使用方式: sonarqube + sonar-runner sonarqube + ...

  4. PostgreSQL内核分析——BTree索引

    文中附图参考至<PostgreSQL数据库内核分析> (一)概念描述 B+树是一种索引数据结构,其一个特征在于非叶子节点用于描述索引,而叶子节点指向具体的数据存储位置.在PostgreSQ ...

  5. 2017.4.18 静态代码分析工具sonarqube+sonar-runner的安装配置及使用

    配置成功后的代码分析页面: 可以看到对复杂度.语法使用.重复度等等都做了分析,具体到了每一个方法和每一句代码. 四种使用方式: sonarqube + sonar-runner sonarqube + ...

  6. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  7. pmd静态代码分析

    在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...

  8. [Asp.net 5] DependencyInjection项目代码分析-目录

    微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...

  9. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)

    Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...

随机推荐

  1. linux远程windows执行命令

    Linux下远程连接windows,执行命令 - Feng______的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/feng______/article/deta ...

  2. Casperjs循环执行(重复执行不退出)

    var casper = require('casper').create({ // pageSettings: { // loadImages: true, // loadPlugins: fals ...

  3. P1270 【“访问”美术馆】

    $\large{\text{一千个Oier程序中有一千种树形DP}}$ 思路都差不多的,但是每个人都有自己的状态定义与转移 不妨定义$dp[i][j]$表示,在$i$子树内,偷$j$张画,且不考虑根到 ...

  4. 把任意exe程序注册成windows系统服务

    某gae代理软件每次开机都需要手动启动,就算添加成开机启动项,在win8.1下权限的管理更加严格,开机时并不能成功启动软件(无人值守时开机),因此在网上搜索把exe注册成系统服务的办法,找到论坛两个帖 ...

  5. 第四届CCF软件能力认证

    1.图像旋转 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 输 ...

  6. django orm按天统计发布单数量

    夜深了,先上代码和数据,明天再实现可视化图表. from datetime import datetime, timedelta from django.http import JsonRespons ...

  7. Angular 2的表格控件

    Angular 2的表格控件 前端框架一直这最近几年特别火的一个话题,尤其是Angular 2拥有众多的粉丝.在2016年9月份Angular 2正式发布之后,大量的粉丝的开始投入到了Angular ...

  8. 主动学习(Active Learning)

    主动学习简介 在某些情况下,没有类标签的数据相当丰富而有类标签的数据相当稀少,并且人工对数据进行标记的成本又相当高昂.在这种情况下,我们可以让学习算法主动地提出要对哪些数据进行标注,之后我们要将这些数 ...

  9. docker commit 制作镜像

    docker commit -m="commit jdk" --author="gutianlangyu" ae56f6cad215 gutianlangyu/ ...

  10. ubuntu18.04 安装mysql不出现设置 root 帐户的密码问题(装)

    ubuntu18.04 安装mysql不出现设置 root 帐户的密码问题      https://blog.csdn.net/NeptuneClouds/article/details/80995 ...