Postresql11源码——语法解析器20191204

Makefile 打包文件,目录索引
SearchProject
ctrl+函数 查看想要祥读的源码

语法解析器

定义在parsenodes.h中的SelectStmt数据结构中,根据SQL语句会生成一棵语法解析树(parse tree)。
详细的数据结构如下:

typedef struct SelectStmt
{
	NodeTag		type;

	/*
	 * These fields are used only in "leaf" SelectStmts.
	   这些字段仅用于SelectStmts的叶子结点
	 */
	List	   *distinctClause; /* NULL,  DISTINCT ON 表达式列 */
	IntoClause *intoClause;		/* SELECT INTO 的目标*/
	List	   *targetList;		/* 结果集目标列表 (ResTarget) */
	List	   *fromClause;		/* FROM 子句 */
	Node	   *whereClause;	/* WHERE 限定条件 */
	List	   *groupClause;	/* GROUP BY 子句 */
	Node	   *havingClause;	/* HAVING 条件表达式 */
	List	   *windowClause;	/* WINDOW window_name AS (...), ... */

	/* 
      *在上面一个值列表的“叶子”结点中,上面字段全部是null,而这个字段会被设置。
      *注意,这个子列表表达式元素都没有ResTarget的修饰的表达式类型。
	  *还要注意,无论值列表的内容是什么,列表元素都可能置为DEFAULT(表示一个SetToDefault节点)
	  *由分析阶段决定是否合法并拒绝
	 */
	List	   *valuesLists;	/* 未转换的表达式列表 */

	/*
	 * 这些字段同时被用于SelectStmts叶节点与SelectStmts上层节点中使用。
	 */
	List	   *sortClause;		/* sort子句 ( SortBy's列表) */
	Node	   *limitOffset;	/* #需要跳过的元组数目 */
	Node	   *limitCount;		/* # 需要返回的元组数目 */
	List	   *lockingClause;	/* FOR UPDATE (Locking子句的列表) */
	WithClause *withClause;		/* WITH 子句*/

	/*
	 * 这些字段仅用于SelectStmts上层
	 */
	SetOperation op;			/* set操作类型*/
	bool		all;			/* 是否指明ALL选项 */
	struct SelectStmt *larg;	/* 左child节点 */
	struct SelectStmt *rarg;	/* 右child节点 */
	/* 最终这些字段都会与查询语句中条件相互对应*/
} SelectStmt;

语法解析树示例:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值