语法解析器解析的语法由查询解析器进行语义分析,产生一棵查询树。
查询解析器根节点在parsenode.h中定义的Query数据结构,该数据结构包含对应查询的元数据,比如命令类型(Select/Inert等),还包含一些叶子节点,叶子节点由列表组成,包含了与特定子句相对应的数据。
/*
* Query -
* 解析分析器将所有的语句转换为一棵查询树,用于重写器和计划器下一步的处理过程中。
* 公用程序语言(例如:不可优化语句)会被设置为utilityStmt字段,而Query结构本身基本上是空的。
* 计划处理过程会将一个查询树通过一个PlannedStmt节点转换为一棵查询树,查询结构体不会被执行器用到。
*/
typedef struct Query
{
NodeTag type;
CmdType commandType; /* select|insert|update|delete|utility */
QuerySource querySource; /*查询源,即我来自哪 */
uint64 queryId; /* query 识别符(可由插件配置) */
bool canSetTag; /* 我设置了命令结构标志吗? */
Node *utilityStmt; /* 如果 commandType == CMD_UTILITY,则不可为空,且为不可优化语句 */
int resultRelation; /* 目标关系的索引表 对于
* INSERT/UPDATE/DELETE; 0 for SELECT */
bool hasAggs; /* 是否在目标列表或having表达式中有聚合函数 */
bool hasWindowFuncs; /* 在tlist是否包含窗口函数 */
bool hasTargetSRFs; /* 在tlist是否有set-returning 函数 */
bool hasSubLinks; /* 是否含有自连接类型子查询*/
bool hasDistinctOn; /* 是否含有来自于DISTINCT ON的distinct子查询 */
bool hasRecursive; /* 是否含有具体化的 WITH RECURSIVE(即递归) */
bool hasModifyingCTE; /* 是否在WITH子句中含有INSERT/UPDATE/DELETE */
bool hasForUpdate; /* 是否含有具体的FOR [KEY] UPDATE/SHARE*/
bool hasRowSecurity; /* 重写器是否需应用RLS(行安全)策略*/
List *cteList; /* WITH CTE列表 */
List *rtable; /* 范围项目实例列表 */
FromExpr *jointree; /* 表连接树(FROM and WHERE子句) */
List *targetList; /* 目标列表 (TargetEntry列表) */
OverridingKind override; /* OVERRIDING 子句 */
OnConflictExpr *onConflict; /* ON CONFLICT DO [NOTHING | UPDATE] */
List *returningList; /* 返回值列表 (of TargetEntry) */
List *groupClause; /* SortGroupClause的列表 */
List *groupingSets; /*如有代表,则有GroupingSet列表 */
Node *havingQual; /* 限定条件应用到groups中 */
List *windowClause; /* WindowClause的列表 */
List *distinctClause; /*SortGroupClause的列表 */
List *sortClause; /* SortGroupClause列表 */
Node *limitOffset; /* #跳过结果元组(int8 表达式) */
Node *limitCount; /* # 返回结果元组 (int8 表达式) */
List *rowMarks; /* RowMarkClause列表*/
Node *setOperations; /* 如果是UNION/INTERSECT/EXCEPT的顶级查询,则为set-operation(集合操作)树 */
List *constraintDeps; /* 确认查询语义是否合法时,所依赖约束对象的oid类别*/
List *withCheckOptions; /* WithCheckOption列表, which are 在重写器过程中添加,并且不会作为查询的一部分写出*/
/*
* 以下两个字段标识包含此查询的源文本字符串部分。他们仅用于顶级查询,而不是子查询。
* 当不是集合时,他们有可能都为0或者如果无,则为-1。
*/
int stmt_location; /* 起始定位, -1 如果无则默认为-1 */
int stmt_len; /* 字节长度; 0 意味着 "rest of string" */
} Query;
- targetLists 是查询结果中列的列表,在本例中即“id” 和“name”,
- rtable 是该查询所用到的关系列表,本例为“user_table”
- 连接树jointree 存储与from 和where 子句相关信息
- 排序子句sortclause 是SortGroupClause 结构体相关信息