MySQL  8.0.19
Source Code Documentation
PT_query_expression Class Referencefinal

#include <parse_tree_nodes.h>

Inheritance diagram for PT_query_expression:
PT_query_primary PT_query_expression_body Parse_tree_node_tmpl< Context >

Public Member Functions

 PT_query_expression (PT_with_clause *with_clause, PT_query_expression_body *body, PT_order *order, PT_limit_clause *limit)
 
 PT_query_expression (PT_query_expression_body *body, PT_order *order, PT_limit_clause *limit)
 
 PT_query_expression (PT_query_expression_body *body)
 
bool contextualize (Parse_context *pc) override
 
bool is_union () const override
 
bool has_into_clause () const override
 
bool can_absorb_order_and_limit (bool order, bool limit) const override
 True if this query expression can absorb an extraneous order by/limit clause. More...
 
bool is_table_value_constructor () const override
 
PT_insert_values_listget_row_value_list () const override
 
- Public Member Functions inherited from Parse_tree_node_tmpl< Context >
virtual ~Parse_tree_node_tmpl ()
 
bool is_contextualized () const
 
virtual bool contextualize (Context *pc)
 Do all context-sensitive things and mark the node as contextualized. More...
 
void error (Context *pc, const POS &pos) const
 syntax_error() function replacement for deferred reporting of syntax errors More...
 
void error (Context *pc, const POS &pos, const char *msg) const
 syntax_error() function replacement for deferred reporting of syntax errors More...
 
void errorf (Context *pc, const POS &pos, const char *format,...) const
 syntax_error() function replacement for deferred reporting of syntax errors More...
 

Private Member Functions

bool contextualize_order_and_limit (Parse_context *pc)
 Contextualizes the order and limit clauses, re-interpreting them according to the rules. More...
 

Private Attributes

PT_query_expression_bodym_body
 
PT_orderm_order
 
PT_limit_clausem_limit
 
PT_with_clausem_with_clause
 

Additional Inherited Members

- Public Types inherited from Parse_tree_node_tmpl< Context >
typedef Context context_t
 
- Static Public Member Functions inherited from Parse_tree_node_tmpl< Context >
static void * operator new (size_t size, MEM_ROOT *mem_root, const std::nothrow_t &arg=std::nothrow) noexcept
 
static void operator delete (void *ptr, size_t size)
 
static void operator delete (void *, MEM_ROOT *, const std::nothrow_t &) noexcept
 
- Protected Member Functions inherited from Parse_tree_node_tmpl< Context >
 Parse_tree_node_tmpl ()
 

Constructor & Destructor Documentation

◆ PT_query_expression() [1/3]

PT_query_expression::PT_query_expression ( PT_with_clause with_clause,
PT_query_expression_body body,
PT_order order,
PT_limit_clause limit 
)
inline

◆ PT_query_expression() [2/3]

PT_query_expression::PT_query_expression ( PT_query_expression_body body,
PT_order order,
PT_limit_clause limit 
)
inline

◆ PT_query_expression() [3/3]

PT_query_expression::PT_query_expression ( PT_query_expression_body body)
inlineexplicit

Member Function Documentation

◆ can_absorb_order_and_limit()

bool PT_query_expression::can_absorb_order_and_limit ( bool  order,
bool  limit 
) const
inlineoverridevirtual

True if this query expression can absorb an extraneous order by/limit clause.

The ORDER BY/LIMIT syntax is mostly consistestent, i.e. a trailing clause may not refer to the tables in the <query primary>, with one glaring exception:

(...( SELECT ... )...) ORDER BY ...

If the nested query expression doesn't contain ORDER BY, the statement is interpreted as if the ORDER BY was absorbed by the innermost query expression, i.e.:

(...( SELECT ... ORDER BY ... )...)

There is no rewriting of the parse tree nor AST happening here, the transformation is done by the contextualizer (see PT_query_expression::contextualize_order_and_limit), which interprets the parse tree, and builds the AST according to this interpretation. This interpretation is governed by the following rule: An ORDER BY can be absorbed if none the nested query expressions contains an ORDER BY or LIMIT. The rule is complex, so here are some examples for illustration:

In these cases the ORDER BY is absorbed:

( SELECT * FROM t1 ) ORDER BY t1.a;
(( SELECT * FROM t1 )) ORDER BY t1.a;

In these cases the ORDER BY is not absorbed:

( SELECT * FROM t1 ORDER BY 1 ) ORDER BY t1.a;
(( SELECT * FROM t1 ) ORDER BY 1 ) ORDER BY t1.a;
( SELECT * FROM t1 LIMIT 1 ) ORDER BY t1.a;
(( SELECT * FROM t1 ) LIMIT 1 ) ORDER BY t1.a;

The same happens with LIMIT, obviously, but the optimizer is freeer to choose when to apply the limit, and there are name no resolution issues involved.

Parameters
orderTrue if the outer query block has the ORDER BY clause.
limitTrue if the outer query block has the LIMIT clause.

Implements PT_query_expression_body.

◆ contextualize()

bool PT_query_expression::contextualize ( Parse_context pc)
override

◆ contextualize_order_and_limit()

bool PT_query_expression::contextualize_order_and_limit ( Parse_context pc)
private

Contextualizes the order and limit clauses, re-interpreting them according to the rules.

If the <query expression body> can absorb the clauses, they are simply contextualized into the current SELECT_LEX. If not, we have to create the "fake" SELECT_LEX unless there is one already (SELECT_LEX_UNIT::new_union_query() is known to do this.)

See also
PT_query_expression::can_absorb_order_and_limit()

◆ get_row_value_list()

PT_insert_values_list* PT_query_expression::get_row_value_list ( ) const
inlineoverridevirtual

◆ has_into_clause()

bool PT_query_expression::has_into_clause ( ) const
inlineoverridevirtual

◆ is_table_value_constructor()

bool PT_query_expression::is_table_value_constructor ( ) const
inlineoverridevirtual

◆ is_union()

bool PT_query_expression::is_union ( ) const
inlineoverridevirtual

Member Data Documentation

◆ m_body

PT_query_expression_body* PT_query_expression::m_body
private

◆ m_limit

PT_limit_clause* PT_query_expression::m_limit
private

◆ m_order

PT_order* PT_query_expression::m_order
private

◆ m_with_clause

PT_with_clause* PT_query_expression::m_with_clause
private

The documentation for this class was generated from the following files: