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