Commit fbb23326 authored by evgen@moonbone.local's avatar evgen@moonbone.local
Browse files

Bug#28208: Wrong result of a non-const STRING function with a const DATETIME

function.

A wrong  condition was used to check that the
Arg_comparator::can_compare_as_dates() function calculated the value of the
string constant. When comparing a non-const STRING function with a constant
DATETIME function it leads to saving an arbitrary value as a cached value of
the DATETIME function.

Now the Arg_comparator::set_cmp_func() function initializes the const_value
variable to the impossible DATETIME value (-1) and this const_value is
cached only if it was changed by the Arg_comparator::can_compare_as_dates()
function.
parent 22dfb9f0
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -346,3 +346,9 @@ call test27759();
a	b	a_then_b	b_then_a	c_then_a
2007-04-10	2007-04-11	2007-04-10	2007-04-10	2004-04-09 00:00:00
drop procedure test27759;
create table t1 (f1 date);
insert into t1 values (curdate());
select left(f1,10) = curdate() from t1;
left(f1,10) = curdate()
1
drop table t1;
+9 −0
Original line number Diff line number Diff line
@@ -225,3 +225,12 @@ END;|
DELIMITER ;|
call test27759();
drop procedure test27759;

#
# Bug#28208: Wrong result of a non-const STRING function with a const
#            DATETIME function.
#
create table t1 (f1 date);
insert into t1 values (curdate());
select left(f1,10) = curdate() from t1;
drop table t1;
+2 −3
Original line number Diff line number Diff line
@@ -661,7 +661,7 @@ int Arg_comparator::set_cmp_func(Item_bool_func2 *owner_arg,
                                        Item_result type)
{
  enum enum_date_cmp_type cmp_type;
  ulonglong const_value;
  ulonglong const_value= (ulonglong)-1;
  a= a1;
  b= a2;

@@ -674,8 +674,7 @@ int Arg_comparator::set_cmp_func(Item_bool_func2 *owner_arg,
    a_cache= 0;
    b_cache= 0;

    if (cmp_type != CMP_DATE_WITH_DATE &&
        ((*b)->const_item() || (*a)->const_item()))
    if (const_value != (ulonglong)-1)
    {
      Item_cache_int *cache= new Item_cache_int();
      /* Mark the cache as non-const to prevent re-caching. */