From 9241e34593c94ec65920026d689b118355356c3a Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Jan 2005 15:38:56 +0400 Subject: [PATCH] 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. --- mysql-test/r/func_in.result | 8 +++++ mysql-test/t/func_in.test | 5 ++++ sql/item_cmpfunc.cc | 59 +++---------------------------------- 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