Commit 827e6a85 authored by unknown's avatar unknown
Browse files

Merge rama.(none):/home/jimw/my/mysql-5.0-16881

into  rama.(none):/home/jimw/my/mysql-5.0-16502


client/mysql.cc:
  Auto merged
mysql-test/r/date_formats.result:
  Auto merged
mysql-test/r/mysql.result:
  Auto merged
mysql-test/r/type_ranges.result:
  Auto merged
mysql-test/t/mysql.test:
  Auto merged
sql/item_strfunc.cc:
  Auto merged
sql/item_strfunc.h:
  Auto merged
sql/item_subselect.cc:
  Auto merged
sql/sql_class.h:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
parents 7f69aee4 d573ea16
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1351,3 +1351,8 @@ drop table t1;
(select avg(1)) union (select avg(1)) union (select avg(1));
avg(1)
NULL
select _utf8'12' union select _latin1'12345';
12
12
12345
End of 5.0 tests
+7 −0
Original line number Diff line number Diff line
@@ -841,3 +841,10 @@ drop table t1;
(select avg(1)) union (select avg(1)) union (select avg(1)) union
(select avg(1)) union (select avg(1)) union (select avg(1));

#
# Bug #16881: password() and union select
# (The issue was poor handling of character set aggregation.)
#
select _utf8'12' union select _latin1'12345';

--echo End of 5.0 tests
+12 −4
Original line number Diff line number Diff line
@@ -6053,14 +6053,13 @@ bool Item_type_holder::join_types(THD *thd, Item *item)
    max_length= my_decimal_precision_to_length(precision, decimals,
                                               unsigned_flag);
  }
  else
    max_length= max(max_length, display_length(item));

  switch (Field::result_merge_type(fld_type))
  {
  case STRING_RESULT:
  {
    const char *old_cs, *old_derivation;
    uint32 old_max_chars= max_length / collation.collation->mbmaxlen;
    old_cs= collation.collation->name;
    old_derivation= collation.derivation_name();
    if (collation.aggregate(item->collation, MY_COLL_ALLOW_CONV))
@@ -6072,6 +6071,14 @@ bool Item_type_holder::join_types(THD *thd, Item *item)
	       "UNION");
      DBUG_RETURN(TRUE);
    }
    /*
      To figure out max_length, we have to take into account possible
      expansion of the size of the values because of character set
      conversions.
     */
    max_length= max(old_max_chars * collation.collation->mbmaxlen,
                    display_length(item) / item->collation.collation->mbmaxlen *
                    collation.collation->mbmaxlen);
    break;
  }
  case REAL_RESULT:
@@ -6090,7 +6097,8 @@ bool Item_type_holder::join_types(THD *thd, Item *item)
      max_length= (fld_type == MYSQL_TYPE_FLOAT) ? FLT_DIG+6 : DBL_DIG+7;
    break;
  }
  default:;
  default:
    max_length= max(max_length, display_length(item));
  };
  maybe_null|= item->maybe_null;
  get_full_info(item);