parser
- 解析SQL语句,生成 PT_xx AST 树
- 紧接着使用 do_contextualize 转换为 Query_block tree
- 之后生成 Sql_cmd,这是最终运行时的一个包装类,主要包含一个 Query_result
- 怎么理解,和 pg 的portal有啥联系
怎么理解 Query_expression 和 Query_block 组合的逻辑树?
以下面的 SQL 为例
drop table if exists table1, table2, table3, table1_1_1, table1_1_2, table2_1_1_1_1, table2_1_1;
create table table1(id int, field int);
create table table2(f2 int, field int);
create table table3(id int, field int);
create table table1_1_1(id int);
create table table1_1_2(id int);
create table table2_1_1_1_1(id int, f1 int, f2 int);
create table table2_1_1(id int, f1 int, f2 int, f3 int);
select *
from table1
where table1.field IN (select * from table1_1_1 union
select * from table1_1_2)
union
select *
from table2
where table2.field=(select (select f1 from table2_1_1_1_1
where table2_1_1_1_1.f2=table2_1_1.f3)
from table2_1_1
where table2_1_1.f1=table2.f2)
union
select * from table3;
parse_sql: ast:
Query_term_union: 0x712e58b76b30 parent: (nil)
qb: 0x712e58b76fc0 join: (nil)
first distinct index: 1 last distinct index: 2
Query_block: 0x712e58a771c8 parent: 0x712e58b76b30 with subqueries qb: 0x712e58a771c8 join: (nil)
Query_term_union: 0x712e58b9ab90 parent: (nil)
qb: 0x712e58b9b020 join: (nil)
first distinct index: 1 last distinct index: 1
Query_block: 0x712e58b67850 parent: 0x712e58b9ab90 qb: 0x712e58b67850 join: (nil)
Query_block: 0x712e58b693a0 parent: 0x712e58b9ab90 qb: 0x712e58b693a0 join: (nil)
Query_block: 0x712e58b9c930 parent: 0x712e58b76b30 with subqueries qb: 0x712e58b9c930 join: (nil)
Query_block: 0x712e58b9dee8 parent: (nil) with subqueries qb: 0x712e58b9dee8 join: (nil)
Query_block: 0x712e58b9e870 parent: (nil) qb: 0x712e58b9e870 join: (nil)
Query_block: 0x712e58b753f0 parent: 0x712e58b76b30 qb: 0x712e58b753f0 join: (nil)
Query_term_union: 0x742dd804a400 parent: 0x0 qb: 0x742dd804a890
Query_block: 0x742dd808ade8 parent: 0x742dd804a400 tables: 'table1'
Query_term_union: 0x742dd8075240 parent: 0x0 qb: 0x742dd80756d0
Query_block: 0x742dd8063650 parent: 0x742dd8075240 tables: 'table1_1_1'
Query_block: 0x742dd80651a0 parent: 0x742dd8075240 tables: 'table1_1_2'
Query_block: 0x742dd8076fe0 parent: 0x742dd804a400 tables: 'table2'
Query_block: 0x742dd8078598 parent: 0x0 tables: 'table2_1_1'
Query_block: 0x742dd8078f20 parent: 0x0 tables: 'table2_1_1_1_1'
Query_block: 0x742dd8048cc0 parent: 0x742dd804a400 tables: 'table3'
(gdb) my qtree pc.select->master->m_query_term
Query_term_union: 0x742dd804a400 parent: 0x0 qb: 0x742dd804a890
Query_block: 0x742dd808ade8 parent: 0x742dd804a400 tables: 'table1'
Query_term_union: 0x742dd8075240 parent: 0x0 qb: 0x742dd80756d0
Query_block: 0x742dd8063650 parent: 0x742dd8075240 tables: 'table1_1_1'
Query_block: 0x742dd80651a0 parent: 0x742dd8075240 tables: 'table1_1_2'
Query_block: 0x742dd8076fe0 parent: 0x742dd804a400 tables: 'table2'
Query_block: 0x742dd8078598 parent: 0x0 tables: 'table2_1_1'
Query_block: 0x742dd8078f20 parent: 0x0 tables: 'table2_1_1_1_1'
Query_block: 0x742dd8048cc0 parent: 0x742dd804a400 tables: 'table3'
(gdb) my qtree pc.select
Query_block: 0x742dd8048cc0 parent: 0x742dd804a400 tables: 'table3'
(gdb) my qtree pc.select->link_next
Query_block: 0x742dd8078f20 parent: 0x0 tables: 'table2_1_1_1_1'
(gdb) my qtree pc.select->link_next->link_next
Query_block: 0x742dd8078598 parent: 0x0 tables: 'table2_1_1'
Query_block: 0x742dd8078f20 parent: 0x0 tables: 'table2_1_1_1_1'
(gdb) my qtree pc.select->link_next->link_next->link_next
Query_block: 0x742dd8076fe0 parent: 0x742dd804a400 tables: 'table2'
Query_block: 0x742dd8078598 parent: 0x0 tables: 'table2_1_1'
Query_block: 0x742dd8078f20 parent: 0x0 tables: 'table2_1_1_1_1'
(gdb) my qtree pc.select->link_next->link_next->link_next->link_next
Query_block: 0x742dd80651a0 parent: 0x742dd8075240 tables: 'table1_1_2'
(gdb) my qtree pc.select->link_next->link_next->link_next->link_next->link_next
Query_block: 0x742dd8063650 parent: 0x742dd8075240 tables: 'table1_1_1'
(gdb) my qtree pc.select->link_next->link_next->link_next->link_next->link_next->link_next
Query_block: 0x742dd808ade8 parent: 0x742dd804a400 tables: 'table1'
Query_term_union: 0x742dd8075240 parent: 0x0 qb: 0x742dd80756d0
Query_block: 0x742dd8063650 parent: 0x742dd8075240 tables: 'table1_1_1'
Query_block: 0x742dd80651a0 parent: 0x742dd8075240 tables: 'table1_1_2'
(gdb) my qtree *pc.select->link_next->link_next->link_next->link_next->link_next->link_next->link_prev
Query_block: 0x742dd808ade8 parent: 0x742dd804a400 tables: 'table1'
Query_term_union: 0x742dd8075240 parent: 0x0 qb: 0x742dd80756d0
Query_block: 0x742dd8063650 parent: 0x742dd8075240 tables: 'table1_1_1'
Query_block: 0x742dd80651a0 parent: 0x742dd8075240 tables: 'table1_1_2'
(gdb) my qtree *pc.select->link_next->link_next->link_next->link_next->link_next->link_prev
Query_block: 0x742dd8063650 parent: 0x742dd8075240 tables: 'table1_1_1'
(gdb) my qtree *pc.select->link_next->link_next->link_next->link_next->link_prev
Query_block: 0x742dd80651a0 parent: 0x742dd8075240 tables: 'table1_1_2'
(gdb) my qtree *pc.select->link_next->link_next->link_next->link_prev
Query_block: 0x742dd8076fe0 parent: 0x742dd804a400 tables: 'table2'
Query_block: 0x742dd8078598 parent: 0x0 tables: 'table2_1_1'
Query_block: 0x742dd8078f20 parent: 0x0 tables: 'table2_1_1_1_1'
(gdb) my qtree *pc.select->link_next->link_next->link_prev
Query_block: 0x742dd8078598 parent: 0x0 tables: 'table2_1_1'
Query_block: 0x742dd8078f20 parent: 0x0 tables: 'table2_1_1_1_1'
(gdb) my qtree *pc.select->link_next->link_prev
Query_block: 0x742dd8078f20 parent: 0x0 tables: 'table2_1_1_1_1'
(gdb) my qtree *pc.select->link_prev
Query_block: 0x742dd8048cc0 parent: 0x742dd804a400 tables: 'table3'
Query_block
* master 指向的是包含当前的 Query_block 的 Query_expression
* slave 指向的是当前 Query_block 的子查询的 Query_expression,可能是 union,也可能是子查询
* next 指向的是同属于同一个 Query_block 的链表
* link_next,link_prev 是维护所有当前语句中的 Query_block 的双向链表
Query_expression
* m_query_term 当前 expression 的主要内容,可能是一个 union,或者就是一个 Query_block
* 这个结构体只是为了维护同属于一个查询的 Query_block 的关系,暂时不了解其他作用,完全可以由 block 自己维护
总结
- lex->unit 指向的是当前整个完整的 SQL 语句的 Query_expression
- Query_block
- master 指向的是包含当前的 Query_block 的 Query_expression
- slave 指向的是当前 Query_block 的子查询的 Query_expression,可能是 union,也可能是子查询
- next 指向的是同属于同一个 Query_expression 的 block 链表
- link_next,link_prev 是维护所有当前语句中的 Query_block 的双向链表
- Query_expression
- m_query_term 当前 expression 的主要内容,可能是一个 union,或者就是一个 Query_block
- 这个结构体只是为了维护同属于一个查询的 Query_block 的关系,暂时不了解其他作用,完全可以由 block 自己维护
- slave 指向当前所属的第一个 Query_block
- master 指向包含当前 Query_expression 的 Query_block