mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
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
This commit is contained in:
@ -456,3 +456,11 @@ f1 f2
|
|||||||
Warnings:
|
Warnings:
|
||||||
Warning 1292 Truncated incorrect date value: '2003-04-05 g'
|
Warning 1292 Truncated incorrect date value: '2003-04-05 g'
|
||||||
Warning 1292 Truncated incorrect datetime value: '2003-04-05 10:11:12.101010234567'
|
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;
|
||||||
|
@ -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;
|
str_to_date("2003-04-05 10:11:12.101010234567", "%Y-%m-%d %H:%i:%S.%f") as f2;
|
||||||
--enable_ps_protocol
|
--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
|
# End of 4.1 tests
|
||||||
|
@ -1528,6 +1528,16 @@ void Item_func_date_format::fix_length_and_dec()
|
|||||||
if (args[1]->type() == STRING_ITEM)
|
if (args[1]->type() == STRING_ITEM)
|
||||||
{ // Optimize the normal case
|
{ // Optimize the normal case
|
||||||
fixed_length=1;
|
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
|
The result is a binary string (no reason to use collation->mbmaxlen
|
||||||
This is becasue make_date_time() only returns binary strings
|
This is becasue make_date_time() only returns binary strings
|
||||||
|
Reference in New Issue
Block a user