![]() |
MySQL 8.0.43
Source Code Documentation
|
#include "sql/join_optimizer/materialize_path_parameters.h"#include "sql/sql_list.h"#include "sql/sql_union.h"#include "sql/table.h"Go to the source code of this file.
Classes | |
| class | Query_term |
| Query term tree structure. More... | |
| class | Query_term_set_op |
| Common base class for n-ary set operations, including unary. More... | |
| class | Query_term_union |
| Node type for n-ary UNION. More... | |
| class | Query_term_intersect |
| Node type for n-ary INTERSECT. More... | |
| class | Query_term_except |
| Node type for n-ary EXCEPT. More... | |
| class | Query_term_unary |
| A <query primary> which is a parenthesized query expression (aka qe) body with order by clause and/or limit/offset clause and the qe body is not a binary set operation (union, except, intersect), but is viewed here as a degenerate set operation; i.e. More... | |
| class | Query_terms< visit_order, visit_leaves > |
| Containing class for iterator over the query term tree. More... | |
| class | Query_terms< visit_order, visit_leaves >::Query_term_iterator |
| The iterator class itself is private. More... | |
Enumerations | |
| enum | Query_term_type { QT_QUERY_BLOCK , QT_UNARY , QT_INTERSECT , QT_EXCEPT , QT_UNION } |
| This class hierarchy is used to represent SQL structures between <query expression> and <query specification>. More... | |
| enum | Visit_order { QTC_POST_ORDER , QTC_PRE_ORDER } |
| Query term iterator template argument type: how to visit nodes in tree. More... | |
| enum | Visit_leaves { VL_VISIT_LEAVES , VL_SKIP_LEAVES } |
| Query term iterator template argument type: whether to visit leaf nodes. More... | |
| enum Query_term_type |
This class hierarchy is used to represent SQL structures between <query expression> and <query specification>.
The class Query_expression represents <query expression> and the class Query_block represents <query specification>, <table value constructor> and <explicit table>, cf. definitions in sql_lex.h. Originally, MySQL supported only one set operation, UNION. This was implicitly represented by having one Query_expression object own several Query_block objects via next pointers. This made things simple, but limited us to left-deep nesting of unions, and also from representing INTERSECTION and EXCEPT, as well as nesting several layers of <query primary>s containing <query expression body>s, e.g.
(((SELECT a,b FROM t) ORDER BY a LIMIT 5) ORDER BY -b LIMIT 3) ORDER BY a;
could not be supported. With the present class hierarchy we enable the full set of set operations and arbitrary nesting, as allowed by the SQL grammar, viz:
<query expression> ::=
[ <with clause> ] <query expression body>
[ <order by clause> ] [ <limit/offset> ]
<query expression body> ::=
<query term>
| <query expression body> UNION [ ALL | DISTINCT ]
[ <corresponding spec> ] <query term>
| <query expression body> EXCEPT [ ALL | DISTINCT ]
[ <corresponding spec> ] <query term>
<query term> ::=
<query primary>
| <query expression body> INTERSECT [ ALL | DISTINCT ]
[ <corresponding spec> ] <query primary>
<query primary> ::=
<simple table>
| <left paren> <query expression body>
[ <order by clause> ] [ <limit/offset (*)> ]
<right paren>
<simple table> ::=
<query specification>
| <table value constructor>
| <explicit table>
(*) MySQL syntax and semantics. The standard uses /<result offset clause/> and
\<fetch first clause\>.Note that INTERSECT binds tighter than UNION and EXCEPT. Now, let's turn to how these structures are represented in MySQL. The node types are enumerated by Query_term_type. The nodes themselves by the class hierarchy rooted in Query_term (abstract). Node type of the query term tree nodes
| enum Visit_leaves |
| enum Visit_order |