summaryrefslogtreecommitdiff
path: root/sql/item_sum.cc
diff options
context:
space:
mode:
authorbar@bar.mysql.r18.ru <>2002-12-19 16:42:35 +0400
committerbar@bar.mysql.r18.ru <>2002-12-19 16:42:35 +0400
commit8a28d5a36589d4d160d9ab213dcbdb909c75e228 (patch)
treeeeb8206ea16b6a599f4157f9ddbcd759c62702d9 /sql/item_sum.cc
parente5103ce714dc3bbec6ea1dc77b7a02a8454c0165 (diff)
downloadmariadb-git-8a28d5a36589d4d160d9ab213dcbdb909c75e228.tar.gz
COUNT(DISTINCT field) now honors charsets
Diffstat (limited to 'sql/item_sum.cc')
-rw-r--r--sql/item_sum.cc41
1 files changed, 25 insertions, 16 deletions
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index f54ab87b81d..d78e535010f 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -542,7 +542,7 @@ void Item_sum_hybrid::reset_field()
if (hybrid_type == STRING_RESULT)
{
char buff[MAX_FIELD_WIDTH];
- String tmp(buff,sizeof(buff),default_charset_info),*res;
+ String tmp(buff,sizeof(buff),result_field->charset()),*res;
res=args[0]->val_str(&tmp);
if (args[0]->null_value)
@@ -897,17 +897,17 @@ String *Item_variance_field::val_str(String *str)
#include "sql_select.h"
-static int simple_raw_key_cmp(void* arg, byte* key1, byte* key2)
+int simple_raw_key_cmp(void* arg, byte* key1, byte* key2)
{
return memcmp(key1, key2, *(uint*) arg);
}
-static int simple_str_key_cmp(void* arg, byte* key1, byte* key2)
+int simple_str_key_cmp(void* arg, byte* key1, byte* key2)
{
- /* BAR TODO: remove default_charset_info */
- return my_strnncoll(default_charset_info,
- (const uchar*) key1, *(uint*) arg,
- (const uchar*) key2, *(uint*) arg);
+ Item_sum_count_distinct* item = (Item_sum_count_distinct*)arg;
+ CHARSET_INFO *cs=item->key_charset;
+ uint len=item->key_length;
+ return my_strnncoll(cs, (const uchar*) key1, len, (const uchar*) key2, len);
}
/*
@@ -1037,14 +1037,22 @@ bool Item_sum_count_distinct::setup(THD *thd)
Field* field = table->field[0];
switch(field->type())
{
- /*
- If we have a string, we must take care of charsets and case
- sensitivity
- */
case FIELD_TYPE_STRING:
case FIELD_TYPE_VAR_STRING:
- compare_key = (qsort_cmp2)(field->binary() ? simple_raw_key_cmp:
- simple_str_key_cmp);
+ if (field->binary())
+ {
+ compare_key = (qsort_cmp2)simple_raw_key_cmp;
+ cmp_arg = (void*) &key_length;
+ }
+ else
+ {
+ /*
+ If we have a string, we must take care of charsets and case
+ sensitivity
+ */
+ compare_key = (qsort_cmp2)simple_str_key_cmp;
+ cmp_arg = (void*) this;
+ }
break;
default:
/*
@@ -1052,11 +1060,12 @@ bool Item_sum_count_distinct::setup(THD *thd)
be compared with memcmp
*/
compare_key = (qsort_cmp2)simple_raw_key_cmp;
+ cmp_arg = (void*) &key_length;
break;
}
- key_length = field->pack_length();
- cmp_arg = (void*) &key_length;
- rec_offset = 1;
+ key_charset = field->charset();
+ key_length = field->pack_length();
+ rec_offset = 1;
}
else // too bad, cannot cheat - there is more than one field
{