MySQL 8.0.40
Source Code Documentation
|
#include <parse_tree_nodes.h>
Public Member Functions | |
PT_query_specification (PT_hint_list *opt_hints_arg, const Query_options &options_arg, PT_item_list *item_list_arg, PT_into_destination *opt_into1_arg, const Mem_root_array_YY< PT_table_reference * > &from_clause_arg, Item *opt_where_clause_arg, PT_group *opt_group_clause_arg, Item *opt_having_clause_arg, PT_window_list *opt_window_clause_arg, bool implicit_from_clause) | |
PT_query_specification (const Query_options &options_arg, PT_item_list *item_list_arg, const Mem_root_array_YY< PT_table_reference * > &from_clause_arg, Item *opt_where_clause_arg) | |
PT_query_specification (const Query_options &options_arg, PT_item_list *item_list_arg) | |
bool | contextualize (Parse_context *pc) override |
bool | has_into_clause () const override |
bool | has_trailing_into_clause () const override |
bool | is_set_operation () const override |
bool | can_absorb_order_and_limit (bool, bool) 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_list * | get_row_value_list () const override |
Public Member Functions inherited from Parse_tree_node_tmpl< Context > | |
virtual | ~Parse_tree_node_tmpl ()=default |
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 Types | |
typedef PT_query_primary | super |
Private Member Functions | |
bool | is_implicit_from_clause () const |
Private Attributes | |
PT_hint_list * | opt_hints |
Query_options | options |
PT_item_list * | item_list |
PT_into_destination * | opt_into1 |
const bool | m_is_from_clause_implicit |
Mem_root_array_YY< PT_table_reference * > | from_clause |
Item * | opt_where_clause |
PT_group * | opt_group_clause |
Item * | opt_having_clause |
PT_window_list * | opt_window_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 () | |
|
private |
|
inline |
|
inline |
|
inline |
|
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.
order | True if the outer query block has the ORDER BY clause. |
limit | True if the outer query block has the LIMIT clause. |
Implements PT_query_expression_body.
|
override |
|
inlineoverridevirtual |
Implements PT_query_expression_body.
|
inlineoverridevirtual |
Implements PT_query_expression_body.
|
inlineoverridevirtual |
Implements PT_query_expression_body.
|
inlineprivate |
|
inlineoverridevirtual |
Implements PT_query_expression_body.
|
inlineoverridevirtual |
Implements PT_query_expression_body.
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |