2008年11月16日星期日

PostgreSql源码学习(6)

PG源码之parser(3)

以下是几个小例子(有自己写的,有查资料得到的):
select ename from emp e
树的顶端节点是 SelectStmt 节点,没有查询条件,所以没有别的节点。

select ename from emp where empno>2000

树的顶端节点是 SelectStmt 节点,由于有范围查询条件,使用SQL 查询的 where 子句构建的操作符树,这个操作符树附加到了 SelectStmt 节点的字段 qual 上。为在查询里出现的常量(2000)条款创建一个 Const 节点(makeintconst),存放常量值。

select e.ename, d.dname
from EMP e, dept d
where e.empno > 2000 and e.deptno = d.deptno;


树的顶端节点是 SelectStmt 节点。对每个在 SQL 查询的 from子句里出现的元素创建一个 RangeVar 节点,存放 alias(别名)的名称和一个指向一个存放关系名称的 RelExpr 节点的指针。所有 RangeVar 节点都收集到一个列表里,然后附加到 SelectStmt 节点的 fromClause 字段上。

对于 SQL 查询里面的 select列表 里出现的每个元素都创建一个 ResTarget 节点,存放一个指向 Attr 节点的指针。Attr 节点存放元素的关系名称和一个指向存放着字段名称的 Value 节点的指针。所有 ResTarget 节点都收集到一个列表里,然后链接到 SelectStmt 节点的 targetList 字段里。

SQL 查询的 where 子句构建的操作符树,这个操作符树附加到了 SelectStmt 节点的字段 qual 上。操作符树的顶端节点是一个代表 AND 操作的 A_Expr 节点。这个节点有两个后继节点, lexpr 和 rexpr 分别指向两个子树。附加到 lexpr 的子树代表条件 empno > 2000 而附加到 rexpr 的子树代表e.deptno = d.deptno。为每个字段创建一个 Attr 节点,存放关系名和一个指向存放着字段名的 Value 节点的指针。为在查询里出现的常量条款创建一个 Const 节点,存放常量值。

没有评论: