summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2006-02-28 19:30:30 +0300
committerunknown <evgen@moonbone.local>2006-02-28 19:30:30 +0300
commitddbf62ca89aeafefe958de28799d60522118ebe4 (patch)
treede6efffa2b75301bbbd339fd5851f4a16f382d17
parent387ae4abcf2d484aebe9eae6edcab81c8c9556f9 (diff)
downloadmariadb-git-ddbf62ca89aeafefe958de28799d60522118ebe4.tar.gz
Fixed bug#14169: type of group_concat() result changed to blob if tmp_table was
used In a simple queries a result of the GROUP_CONCAT() function was always of varchar type. But if length of GROUP_CONCAT() result is greater than 512 chars and temporary table is used during select then the result is converted to blob, due to policy to not to store fields longer than 512 chars in tmp table as varchar fields. In order to provide consistent behaviour, result of GROUP_CONCAT() now will always be converted to blob if it is longer than 512 chars. Item_func_group_concat::field_type() is modified accordingly. sql/item_sum.h: Fixed bug#14169: type of group_concat() result changed to blob if tmp_table was used The Item_func_group_concat::field_type() now returns FIELD_TYPE_BLOB if the result is longer than 512 chars. tests/mysql_client_test.c: Added test case for bug#14169: type of group_concat() result changed to blob if tmp_table was used
-rw-r--r--sql/item_sum.h7
-rw-r--r--tests/mysql_client_test.c35
2 files changed, 42 insertions, 0 deletions
diff --git a/sql/item_sum.h b/sql/item_sum.h
index a8242d76287..a38530a502c 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -1116,6 +1116,13 @@ public:
enum Sumfunctype sum_func () const {return GROUP_CONCAT_FUNC;}
const char *func_name() const { return "group_concat"; }
virtual Item_result result_type () const { return STRING_RESULT; }
+ enum_field_types field_type() const
+ {
+ if (max_length/collation.collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB)
+ return FIELD_TYPE_BLOB;
+ else
+ return MYSQL_TYPE_VARCHAR;
+ }
void clear();
bool add();
void reset_field() { DBUG_ASSERT(0); } // not used
diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c
index c265375a263..8ec5bcd6f0c 100644
--- a/tests/mysql_client_test.c
+++ b/tests/mysql_client_test.c
@@ -14841,6 +14841,40 @@ static void test_bug15613()
}
/*
+ Bug#14169: type of group_concat() result changed to blob if tmp_table was used
+*/
+static void test_bug14169()
+{
+ MYSQL_STMT *stmt;
+ const char *stmt_text;
+ MYSQL_RES *res;
+ MYSQL_FIELD *field;
+ int rc;
+
+ myheader("test_bug14169");
+
+ rc= mysql_query(mysql, "drop table if exists t1");
+ myquery(rc);
+ rc= mysql_query(mysql, "set session group_concat_max_len=1024");
+ myquery(rc);
+ rc= mysql_query(mysql, "create table t1 (f1 int unsigned, f2 varchar(255))");
+ myquery(rc);
+ rc= mysql_query(mysql, "insert into t1 values (1,repeat('a',255)),"
+ "(2,repeat('b',255))");
+ myquery(rc);
+ stmt= mysql_stmt_init(mysql);
+ stmt_text= "select f2,group_concat(f1) from t1 group by f2";
+ rc= mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text));
+ myquery(rc);
+ res= mysql_stmt_result_metadata(stmt);
+ field= mysql_fetch_fields(res);
+ if (!opt_silent)
+ printf("GROUP_CONCAT() result type %i", field[1].type);
+ DIE_UNLESS(field[1].type == MYSQL_TYPE_BLOB);
+
+ rc= mysql_query(mysql, "drop table t1");
+ myquery(rc);
+}/*
Read and parse arguments and MySQL options from my.cnf
*/
@@ -15105,6 +15139,7 @@ static struct my_tests_st my_tests[]= {
{ "test_bug16143", test_bug16143 },
{ "test_bug16144", test_bug16144 },
{ "test_bug15613", test_bug15613 },
+ { "test_bug14169", test_bug14169 },
{ 0, 0 }
};