summaryrefslogtreecommitdiff
path: root/sql/uniques.cc
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2017-07-12 19:31:01 +0200
committerSergei Golubchik <serg@mariadb.org>2017-07-13 11:23:54 +0200
commit27bc13b7a2f99a6011a5081670b320c685dde443 (patch)
tree5716bba31b153158f9fc3321069d0784ed1ff9bd /sql/uniques.cc
parente7f51e5d269ba8adb917226724564274a57d07b3 (diff)
downloadmariadb-git-27bc13b7a2f99a6011a5081670b320c685dde443.tar.gz
MDEV-12136 SELECT COUNT(DISTINCT) returns the wrong value when tmp_table_size is limited
Same MDEV, second bug. Merge buffer must fit at least MERGEBUFF2 (that is, 15) key values. Because merge_index() can merge that many buffers, and merge_many_buff() leaves that many buffers unmerged.
Diffstat (limited to 'sql/uniques.cc')
-rw-r--r--sql/uniques.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/sql/uniques.cc b/sql/uniques.cc
index f80117065dd..8b7da7e6e52 100644
--- a/sql/uniques.cc
+++ b/sql/uniques.cc
@@ -607,11 +607,15 @@ bool Unique::walk(TABLE *table, tree_walk_action action, void *walk_action_arg)
return 1;
if (flush_io_cache(&file) || reinit_io_cache(&file, READ_CACHE, 0L, 0, 0))
return 1;
- size_t buff_sz= (max_in_memory_size / full_size + 1) * full_size;
+ /*
+ merge_buffer must fit at least MERGEBUFF2 keys, because
+ merge_index() can merge that many BUFFPEKs at once.
+ */
+ size_t buff_sz= max(MERGEBUFF2, max_in_memory_size/full_size+1) * full_size;
if (!(merge_buffer = (uchar *)my_malloc(buff_sz, MYF(MY_WME))))
return 1;
if (buff_sz < (ulong) (full_size * (file_ptrs.elements + 1)))
- res= merge(table, merge_buffer, buff_sz >= full_size * MERGEBUFF2) ;
+ res= merge(table, merge_buffer, true) ;
if (!res)
{