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:
@ -290,7 +290,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
||||
bool has_triggers;
|
||||
ORDER *order= (ORDER *) ((order_list && order_list->elements) ?
|
||||
order_list->first : NULL);
|
||||
SELECT_LEX *select_lex= &thd->lex->select_lex;
|
||||
SELECT_LEX *select_lex= thd->lex->first_select_lex();
|
||||
killed_state killed_status= NOT_KILLED;
|
||||
THD::enum_binlog_query_type query_type= THD::ROW_QUERY_TYPE;
|
||||
bool binlog_is_row;
|
||||
@ -348,7 +348,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
table->map=1;
|
||||
query_plan.select_lex= &thd->lex->select_lex;
|
||||
query_plan.select_lex= thd->lex->first_select_lex();
|
||||
query_plan.table= table;
|
||||
query_plan.updating_a_view= MY_TEST(table_list->view);
|
||||
|
||||
@ -380,7 +380,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
||||
setup_order(thd, select_lex->ref_pointer_array, &tables,
|
||||
fields, all_fields, order))
|
||||
{
|
||||
free_underlaid_joins(thd, &thd->lex->select_lex);
|
||||
free_underlaid_joins(thd, thd->lex->first_select_lex());
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
}
|
||||
@ -927,14 +927,16 @@ int mysql_prepare_delete(THD *thd, TABLE_LIST *table_list,
|
||||
bool *delete_while_scanning)
|
||||
{
|
||||
Item *fake_conds= 0;
|
||||
SELECT_LEX *select_lex= &thd->lex->select_lex;
|
||||
SELECT_LEX *select_lex= thd->lex->first_select_lex();
|
||||
DBUG_ENTER("mysql_prepare_delete");
|
||||
List<Item> all_fields;
|
||||
|
||||
*delete_while_scanning= true;
|
||||
thd->lex->allow_sum_func= 0;
|
||||
if (setup_tables_and_check_access(thd, &thd->lex->select_lex.context,
|
||||
&thd->lex->select_lex.top_join_list,
|
||||
if (setup_tables_and_check_access(thd,
|
||||
&thd->lex->first_select_lex()->context,
|
||||
&thd->lex->first_select_lex()->
|
||||
top_join_list,
|
||||
table_list,
|
||||
select_lex->leaf_tables, FALSE,
|
||||
DELETE_ACL, SELECT_ACL, TRUE))
|
||||
@ -1017,21 +1019,23 @@ int mysql_multi_delete_prepare(THD *thd)
|
||||
|
||||
lex->query_tables also point on local list of DELETE SELECT_LEX
|
||||
*/
|
||||
if (setup_tables_and_check_access(thd, &thd->lex->select_lex.context,
|
||||
&thd->lex->select_lex.top_join_list,
|
||||
if (setup_tables_and_check_access(thd,
|
||||
&thd->lex->first_select_lex()->context,
|
||||
&thd->lex->first_select_lex()->
|
||||
top_join_list,
|
||||
lex->query_tables,
|
||||
lex->select_lex.leaf_tables, FALSE,
|
||||
DELETE_ACL, SELECT_ACL, FALSE))
|
||||
lex->first_select_lex()->leaf_tables,
|
||||
FALSE, DELETE_ACL, SELECT_ACL, FALSE))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
if (lex->select_lex.handle_derived(thd->lex, DT_MERGE))
|
||||
if (lex->first_select_lex()->handle_derived(thd->lex, DT_MERGE))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
/*
|
||||
Multi-delete can't be constructed over-union => we always have
|
||||
single SELECT on top and have to check underlying SELECTs of it
|
||||
*/
|
||||
lex->select_lex.exclude_from_table_unique_test= TRUE;
|
||||
lex->first_select_lex()->exclude_from_table_unique_test= TRUE;
|
||||
/* Fix tables-to-be-deleted-from list to point at opened tables */
|
||||
for (target_tbl= (TABLE_LIST*) aux_tables;
|
||||
target_tbl;
|
||||
@ -1073,8 +1077,8 @@ int mysql_multi_delete_prepare(THD *thd)
|
||||
Reset the exclude flag to false so it doesn't interfare
|
||||
with further calls to unique_table
|
||||
*/
|
||||
lex->select_lex.exclude_from_table_unique_test= FALSE;
|
||||
|
||||
lex->first_select_lex()->exclude_from_table_unique_test= FALSE;
|
||||
|
||||
if (lex->save_prep_leaf_tables())
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
|
Reference in New Issue
Block a user