From e0444ba436798b25c16bfe0097b87cc1d39a7b9a Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 20 Apr 2007 10:49:45 +0300 Subject: Bug #27786: When merging views into the enclosing statement the ORDER BY clause of the view is merged to the parent's ORDER BY clause. However when the VIEW is merged into an UNION branch the ORDER BY should be ignored. Use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result because UNION by default produces unordered set of rows. Fixed by ignoring the ORDER BY clause from the merge view when expanded in an UNION branch. mysql-test/r/view.result: Bug #27786: test case mysql-test/t/view.test: Bug #27786: test case sql/sql_lex.h: Bug #27786: add a is_union() inlined function Returns true if the unit represents an UNION. sql/sql_view.cc: Bug #27786: ignore ORDER BY in mergeable views when in UNION context --- sql/sql_lex.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'sql/sql_lex.h') diff --git a/sql/sql_lex.h b/sql/sql_lex.h index de7de0d46e9..2ff29d684d1 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -468,6 +468,7 @@ public: bool change_result(select_subselect *result, select_subselect *old_result); void set_limit(st_select_lex *values); void set_thd(THD *thd_arg) { thd= thd_arg; } + inline bool is_union (); friend void lex_start(THD *thd, uchar *buf, uint length); friend int subselect_union_engine::exec(); @@ -700,6 +701,13 @@ public: }; typedef class st_select_lex SELECT_LEX; + +inline bool st_select_lex_unit::is_union () +{ + return first_select()->next_select() && + first_select()->next_select()->linkage == UNION_TYPE; +} + #define ALTER_ADD_COLUMN 1 #define ALTER_DROP_COLUMN 2 #define ALTER_CHANGE_COLUMN 4 -- cgit v1.2.1