diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index d4997f78a9e224f74ddd81ae6b340436dad20492..e67c742928e860c98d2fad90c030350afa838fcb 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -90,38 +90,51 @@ static bool convert_constant_item(Field *field, Item **item) bool Item_bool_func2::set_cmp_charset(CHARSET_INFO *cs1, enum coercion co1, CHARSET_INFO *cs2, enum coercion co2) { - if ((cs1 == &my_charset_bin) || (cs2 == &my_charset_bin)) + if (!my_charset_same(cs1, cs2)) { - cmp_charset= &my_charset_bin; - return 0; + /* + We do allow to use BLOBS together with character strings + BLOBS have more precedance + */ + if ((co1 <= co2) && (cs1==&my_charset_bin)) + { + cmp_charset= cs1; + coercibility= co1; + } + else if ((co2 <= co1) && (cs2==&my_charset_bin)) + { + cmp_charset= cs2; + coercibility= co2; + } + else + { + cmp_charset= 0; + coercibility= COER_NOCOLL; + return 1; + } } - - if ((co1 == COER_NOCOLL) || (co2 == COER_NOCOLL)) - return 1; - - if (!my_charset_same(cs1,cs2)) - return 1; - - if (co1 < co2) + else if (co1 < co2) + { cmp_charset= cs1; + coercibility= co1; + } else if (co2 < co1) - cmp_charset= cs2; - else // co1==co2 { + cmp_charset= cs2; + coercibility= co1; + } + else + { if (cs1 == cs2) + { cmp_charset= cs1; - else + coercibility= co1; + } + else { - if (co1 == COER_COERCIBLE) - { - CHARSET_INFO *c; - if ((c= get_charset_by_csname(cs1->csname, MY_CS_PRIMARY, MYF(0)))) - { - cmp_charset= c; - return 0; - } - } - return 1; + coercibility= COER_NOCOLL; + cmp_charset= 0; + return (co1 == COER_EXPLICIT) ? 1 : 0; } } return 0;