Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

parser

  1. 解析SQL语句,生成 PT_xx AST 树
  2. 紧接着使用 do_contextualize 转换为 Query_block tree
  3. 之后生成 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