Commit 2fded7d5 authored by unknown's avatar unknown
Browse files

Fix for bug #9764 (DISTINCT IFNULL truncates data)


mysql-test/r/create.result:
  test result fixed
mysql-test/r/distinct.result:
  test result fixed
mysql-test/t/distinct.test:
  test case added
sql/item_cmpfunc.cc:
  max_length should be calculated differently for DECIMAL_RESULT and others
parent e595b7ee
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -434,7 +434,7 @@ d date YES NULL
e	varchar(1)	NO			
f	datetime	YES		NULL	
g	time	YES		NULL	
h	varbinary(23)	NO			
h	longblob	NO			
dd	time	YES		NULL	
select * from t2;
a	b	c	d	e	f	g	h	dd
+8 −0
Original line number Diff line number Diff line
@@ -464,3 +464,11 @@ SELECT DISTINCT html,SUM(rout)/(SUM(rin)+1) as 'prod' FROM t1 GROUP BY rin;
html	prod
1	0.0000
drop table t1;
create table t1 (id int, dsc varchar(50));
insert into t1 values (1, "line number one"), (2, "line number two"), (3, "line number three");
select distinct id, IFNULL(dsc, '-') from t1;
id	IFNULL(dsc, '-')
1	line number one
2	line number two
3	line number three
drop table t1;
+8 −0
Original line number Diff line number Diff line
@@ -332,3 +332,11 @@ CREATE TABLE t1 (
INSERT INTO t1 VALUES ('1',1,0);
SELECT DISTINCT html,SUM(rout)/(SUM(rin)+1) as 'prod' FROM t1 GROUP BY rin;
drop table t1;

#
# Bug 9784 DISTINCT IFNULL truncates data
#
create table t1 (id int, dsc varchar(50));
insert into t1 values (1, "line number one"), (2, "line number two"), (3, "line number three");
select distinct id, IFNULL(dsc, '-') from t1;
drop table t1;
+12 −14
Original line number Diff line number Diff line
@@ -1109,12 +1109,14 @@ void Item_func_between::print(String *str)
void
Item_func_ifnull::fix_length_and_dec()
{
  agg_result_type(&hybrid_type, args, 2);
  maybe_null=args[1]->maybe_null;
  decimals= max(args[0]->decimals, args[1]->decimals);
  max_length= (max(args[0]->max_length - args[0]->decimals,
                   args[1]->max_length - args[1]->decimals) +
               decimals);
  agg_result_type(&hybrid_type, args, 2);
  max_length= (hybrid_type == DECIMAL_RESULT || hybrid_type == INT_RESULT) ?
    (max(args[0]->max_length - args[0]->decimals,
         args[1]->max_length - args[1]->decimals) + decimals) :
    max(args[0]->max_length, args[1]->max_length);

  switch (hybrid_type) {
  case STRING_RESULT:
    agg_arg_charsets(collation, args, arg_count, MY_COLL_CMP_CONV);
@@ -1225,16 +1227,7 @@ Item_func_if::fix_length_and_dec()
{
  maybe_null=args[1]->maybe_null || args[2]->maybe_null;
  decimals= max(args[1]->decimals, args[2]->decimals);
  if (decimals == NOT_FIXED_DEC)
  {
    max_length= max(args[1]->max_length, args[2]->max_length);
  }
  else
  {
    max_length= (max(args[1]->max_length - args[1]->decimals,
                   args[2]->max_length - args[2]->decimals) +
               decimals);
  }

  enum Item_result arg1_type=args[1]->result_type();
  enum Item_result arg2_type=args[2]->result_type();
  bool null1=args[1]->const_item() && args[1]->null_value;
@@ -1263,6 +1256,11 @@ Item_func_if::fix_length_and_dec()
      collation.set(&my_charset_bin);	// Number
    }
  }
  max_length=
    (cached_result_type == DECIMAL_RESULT || cached_result_type == INT_RESULT) ?
    (max(args[1]->max_length - args[1]->decimals,
         args[2]->max_length - args[2]->decimals) + decimals) :
    max(args[1]->max_length, args[2]->max_length);
}