summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2021-04-24 15:50:25 -0700
committerIgor Babaev <igor@askmonty.org>2021-04-24 16:53:24 -0700
commit2c9bf0ae8758b2c46ea5e02d1ea3d3ab5cab63b2 (patch)
tree5190b3a67a03781fa363a50d327b32df8d12fd34
parentc425d93b92acbf00f03a339c117616d2308669b6 (diff)
downloadmariadb-git-2c9bf0ae8758b2c46ea5e02d1ea3d3ab5cab63b2.tar.gz
This commit adds the same call of st_select_lex::set_unique_exclude() that
complemented the fix for MDEV-24823 in 10.2. As it is the only call of this function in 10.3 the commit also has added the code of the function.
-rw-r--r--sql/sql_delete.cc2
-rw-r--r--sql/sql_lex.cc21
-rw-r--r--sql/sql_lex.h2
3 files changed, 24 insertions, 1 deletions
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index c78e8ed510e..4d6a2c64e3e 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -1013,7 +1013,7 @@ int mysql_multi_delete_prepare(THD *thd)
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->select_lex.set_unique_exclude();
/* Fix tables-to-be-deleted-from list to point at opened tables */
for (target_tbl= (TABLE_LIST*) aux_tables;
target_tbl;
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index fe4d086bd22..56046584b8b 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -4927,6 +4927,27 @@ bool st_select_lex::save_prep_leaf_tables(THD *thd)
}
+/**
+ Set exclude_from_table_unique_test for selects of this select and all selects
+ belonging to the underlying units of derived tables or views
+*/
+
+void st_select_lex::set_unique_exclude()
+{
+ exclude_from_table_unique_test= TRUE;
+ for (SELECT_LEX_UNIT *unit= first_inner_unit();
+ unit;
+ unit= unit->next_unit())
+ {
+ if (unit->derived && unit->derived->is_view_or_derived())
+ {
+ for (SELECT_LEX *sl= unit->first_select(); sl; sl= sl->next_select())
+ sl->set_unique_exclude();
+ }
+ }
+}
+
+
/*
Return true if this select_lex has been converted into a semi-join nest
within 'ancestor'.
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 710c17a51d8..16768e0300f 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -1354,6 +1354,8 @@ public:
bool save_leaf_tables(THD *thd);
bool save_prep_leaf_tables(THD *thd);
+ void set_unique_exclude();
+
bool is_merged_child_of(st_select_lex *ancestor);
/*