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;

語法解析樹示例:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章