Postresql11源码——20191204查询分析器

PostgreSQL11的查询分析器对语法解析后的信息进行语义分析,生成Query数据结构。此结构包含命令类型、列列表、关系列表及连接和排序信息,如在示例中展示的'query tree',涉及'id'和'name'列,'user_table'关系,以及from和where条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语法解析器解析的语法由查询解析器进行语义分析,产生一棵查询树。
查询解析器根节点在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;

在这里插入图片描述

  1. targetLists 是查询结果中列的列表,在本例中即“id” 和“name”,
  2. rtable 是该查询所用到的关系列表,本例为“user_table”
  3. 连接树jointree 存储与from 和where 子句相关信息
  4. 排序子句sortclause 是SortGroupClause 结构体相关信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值