summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
authorSergei Petrunia <psergey@askmonty.org>2018-01-18 15:25:40 +0300
committerSergei Petrunia <psergey@askmonty.org>2018-01-22 13:44:31 +0300
commit9b4dfdaa5a1e1ca84a2e9e65dd3066b382f65ae7 (patch)
treee150d99dcc9534b64fe08518842b4c4c31fc7657 /sql/sql_select.cc
parent4f8555f1f68a22f33db57c31547df4f0832d78d2 (diff)
downloadmariadb-git-9b4dfdaa5a1e1ca84a2e9e65dd3066b382f65ae7.tar.gz
MDEV-13352: Server crashes in st_join_table::remove_duplicates
join_tab->distinct=true means "Before doing record read with this join_tab, call join_tab->remove_duplicates() to eliminate duplicates". remove_duplicates() assumes that - there is a temporary table $T with rows that are to be de-duplicated - there is a previous join_tab (e.g. with join_tab->fields) which was used to populate the temp.table $T. When the query has "Impossible WHERE" and window function, then the above conditions are not met (but we still might need a window function computation step when the query has implicit grouping). The fix is to not add remove_duplicates step if the select execution is degenerate (and we'll have at most one row in the output anyway).
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r--sql/sql_select.cc10
1 files changed, 9 insertions, 1 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index e80c02b52b4..6b1d406bf8a 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2670,7 +2670,15 @@ bool JOIN::make_aggr_tables_info()
curr_tab->having= having;
having->update_used_tables();
}
- curr_tab->distinct= true;
+ /*
+ We only need DISTINCT operation if the join is not degenerate.
+ If it is, we must not request DISTINCT processing, because
+ remove_duplicates() assumes there is a preceding computation step (and
+ in the degenerate join, there's none)
+ */
+ if (top_join_tab_count)
+ curr_tab->distinct= true;
+
having= NULL;
select_distinct= false;
}