这一张是介绍 query processing 的,也是我一直非常感兴趣的一个内容。
PostgresSQL 的 query 处理模块包含 5 个子系统:
让我们从一个例子说起:
SELECT id, data FROM tbl_a WHERE id < 300 ORDER BY data;
这样的语句的根节点是 SelectStmt
,它的 parse tree 如下:
注意 Parser 只负责检查语法,不会查出 table 名并不存在这样的问题。这样的语义问题会被留给 analyzer
Query tree 的根节点是一个名叫 Query
的结构体,这个结构体里面保存了 metadata,例如 query 的类型(SELECT
, INSERT
之类的)。除了类型还有一些别的叶节点,拿上面的 select 语句的举例:
简单介绍一下这里的每个节点的作用:
targetList
表示结果的所有列。如果输入的 query 使用的是 *
,analyzer 会显式替换成所有的列。rtable
(range table) 表示的是 query 中使用的 relations。在这个例子中,这里存储了 tbl_a
这个表的一些信息。jointree
存储了 FROM
和 WHERE
语句sortClause
则是 SortGroupClause
的 listRewriter 实现了 rule system。rule system 本身很有趣,但是这一章我们将不会介绍 rewriter 和 rule system 以避免这章变得过长。