summaryrefslogtreecommitdiff
path: root/sql/sql_lex.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_lex.cc')
-rw-r--r--sql/sql_lex.cc38
1 files changed, 36 insertions, 2 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index e863308159e..853b4d8cc1a 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -3170,7 +3170,41 @@ bool st_select_lex_unit::union_needs_tmp_table()
global_parameters()->order_list.elements != 0 ||
thd->lex->sql_command == SQLCOM_INSERT_SELECT ||
thd->lex->sql_command == SQLCOM_REPLACE_SELECT;
-}
+}
+
+
+/*
+ @brief
+ Check if the ORDER BY clause is redundant or empty
+
+ @retval
+ TRUE order by is redundant or empty
+ FALSE OTHERWISE
+*/
+
+bool st_select_lex_unit::is_order_by_clause_redundant()
+{
+ if (global_parameters()->order_list.elements == 0)
+ return true;
+ if (is_union_op_inside_in_predicate())
+ return true;
+ return false;
+}
+
+
+/*
+ @brief
+ Check if UNION is in side an IN/ALL/ANY subquery
+
+ @retval
+ TRUE UNION inside in an IN/ALL/ANY subquery
+ FALSE Otherwise
+*/
+bool st_select_lex_unit::is_union_op_inside_in_predicate()
+{
+ return is_union() && item && item->is_in_predicate();
+}
+
/**
@brief Set the initial purpose of this TABLE_LIST object in the list of used
@@ -4678,7 +4712,7 @@ int st_select_lex_unit::save_union_explain(Explain_query *output)
eu->add_select(sl->select_number);
eu->fake_select_type= "UNION RESULT";
- eu->using_filesort= MY_TEST(global_parameters()->order_list.first);
+ eu->using_filesort= MY_TEST(!is_order_by_clause_redundant());
eu->using_tmp= union_needs_tmp_table();
// Save the UNION node