自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 openGauss学习——优化 UNION ALL 语句

在本篇博客中,我对查询规划的预处理过程中对UNION ALL语句的优化过程进行了简单介绍。

2023-10-14 01:05:45 274 2

原创 openGauss学习——消除外连接

在本篇中我详细介绍了SQL查询规划的预处理过程中,对查询树消除外连接两种优化策略。

2023-10-14 01:01:08 133

原创 openGauss学习——减少order by语句

在本篇博客中我进行了对查询规划预处理过程中减少order by语句优化过程的学习与介绍。

2023-10-14 00:55:44 99

原创 openGauss学习——解析树结构补充

rtindex:RTE结点也拥有这个字段,其表示range table中对应的某个实体RTE结点的索引值,上面所述的T_RangeTblRef类型的RTE结点也是通过这个字段来实现与range table中某个实体RTE的一对一绑定。在openGauss中,查询语句通常由多个目标属性组成,每个目标属性都包含了属性名、表达式以及其他相关信息,而TargetEntry用于表示查询中的目标属性,帮助标识和处理目标属性在查询结果中的位置、名称以及其他相关信息。字段 quals 是用于存储连接的条件表达式树的。

2023-10-14 00:51:12 75

原创 openGauss学习——替换空FROM

之后调用函数list_make1(),通过一个新建的初始RTE结点创建一个空的List* 类型结构,并让当前结点的jointree->fromlist字段指向这个空表(原先其值为NULL,是一个空指针),并且这个空表与刚刚添加的RTE结点是对应的。因为其并不与任何的实体关系表绑定,也不包含任何可以被引用的元组条目,是一张空表。函数的作用是,如果当前的查询结点(输入的查询结点)的jointree是空树,即结点的fromlist字段是一个空指针,那么替换其为将其指向一个RTE_RESULT类型的“假”关系表。

2023-10-14 00:47:05 50

原创 openGauss学习——子链接提升

在本篇博客中,我对openGauss SQL查询优化的子链接提升部分进行了学习和介绍。个人能力有限,如有错误烦请指出。

2023-10-14 00:43:12 178

原创 openGauss学习——查询规划主处理流程架构

在本篇博客中我对 subquery_planner() 函数的主要步骤流程以及查询优化的主处理逻辑和代码架构进行了学习和解读。个人能力有限,如有错误烦请不吝指出。

2023-10-14 00:36:02 65

原创 openGauss学习——optimizer主调函数

在本篇博客中我对optimizer的主调函数进行了简单介绍。下一篇博客中我会对函数 subquery_planner() 进行学习和解读工作。

2023-10-14 00:30:01 43

原创 openGauss学习——optimizer 查询优化概述

在本篇博客中我对openGauss查询优化optimizer模块进行了简要概述。在之后的博客中我会开展对这一部分相关源文件的学习和解读工作。

2023-10-14 00:26:21 120 1

原创 openGauss学习——rewriteSupport.cpp的简要解析

在本篇博客中,我对查询重写辅助函数文件rewriteSupport.cpp中的函数进行了注释和解读工作。

2023-10-14 00:23:47 37 1

原创 openGauss学习——pg锁机制及rewriteRemove.cpp解读

在本篇博客中我对查询重写中的规则移除函数 RemoveRewriteRuleById() 进行了解读,并简单介绍了 PostgreSQL 中的几种锁机制。

2023-10-14 00:21:36 76 1

原创 openGauss学习——rewriteHandler.cpp解读(4)

在本篇博客中,我对rewriteHandler.cpp文件中的函数fireRIRrules进行了详细的学习和解读,并对行级安全策略R.L.S进行了简要介绍。

2023-10-14 00:19:21 41 1

原创 openGauss学习——rewriteHandler.cpp解读(3)

在本篇博客中,我对查询重写涉及的几个数据结构和概念RTE、range table、RTEkind、Relation进行了简单的补充说明。在下一篇博客中,我会继续对rewriteHandler.cpp的文件内容进行学习和解读。

2023-10-14 00:14:16 43 1

原创 openGauss学习——rewriteHandler.cpp解读(2)

在本篇博客中我对文件rewriteHandler.cpp中函数AcquireRewriteLocks的进行了学习解读以及相应的知识介绍。在下一篇博客中,我会继续对rewriteHandler.cpp的文件内容进行学习和解读。

2023-10-13 23:40:01 26

原创 openGauss学习——rewriteHandler.cpp解读(1)

在本篇博客中我对查询重写主模块rewriteHandler.cpp中的主入口点函数QueryRewrite的逻辑进行了详细的解读和相应的知识介绍。在下一篇博客中,我会继续对rewriteHandler.cpp的文件内容进行学习和解读。

2023-10-13 23:32:10 48

原创 openGauss学习——rewriter查询重写概述

在本篇博客中,我对SQL查询重写模块rewriter进行了简单概述。在接下来的几篇博客中,我会对目录下的文件进行学习和解读。

2023-10-13 23:10:10 182

原创 openGauss学习——SQL查询解析总结

通过这么多天的学习,我对openGauss SQL引擎中的查询解析parser部分形成了比较清晰的认识和知识架构,对相关源代码的文件内容、函数细节和各模块的调用关系也进行了比较详实的学习和解读。回到最初的起点,我将openGauss SQL parser的模块划分和几个主要函数、文件之间的调用关系总结如下图,同时也标志着我完成了对parser模块的学习和解读工作。

2023-10-13 23:01:32 132

