Commit b96dbef6 authored by unknown's avatar unknown
Browse files

Fix bug #14016 date_format() 2nd parameter was compared using case insensitive

collation

By default constant strings in second parameter of date_time() have case
insensitive collation. Because of this expressions date_format(f,'%m') and 
date_format(f,'%M') wrongly becomes equal, which results in choosing wrong 
column to sort by.

Now if second parameter of date_format() is constant then it's collation is 
changed to case sensitive.


sql/item_timefunc.cc:
  Fix bug #14016 date_format() 2nd parameter was compared using case insensitive collation.
  If second parameter of date_format() is constant then it's collation is changed to case sensitive.
mysql-test/r/date_formats.result:
  Test case for bug#14016 2nd parameter was compared using case insensitive collation
mysql-test/t/date_formats.test:
  Test case for bug#14016 2nd parameter was compared using case insensitive collation
parent 6e49a48a
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -456,3 +456,11 @@ f1 f2
Warnings:
Warning	1292	Truncated incorrect date value: '2003-04-05  g'
Warning	1292	Truncated incorrect datetime value: '2003-04-05 10:11:12.101010234567'
create table t1 (f1 datetime);
insert into t1 (f1) values ("2005-01-01");
insert into t1 (f1) values ("2005-02-01");
select date_format(f1, "%m") as d1, date_format(f1, "%M") as d2 from t1 order by date_format(f1, "%M");
d1	d2
02	February
01	January
drop table t1;
+8 −0
Original line number Diff line number Diff line
@@ -260,4 +260,12 @@ select str_to_date("2003-04-05 g", "%Y-%m-%d") as f1,
       str_to_date("2003-04-05 10:11:12.101010234567", "%Y-%m-%d %H:%i:%S.%f") as f2;
--enable_ps_protocol

#
# Bug #14016 
#
create table t1 (f1 datetime);
insert into t1 (f1) values ("2005-01-01");
insert into t1 (f1) values ("2005-02-01");
select date_format(f1, "%m") as d1, date_format(f1, "%M") as d2 from t1 order by date_format(f1, "%M");
drop table t1;
# End of 4.1 tests
+10 −0
Original line number Diff line number Diff line
@@ -1528,6 +1528,16 @@ void Item_func_date_format::fix_length_and_dec()
  if (args[1]->type() == STRING_ITEM)
  {						// Optimize the normal case
    fixed_length=1;

    /*
      Force case sensitive collation on format string.
      This needed because format modifiers with different case,
      for example %m and %M, have different meaning. Thus eq()
      will distinguish them.
    */
    args[1]->collation.set(
        get_charset_by_csname(args[1]->collation.collation->csname,
                              MY_CS_BINSORT,MYF(0)), DERIVATION_COERCIBLE);
    /*
      The result is a binary string (no reason to use collation->mbmaxlen
      This is becasue make_date_time() only returns binary strings