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

一、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. Number of Airplanes in the Sky

    Given an interval list which are flying and landing time of the flight. How many airplanes are on th ...

  2. USB的挂起和唤醒(Suspend and Resume)【转】

    转自:http://m.blog.csdn.net/blog/luckywang1103/25244091 USB协议的第9章讲到USB可见设备状态[Universal Serial Bus Spec ...

  3. css-position属性实例1

    一:position说明 position fixed 实现固定在某个位置 正常情况写两个div是在一层中,通过position属性,可以实现分两层和固定,就像在墙上贴了一层纸,就分了两层了. pos ...

  4. Android P 功能和 API

    Android P 功能和 API Android P 为用户和开发者引入众多新特性和新功能. 本文重点介绍面向开发者的新功能. 要了解新 API,请阅读 API 差异报告或访问 Android AP ...

  5. 洛谷P4549裴蜀定理

    传送门 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...

  6. kafka在zookeeper中存储结构

    1.topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 Schema:   {    "version": ...

  7. bzoj 1103

    题目大意:有一棵树根为1,刚开始每条边的权值为1,  现在有m + n - 1 个操作, A :x  y  , 将x和y相连的边权值变为1, W:x, 询问x到1路径上的权值和. 思路 : 方法一: ...

  8. date命令使用文档

    date命令的帮助信息 [root@localhost source]# date --help用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] ...

  9. Sqoop的安装及简单使用

    SQOOP是用于对数据进行导入导出的. (1)把MySQL.Oracle等数据库中的数据导入到HDFS.Hive.HBase中   (2)把HDFS.Hive.HBase中的数据导出到MySQL.Or ...

  10. Gitlab Webhooks, External Services, and API(二)

    一. 使用webhooks webhook 是一个API的概念,并且变得越来越流行.我们能用事件描述的事物越多,webhook的作用范围也就越大.webhook作为 个轻量的事件处理应用,正变得越来越 ...