|
|
@ -28,6 +28,18 @@ |
|
|
|
#include "mysql_priv.h"
|
|
|
|
#include "sql_select.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
Calculate the affordable RAM limit for structures like TREE or Unique |
|
|
|
used in Item_sum_* |
|
|
|
*/ |
|
|
|
|
|
|
|
ulonglong Item_sum::ram_limitation(THD *thd) |
|
|
|
{ |
|
|
|
return min(thd->variables.tmp_table_size, |
|
|
|
thd->variables.max_heap_table_size); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Prepare an aggregate function item for checking context conditions. |
|
|
|
|
|
|
@ -833,7 +845,7 @@ bool Aggregator_distinct::setup(THD *thd) |
|
|
|
} |
|
|
|
DBUG_ASSERT(tree == 0); |
|
|
|
tree= new Unique(compare_key, cmp_arg, tree_key_length, |
|
|
|
thd->variables.max_heap_table_size); |
|
|
|
item_sum->ram_limitation(thd)); |
|
|
|
/*
|
|
|
|
The only time tree_key_length could be 0 is if someone does |
|
|
|
count(distinct) on a char(0) field - stupid thing to do, |
|
|
@ -902,7 +914,7 @@ bool Aggregator_distinct::setup(THD *thd) |
|
|
|
are converted to binary representation as well. |
|
|
|
*/ |
|
|
|
tree= new Unique(simple_raw_key_cmp, &tree_key_length, tree_key_length, |
|
|
|
thd->variables.max_heap_table_size); |
|
|
|
item_sum->ram_limitation(thd)); |
|
|
|
|
|
|
|
DBUG_RETURN(tree == 0); |
|
|
|
} |
|
|
@ -3514,7 +3526,7 @@ bool Item_func_group_concat::setup(THD *thd) |
|
|
|
unique_filter= new Unique(group_concat_key_cmp_with_distinct, |
|
|
|
(void*)this, |
|
|
|
tree_key_length, |
|
|
|
thd->variables.max_heap_table_size); |
|
|
|
ram_limitation(thd)); |
|
|
|
|
|
|
|
DBUG_RETURN(FALSE); |
|
|
|
} |
|
|
|