diff options
author | Sergei Petrunia <psergey@askmonty.org> | 2018-01-18 15:25:40 +0300 |
---|---|---|
committer | Sergei Petrunia <psergey@askmonty.org> | 2018-01-22 13:44:31 +0300 |
commit | 9b4dfdaa5a1e1ca84a2e9e65dd3066b382f65ae7 (patch) | |
tree | e150d99dcc9534b64fe08518842b4c4c31fc7657 /sql/sql_select.cc | |
parent | 4f8555f1f68a22f33db57c31547df4f0832d78d2 (diff) | |
download | mariadb-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.cc | 10 |
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; } |