原创 openGauss学习—— analyze.cpp 解析

先来关注函数功能和入口出口参数;从前面的分析我们已经总结出,语义解析的入口函数(也是主流程函数)parse_analyze / parse_analyze_varparams会调用transformTopLevelStmt函数,而transformTopLevelStmt会调用transformStmt函数,将语法树转化为不同的Stmt结构体,调用对应的语义分析函数进行处理。而transformStmt函数会根据NodeTag的值,将语法树转化为不同的Stmt结构体,调用对应的语义分析函数进行处理。

2023-10-13 22:56:38 62

原创 openGauss学习—— parse_param.cpp 解析

对于固定参数FixedParamState类型,其只有两个成员变量,分别是存储参数类型OID的OID指针paramTypes和参数的条目数量numParams。另外值得注意的是,FixedParamState中的paramTypes成员是Oid类型的一级指针,而在VarParamState类型中这一成员为Oid的二级指针。函数功能是将包含查询的引用references转化为可变参数结构VarParamState,即输入查询引用的参数,为其构造VarParamState结构。

2023-10-13 22:49:54 40

原创 openGauss学习—— parse_oper.cpp 解析

在本篇博客中,我进行了对SQL语法分析中操作符处理相关内容的探索,并对 parse_oper.cpp 文件中的部分函数进行了学习和注解工作。

2023-10-13 22:42:21 57

原创 openGauss学习——语法解析简述

在raw_parser的每次执行过程中会创建一个base_yy_extra_type类型的变量,其成员变量包括core scanner所需的结构变量、函数base_yylex所需的结构变量(关于函数功能上一篇博客中有相关解析)以及存储原始解析所得语法树的List*类型变量。语法解析正是在词法解析的基础上,对每一条SQL查询语句生成对应的抽象语法树;在之前的博客中我已经完成了对SQL parser的工作流程和词法解析方面知识的学习和总结,以及相关工具文件和SQL原始解析主流程函数等的解析工作。

2023-10-13 22:35:33 55

原创 openGauss学习—— parser.cpp 源码解读

函数的内部逻辑大致为:跳过查询语句前的空格和注释部分(注意注释后也可能有空格,所以需要再次去除空格),若此时查询语句的开头为一个分号,那么判断此为一句空查询,返回true,否则返回false。通过观察注释和具体的代码行为,我们不难理解这个函数的作用:对于多个查询语句所组成的查询语句块,指定位置顺序,取出对应顺序的单个查询语句。接下来循环体的作用是获取多个查询语句组成的语句块中由*stmt_num指定的那一条查询语句,如果获取成功,进行拷贝工作。功能描述:从多个查询语句组成的查询语句块中取出单个的查询语句。

2023-10-13 22:16:38 87

原创 openGauss学习——词法解析中转义字符的处理

截至目前我已经完成了对SQL parser词法解析部分内容的学习以及对scan.l,kwlookup.cpp,keywords.cpp,scansup.cpp等文件内容的解析。通过这一段的学习,我对词法解析的工作原理有了基本的掌握。

2023-10-13 22:09:01 207

原创 openGauss学习——词法解析的关键字处理

在本篇博客中我对词法解析中的关键字处理过程相关的函数文件keywords.cpp和kwlookup.cpp的文件内容以及部分代码细节进行了解析。在下一篇博客中,我会对词法解析中转义字符处理过程相关的函数文件进行学习和解读。

2023-10-13 22:03:02 137

原创 openGauss学习——对flex源文件 scan.l 的简单解析

在 %{ … %} 所包含的代码块中,内容都是C语言代码,flex会将代码照搬到生成的C文件中。scan.l代码部分进行了对头文件的声明并定义了一些函数声明和宏,并且重定义了一些flex的宏,从而改变程序的规则。下为scan.l头部的代码部分(省略了注释、一些函数声明和宏定义),可以看到其中进行了对头文件的声明、静态函数和外部函数的声明、定义新的宏以及对已有的宏的重定义工作。

2023-10-13 21:59:28 78

原创 openGauss学习——原始解析工具flex&bison

定义部分可以进行声明和选项设置。另外,如果有被 “%{” 和 “%}” 包围的部分,其中的内容会被完整地复制到 .yy.c 生成文件的开头,通常会用来放置include、define的信息。%{%}对于bison文件,在这之后,一般还要进行token设置。%token 记号;。记号大概就是每个语法树的节点,比如一个变量、一个数字/字符串常量、一个运算符,这些记号将被用于规则部分:通常是:flex中匹配到某个词,然后{return NUMBER;}返回一个记号,然后在bison的规则中查找应该进行的动作。

2023-10-13 21:55:04 49

原创 openGauss学习——SQL parser 模块结构及解析主流程

查询解析大致分为三个步骤:词法解析、语法解析和语义解析,主流程大致如下:openGauss利用flex&bison工具生成原始解析器,查询语句先通过原始解析器完成词法解析和语法解析,生成原始语法树;再通过语义分析对语法树进行翻译和扩充,得到对应的查询树后交由executor执行查询任务。parser所在目录:/src/common/backend/parser。本篇对于parser下各模块的功能分配以及查询解析主流程进行简要分析概括。

2023-10-13 21:48:56 151

原创 openGauss学习——SQL引擎概述

在本篇博客中我以自身学习的视角对openGauss SQL引擎做了简要的概括,新手上路,目光所及,短寸之间。如有失误之处,烦请不吝斧正。

2023-10-13 21:45:24 494 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除