summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bar@mysql.com>2005-01-20 15:38:56 +0400
committerunknown <bar@mysql.com>2005-01-20 15:38:56 +0400
commit9241e34593c94ec65920026d689b118355356c3a (patch)
treecdb60e795cd9012e9e9014065737caded748a072
parentd07dc11fa4a49f3c7013c0bae97d9db1a8d0a949 (diff)
downloadmariadb-git-9241e34593c94ec65920026d689b118355356c3a.tar.gz
item_cmpfunc.cc:
Bug#7834 Illegal mix of collations in IN operator IN was the first function supporting character set convertion. agg_arg_charsets() was written afterwards, which is more flexible. Now IN just reuses this function. sql/item_cmpfunc.cc: Bug#7834 Illegal mix of collations in IN operator IN was the first function supporting character set convertion. agg_arg_charsets() was written afterwards, which is more flexible. Now IN just reuses this function.
-rw-r--r--mysql-test/r/func_in.result8
-rw-r--r--mysql-test/t/func_in.test5
-rw-r--r--sql/item_cmpfunc.cc59
3 files changed, 17 insertions, 55 deletions
diff --git a/mysql-test/r/func_in.result b/mysql-test/r/func_in.result
index daeda51a12a..516d0a28a21 100644
--- a/mysql-test/r/func_in.result
+++ b/mysql-test/r/func_in.result
@@ -157,6 +157,14 @@ a
bbbb
цццц
drop table t1;
+create table t1 (a char(10) character set latin1 not null);
+insert into t1 values ('a'),('b'),('c');
+select a from t1 where a IN ('a','b','c') order by a;
+a
+a
+b
+c
+drop table t1;
set names latin1;
select '1.0' in (1,2);
'1.0' in (1,2)
diff --git a/mysql-test/t/func_in.test b/mysql-test/t/func_in.test
index 3cd8c064817..6e0883b821f 100644
--- a/mysql-test/t/func_in.test
+++ b/mysql-test/t/func_in.test
@@ -80,6 +80,11 @@ create table t1 (a char(10) character set utf8 not null);
insert into t1 values ('bbbb'),(_koi8r'ÃÃÃÃ'),(_latin1'ÄÄÄÄ');
select a from t1 where a in ('bbbb',_koi8r'ÃÃÃÃ',_latin1'ÄÄÄÄ') order by a;
drop table t1;
+# Bug#7834 Illegal mix of collations in IN operator
+create table t1 (a char(10) character set latin1 not null);
+insert into t1 values ('a'),('b'),('c');
+select a from t1 where a IN ('a','b','c') order by a;
+drop table t1;
set names latin1;
select '1.0' in (1,2);
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 6ec98f2dcd4..c5e6d520ab7 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -1749,64 +1749,13 @@ void Item_func_in::fix_length_and_dec()
agg_cmp_type(&cmp_type, args, arg_count);
+ if (cmp_type == STRING_RESULT &&
+ agg_arg_charsets(cmp_collation, args, arg_count, MY_COLL_CMP_CONV))
+ return;
+
for (arg=args+1, arg_end=args+arg_count; arg != arg_end ; arg++)
const_itm&= arg[0]->const_item();
-
- if (cmp_type == STRING_RESULT)
- {
- /*
- We allow consts character set conversion for
-
- item IN (const1, const2, const3, ...)
-
- if item is in a superset for all arguments,
- and if it is a stong side according to coercibility rules.
-
- TODO: add covnersion for non-constant IN values
- via creating Item_func_conv_charset().
- */
-
- if (agg_arg_collations_for_comparison(cmp_collation, args, arg_count,
- MY_COLL_ALLOW_SUPERSET_CONV))
- return;
- if ((!my_charset_same(args[0]->collation.collation,
- cmp_collation.collation) || !const_itm))
- {
- if (agg_arg_collations_for_comparison(cmp_collation, args, arg_count))
- return;
- }
- else
- {
- /*
- Conversion is possible:
- All IN arguments are constants.
- */
- Item_arena *arena, backup;
- arena= thd->change_arena_if_needed(&backup);
-
- for (arg= args+1, arg_end= args+arg_count; arg < arg_end; arg++)
- {
- if (!arg[0]->null_value &&
- !my_charset_same(cmp_collation.collation,
- arg[0]->collation.collation))
- {
- Item_string *conv;
- String tmp, cstr, *ostr= arg[0]->val_str(&tmp);
- uint dummy_errors;
- cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(),
- cmp_collation.collation, &dummy_errors);
- conv= new Item_string(cstr.ptr(),cstr.length(), cstr.charset(),
- arg[0]->collation.derivation);
- conv->str_value.copy();
- arg[0]= conv;
- }
- }
- if (arena)
- thd->restore_backup_item_arena(arena, &backup);
- }
- }
-
/*
Row item with NULLs inside can return NULL or FALSE =>
they can't be processed as static