mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-11953: support of brackets in UNION/EXCEPT/INTERSECT operations
This commit is contained in:
@ -1342,7 +1342,7 @@ static int mysql_test_update(Prepared_statement *stmt,
|
||||
THD *thd= stmt->thd;
|
||||
uint table_count= 0;
|
||||
TABLE_LIST *update_source_table;
|
||||
SELECT_LEX *select= &stmt->lex->select_lex;
|
||||
SELECT_LEX *select= stmt->lex->first_select_lex();
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
uint want_privilege;
|
||||
#endif
|
||||
@ -1398,10 +1398,10 @@ static int mysql_test_update(Prepared_statement *stmt,
|
||||
table_list->table->grant.want_privilege= want_privilege;
|
||||
table_list->register_want_access(want_privilege);
|
||||
#endif
|
||||
thd->lex->select_lex.no_wrap_view_item= TRUE;
|
||||
thd->lex->first_select_lex()->no_wrap_view_item= TRUE;
|
||||
res= setup_fields(thd, Ref_ptr_array(),
|
||||
select->item_list, MARK_COLUMNS_READ, 0, NULL, 0);
|
||||
thd->lex->select_lex.no_wrap_view_item= FALSE;
|
||||
thd->lex->first_select_lex()->no_wrap_view_item= FALSE;
|
||||
if (res)
|
||||
goto error;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
@ -1466,10 +1466,10 @@ static bool mysql_test_delete(Prepared_statement *stmt,
|
||||
goto error;
|
||||
}
|
||||
|
||||
DBUG_RETURN(mysql_prepare_delete(thd, table_list,
|
||||
lex->select_lex.with_wild,
|
||||
lex->select_lex.item_list,
|
||||
&lex->select_lex.where,
|
||||
DBUG_RETURN(mysql_prepare_delete(thd, table_list,
|
||||
lex->first_select_lex()->with_wild,
|
||||
lex->first_select_lex()->item_list,
|
||||
&lex->first_select_lex()->where,
|
||||
&delete_while_scanning));
|
||||
error:
|
||||
DBUG_RETURN(TRUE);
|
||||
@ -1501,7 +1501,7 @@ static int mysql_test_select(Prepared_statement *stmt,
|
||||
SELECT_LEX_UNIT *unit= &lex->unit;
|
||||
DBUG_ENTER("mysql_test_select");
|
||||
|
||||
lex->select_lex.context.resolve_in_select_list= TRUE;
|
||||
lex->first_select_lex()->context.resolve_in_select_list= TRUE;
|
||||
|
||||
ulong privilege= lex->exchange ? SELECT_ACL | FILE_ACL : SELECT_ACL;
|
||||
if (tables)
|
||||
@ -1535,7 +1535,7 @@ static int mysql_test_select(Prepared_statement *stmt,
|
||||
if (!lex->describe && !thd->lex->analyze_stmt && !stmt->is_sql_prepare())
|
||||
{
|
||||
/* Make copy of item list, as change_columns may change it */
|
||||
List<Item> fields(lex->select_lex.item_list);
|
||||
List<Item> fields(lex->first_select_lex()->item_list);
|
||||
|
||||
/* Change columns if a procedure like analyse() */
|
||||
if (unit->last_procedure && unit->last_procedure->change_columns(thd, fields))
|
||||
@ -1692,7 +1692,7 @@ static bool select_like_stmt_test(Prepared_statement *stmt,
|
||||
THD *thd= stmt->thd;
|
||||
LEX *lex= stmt->lex;
|
||||
|
||||
lex->select_lex.context.resolve_in_select_list= TRUE;
|
||||
lex->first_select_lex()->context.resolve_in_select_list= TRUE;
|
||||
|
||||
if (specific_prepare && (*specific_prepare)(thd))
|
||||
DBUG_RETURN(TRUE);
|
||||
@ -1760,7 +1760,7 @@ static bool mysql_test_create_table(Prepared_statement *stmt)
|
||||
DBUG_ENTER("mysql_test_create_table");
|
||||
THD *thd= stmt->thd;
|
||||
LEX *lex= stmt->lex;
|
||||
SELECT_LEX *select_lex= &lex->select_lex;
|
||||
SELECT_LEX *select_lex= lex->first_select_lex();
|
||||
bool res= FALSE;
|
||||
bool link_to_local;
|
||||
TABLE_LIST *create_table= lex->query_tables;
|
||||
@ -2080,7 +2080,7 @@ static bool mysql_test_multidelete(Prepared_statement *stmt,
|
||||
{
|
||||
THD *thd= stmt->thd;
|
||||
|
||||
thd->lex->current_select= &thd->lex->select_lex;
|
||||
thd->lex->current_select= thd->lex->first_select_lex();
|
||||
if (add_item_to_list(thd, new (thd->mem_root)
|
||||
Item_null(thd)))
|
||||
{
|
||||
@ -2119,13 +2119,14 @@ error:
|
||||
|
||||
static int mysql_insert_select_prepare_tester(THD *thd)
|
||||
{
|
||||
SELECT_LEX *first_select= &thd->lex->select_lex;
|
||||
SELECT_LEX *first_select= thd->lex->first_select_lex();
|
||||
TABLE_LIST *second_table= first_select->table_list.first->next_local;
|
||||
|
||||
/* Skip first table, which is the table we are inserting in */
|
||||
first_select->table_list.first= second_table;
|
||||
thd->lex->select_lex.context.table_list=
|
||||
thd->lex->select_lex.context.first_name_resolution_table= second_table;
|
||||
thd->lex->first_select_lex()->context.table_list=
|
||||
thd->lex->first_select_lex()->context.first_name_resolution_table=
|
||||
second_table;
|
||||
|
||||
return mysql_insert_select_prepare(thd);
|
||||
}
|
||||
@ -2160,7 +2161,7 @@ static bool mysql_test_insert_select(Prepared_statement *stmt,
|
||||
return 1;
|
||||
|
||||
/* store it, because mysql_insert_select_prepare_tester change it */
|
||||
first_local_table= lex->select_lex.table_list.first;
|
||||
first_local_table= lex->first_select_lex()->table_list.first;
|
||||
DBUG_ASSERT(first_local_table != 0);
|
||||
|
||||
res=
|
||||
@ -2168,7 +2169,7 @@ static bool mysql_test_insert_select(Prepared_statement *stmt,
|
||||
&mysql_insert_select_prepare_tester,
|
||||
OPTION_SETUP_TABLES_DONE);
|
||||
/* revert changes made by mysql_insert_select_prepare_tester */
|
||||
lex->select_lex.table_list.first= first_local_table;
|
||||
lex->first_select_lex()->table_list.first= first_local_table;
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -2194,7 +2195,7 @@ static int mysql_test_handler_read(Prepared_statement *stmt,
|
||||
SQL_HANDLER *ha_table;
|
||||
DBUG_ENTER("mysql_test_handler_read");
|
||||
|
||||
lex->select_lex.context.resolve_in_select_list= TRUE;
|
||||
lex->first_select_lex()->context.resolve_in_select_list= TRUE;
|
||||
|
||||
/*
|
||||
We don't have to test for permissions as this is already done during
|
||||
@ -2204,7 +2205,7 @@ static int mysql_test_handler_read(Prepared_statement *stmt,
|
||||
lex->ident.str,
|
||||
lex->insert_list,
|
||||
lex->ha_rkey_mode,
|
||||
lex->select_lex.where)))
|
||||
lex->first_select_lex()->where)))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
if (!stmt->is_sql_prepare())
|
||||
@ -2243,7 +2244,7 @@ static bool check_prepared_statement(Prepared_statement *stmt)
|
||||
{
|
||||
THD *thd= stmt->thd;
|
||||
LEX *lex= stmt->lex;
|
||||
SELECT_LEX *select_lex= &lex->select_lex;
|
||||
SELECT_LEX *select_lex= lex->first_select_lex();
|
||||
TABLE_LIST *tables;
|
||||
enum enum_sql_command sql_command= lex->sql_command;
|
||||
int res= 0;
|
||||
@ -2252,10 +2253,11 @@ static bool check_prepared_statement(Prepared_statement *stmt)
|
||||
sql_command, stmt->param_count));
|
||||
|
||||
lex->first_lists_tables_same();
|
||||
lex->fix_first_select_number();
|
||||
tables= lex->query_tables;
|
||||
|
||||
/* set context for commands which do not use setup_tables */
|
||||
lex->select_lex.context.resolve_in_table_list_only(select_lex->
|
||||
lex->first_select_lex()->context.resolve_in_table_list_only(select_lex->
|
||||
get_table_list());
|
||||
|
||||
/* Reset warning count for each query that uses tables */
|
||||
@ -3020,7 +3022,7 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
|
||||
{
|
||||
tables->reinit_before_use(thd);
|
||||
}
|
||||
lex->current_select= &lex->select_lex;
|
||||
lex->current_select= lex->first_select_lex();
|
||||
|
||||
|
||||
if (lex->result)
|
||||
@ -4558,8 +4560,8 @@ bool Prepared_statement::validate_metadata(Prepared_statement *copy)
|
||||
if (is_sql_prepare() || lex->describe)
|
||||
return FALSE;
|
||||
|
||||
if (lex->select_lex.item_list.elements !=
|
||||
copy->lex->select_lex.item_list.elements)
|
||||
if (lex->first_select_lex()->item_list.elements !=
|
||||
copy->lex->first_select_lex()->item_list.elements)
|
||||
{
|
||||
/** Column counts mismatch, update the client */
|
||||
thd->server_status|= SERVER_STATUS_METADATA_CHANGED;
|
||||
|
Reference in New Issue
Block a user