summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/func_str.result11
-rw-r--r--mysql-test/t/func_str.test9
-rw-r--r--sql/item_func.cc5
-rw-r--r--sql/item_strfunc.cc15
4 files changed, 26 insertions, 14 deletions
diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result
index 855473bdc08..ab652b9d850 100644
--- a/mysql-test/r/func_str.result
+++ b/mysql-test/r/func_str.result
@@ -512,7 +512,7 @@ collation(make_set(255,_latin2'a',_latin2'b',_latin2'c')) coercibility(make_set(
latin2_general_ci 4
select collation(export_set(255,_latin2'y',_latin2'n',_latin2' ')), coercibility(export_set(255,_latin2'y',_latin2'n',_latin2' '));
collation(export_set(255,_latin2'y',_latin2'n',_latin2' ')) coercibility(export_set(255,_latin2'y',_latin2'n',_latin2' '))
-binary 4
+latin2_general_ci 4
select collation(trim(_latin2' a ')), coercibility(trim(_latin2' a '));
collation(trim(_latin2' a ')) coercibility(trim(_latin2' a '))
latin2_general_ci 4
@@ -627,6 +627,15 @@ t1 CREATE TABLE `t1` (
`encode('abcd','ab')` binary(4) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
+create table t1 (a char character set latin2);
+insert into t1 values (null);
+select charset(a), collation(a), coercibility(a) from t1;
+charset(a) collation(a) coercibility(a)
+latin2 latin2_general_ci 2
+drop table t1;
+select charset(null), collation(null), coercibility(null);
+charset(null) collation(null) coercibility(null)
+binary binary 5
select SUBSTR('abcdefg',3,2);
SUBSTR('abcdefg',3,2)
cd
diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test
index 4e504797a48..e7069c41716 100644
--- a/mysql-test/t/func_str.test
+++ b/mysql-test/t/func_str.test
@@ -369,6 +369,15 @@ show create table t1;
drop table t1;
#
+# Bug#9129
+#
+create table t1 (a char character set latin2);
+insert into t1 values (null);
+select charset(a), collation(a), coercibility(a) from t1;
+drop table t1;
+select charset(null), collation(null), coercibility(null);
+
+#
# test for SUBSTR
#
select SUBSTR('abcdefg',3,2);
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 96250522c4a..ade394f90d3 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -1346,11 +1346,6 @@ longlong Item_func_char_length::val_int()
longlong Item_func_coercibility::val_int()
{
DBUG_ASSERT(fixed == 1);
- if (args[0]->null_value)
- {
- null_value= 1;
- return 0;
- }
null_value= 0;
return (longlong) args[0]->collation.derivation;
}
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index b4f75859469..8b9351d95a5 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -2290,12 +2290,11 @@ bool Item_func_set_collation::eq(const Item *item, bool binary_cmp) const
String *Item_func_charset::val_str(String *str)
{
DBUG_ASSERT(fixed == 1);
- String *res = args[0]->val_str(str);
uint dummy_errors;
- if ((null_value=(args[0]->null_value || !res->charset())))
- return 0;
- str->copy(res->charset()->csname,strlen(res->charset()->csname),
+ CHARSET_INFO *cs= args[0]->collation.collation;
+ null_value= 0;
+ str->copy(cs->csname, strlen(cs->csname),
&my_charset_latin1, collation.collation, &dummy_errors);
return str;
}
@@ -2303,12 +2302,11 @@ String *Item_func_charset::val_str(String *str)
String *Item_func_collation::val_str(String *str)
{
DBUG_ASSERT(fixed == 1);
- String *res = args[0]->val_str(str);
uint dummy_errors;
+ CHARSET_INFO *cs= args[0]->collation.collation;
- if ((null_value=(args[0]->null_value || !res->charset())))
- return 0;
- str->copy(res->charset()->name,strlen(res->charset()->name),
+ null_value= 0;
+ str->copy(cs->name, strlen(cs->name),
&my_charset_latin1, collation.collation, &dummy_errors);
return str;
}
@@ -2472,6 +2470,7 @@ String* Item_func_export_set::val_str(String* str)
uint num_set_values = 64;
ulonglong mask = 0x1;
str->length(0);
+ str->set_charset(collation.collation);
/* Check if some argument is a NULL value */
if (args[0]->null_value || args[1]->null_value || args[2]->null_value)