(to simplify further MDEV-8909 changes)
1. Better semantic readability:
- Moving get_select_lex_derived inside select_derived_init
and decomposing it into get_select_lex and
$1->init_nested_join(lex->thd)
- Moving DBUG_ASSERT($1 == Lex->current_select) inside
select_derived_init
Now init_nested_join() and end_nested_join() reside inside
the same rule select_derived_init.
(It's very likely that they can be further removed,
as there are no any joins in this rule).
3. Better grammar readability:
Moving SELECT_SYM from select_derived_init to derived_query_specification.
It's easier to read a rule when it starts from a terminal symbol.
1. Moving the "| get_select_lex_derived select_derived_init" part of
select_derived into a separate new rule derived_query_specification.
2. Using derived_query_specification directly in select_derived_union
rather than in select_derived.
3. Moving the sequence "opt_order_clause opt_limit_clause opt_select_lock_type"
from select_derived2 to select_derived_union,
after derived_query_specification.
Effectively, the parser now does not go through the sequence
"opt_order_clause opt_limit_clause ... opt_union_order_or_limit" any more.
This fixes the problem with double LIMIT clause and removes 2 shift/reduce
conflicts.
"MDEV-8909 union parser cleanup" changes.
When the server parses a query like
SELECT * FROM (SELECT 1);
a sequence of calls
st_select_lex::init_nested_join() ..
st_select_lex::end_nested_join()
was performed two times (tested in gdb).
Both pairs of calls seem to be redundant for a query
like this, because there are actually no any joins here.
This patch moved "table_ref_select" inside "select_derived",
which revealed that one the pairs was definitely redundant:
After this transformation we got an init_nested_join()
immediately followed by end_nested_join() for the same st_select_lex,
which has no any sense. So this pair of calls was removed.
- Moving "SELECT_SYM select_init2_derived opt_table_expression"
from query_term into a new separate rule query_specification,
and using query_specification in the beginning of query_term.
- query_term now does not have a %type, query_specification has a %type
instead. This removes duplicate code that returns
Lex->current_select->master_unit()->first_select();
- Moving select_options_and_item_list from select_init2
to select_init and view_select_aux
- Renaming select_init2 to select_init3
This will simplify upcoming sql_yacc.yy fixes (e.g. MDEV-10035, MDEV-8909).
closer the grammar in the SQL Standard:
- <query specification> is only a SELECT followed by
<set quantifier>, <select list> and <table expression>.
- While <query term> includes SELECT queries and derived tables.
This change refactors the "table_expression" rule in sql_yacc.yy.
Queries with subselects and derived tables, as well as "CREATE TABLE ... SELECT"
now return syntax error instead of "Incorrect usage of PROCEDURE and ...".
Item_func_or_sum.
Implemented method update_used_tables for class Item_findow_func.
Added the flag Item::with_window_func.
Made sure that window functions could be used only in SELECT list
and ORDER BY clause.
Added test cases that checked different illegal placements of
window functions.
This fixes
MDEV-9538 Server crashes in check_show_access on SHOW STATISTICS
MDEV-9539 Server crashes in make_columns_old_format on SHOW GEOMETRY_COLUMNS
MDEV-9540 SHOW SPATIAL_REF_SYS and SHOW SYSTEM_VARIABLES return empty results with numerous warnings
of mdev-8789.
Fixed a bug in TABLE_LIST::print.
Fixed another bug for the case when the definition of a
WITH table contained column list while the join in the main
query used two instances of this table.
Was:
* LEX_USER::password was storing sometimes
plaintext password and sometimes password hash
* LEX_USER::auth was storing sometimes password hash and
sometimes plugin authentication string
Now:
* LEX_USER::pwtext stores the password in plain-text
* LEX_USER::pwhash stores the password hash
* LEX_USER::auth stores the plugin authentication string
The bug was caused by accessing uninitialized fields within the LEX related to
ssl by mysql_show_grants() -> get_current_user() -> has_auth() function.
The following left in semi-improved state to keep patch size reasonable:
- Field operator new: left thd_alloc(current_thd)
- Sql_alloc operator new: left thd_alloc(thd_get_current_thd())
- Item_args constructors: left thd_alloc(thd)
- Item_func_interval::fix_length_and_dec(): no THD arg, have to call current_thd
- Item_func_dyncol_exists::val_int(): same
- Item_dyncol_get::val_str(): same
- Item_dyncol_get::val_int(): same
- Item_dyncol_get::val_real(): same
- Item_dyncol_get::val_decimal(): same
- Item_singlerow_subselect::fix_length_and_dec(): same