summaryrefslogtreecommitdiff
path: root/sql/sql_select.h
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2011-12-11 12:56:06 -0800
committerIgor Babaev <igor@askmonty.org>2011-12-11 12:56:06 -0800
commitfa29f18ffbc8c60c4aec3c74b4013056c7c32169 (patch)
treee0fde4651e4bb900437891ba2f7ab5c635c21b45 /sql/sql_select.h
parent8a09adb3eaf036b652b11afea7d9d86a978fa566 (diff)
downloadmariadb-git-fa29f18ffbc8c60c4aec3c74b4013056c7c32169.tar.gz
Fixed LP bug #901478.
If the duplicate elimination strategy is used for a semi-join and potentially one of the block-based join algorithms can be employed to join the inner tables of the semi-join then sorting of the head (first non-constant) table for a query with ORDER BY / GROUP BY cannot be used.
Diffstat (limited to 'sql/sql_select.h')
-rw-r--r--sql/sql_select.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/sql/sql_select.h b/sql/sql_select.h
index e24cab714fd..5a8dc846c92 100644
--- a/sql/sql_select.h
+++ b/sql/sql_select.h
@@ -1318,6 +1318,25 @@ public:
return test(allowed_join_cache_types & JOIN_CACHE_HASHED_BIT) &&
max_allowed_join_cache_level > JOIN_CACHE_HASHED_BIT;
}
+ /*
+ Check if we need to create a temporary table.
+ This has to be done if all tables are not already read (const tables)
+ and one of the following conditions holds:
+ - We are using DISTINCT (simple distinct's are already optimized away)
+ - We are using an ORDER BY or GROUP BY on fields not in the first table
+ - We are using different ORDER BY and GROUP BY orders
+ - The user wants us to buffer the result.
+ When the WITH ROLLUP modifier is present, we cannot skip temporary table
+ creation for the DISTINCT clause just because there are only const tables.
+ */
+ bool test_if_need_tmp_table()
+ {
+ return ((const_tables != table_count &&
+ ((select_distinct || !simple_order || !simple_group) ||
+ (group_list && order) ||
+ test(select_options & OPTION_BUFFER_RESULT))) ||
+ (rollup.state != ROLLUP::STATE_NONE && select_distinct));
+ }
bool choose_subquery_plan(table_map join_tables);
void get_partial_cost_and_fanout(int end_tab_idx,
table_map filter_map,