Commit 5463fdfe authored by monty@hundin.mysql.fi's avatar monty@hundin.mysql.fi
Browse files

Fixed bug in ISNULL(not_null_expression)

parent 2453d43a
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -46926,8 +46926,13 @@ Fixed core dump problem on OSF in @code{gethostbyname_r}.
@item
Fixed that underflowed decimal fields is not zero filled.
@item
@code{'+11111'} in overflow for @code{decimal(5,0) unsigned} columns,
Just sign will be dropped.
If we get an overflow when inserting @code{'+11111'} for
@code{decimal(5,0) unsigned} columns, we will just drop the sign.
@item
Fixed bug with @code{ISNULL(expression_which_cannot_be_null)}.
@item
Fixed host lookup bug in the glibc library that we used with the 3.23.50
Linux-x86 binaries.
@end itemize
@node News-3.23.50, News-3.23.49, News-3.23.51, News-3.23.x
+1 −0
Original line number Diff line number Diff line
id	mydate
+10 −0
Original line number Diff line number Diff line
#
# test of ISNULL()
#

drop table if exists t1;
create table t1 (id int auto_increment primary key not null, mydate date not null);
insert into t1 values (0,"2002-05-01"),(0,"2002-05-01"),(0,"2002-05-01");
flush tables;
select * from t1 where isnull(to_days(mydate));
drop table t1;
+30 −19
Original line number Diff line number Diff line
@@ -25,9 +25,9 @@
#include <m_ctype.h>

/*
** Test functions
** These returns 0LL if false and 1LL if true and null if some arg is null
** 'AND' and 'OR' never return null
  Test functions
  These returns 0LL if false and 1LL if true and null if some arg is null
  'AND' and 'OR' never return null
*/

longlong Item_func_not::val_int()
@@ -59,8 +59,10 @@ void Item_bool_func2::fix_length_and_dec()
{
  max_length=1;

  /* As some compare functions are generated after sql_yacc,
     we have to check for out of memory conditons here */
  /*
    As some compare functions are generated after sql_yacc,
    we have to check for out of memory conditons here
  */
  if (!args[0] || !args[1])
    return;
  // Make a special case of compare with fields to get nicer DATE comparisons
@@ -336,8 +338,10 @@ void Item_func_between::fix_length_and_dec()
{
   max_length=1;

  /* As some compare functions are generated after sql_yacc,
     we have to check for out of memory conditons here */
  /*
    As some compare functions are generated after sql_yacc,
    we have to check for out of memory conditons here
  */
  if (!args[0] || !args[1] || !args[2])
    return;
  cmp_type=args[0]->result_type();
@@ -594,11 +598,10 @@ Item_func_nullif::val_str(String *str)
}

/*
** CASE expression 
  CASE expression 
  Return the matching ITEM or NULL if all compares (including else) failed
*/

/* Return the matching ITEM or NULL if all compares (including else) failed */

Item *Item_func_case::find_item(String *str)
{
  String *first_expr_str,*tmp;
@@ -786,7 +789,7 @@ void Item_func_case::print(String *str)
}

/*
** Coalesce - return first not NULL argument.
  Coalesce - return first not NULL argument.
*/

String *Item_func_coalesce::val_str(String *str)
@@ -841,7 +844,7 @@ void Item_func_coalesce::fix_length_and_dec()
}

/****************************************************************************
** classes and function for the IN operator
 Classes and function for the IN operator
****************************************************************************/

static int cmp_longlong(longlong *a,longlong *b)
@@ -1170,9 +1173,11 @@ longlong Item_cond_and::val_int()
  {
    if (item->val_int() == 0)
    {
      /* TODO: In case of NULL, ANSI would require us to continue evaluation
      /*
	TODO: In case of NULL, ANSI would require us to continue evaluation
	until we get a FALSE value or run out of values; This would
	 require a lot of unnecessary evaluation, which we skip for now */
	require a lot of unnecessary evaluation, which we skip for now
      */
      null_value=item->null_value;
      return 0;
    }
@@ -1201,6 +1206,12 @@ longlong Item_cond_or::val_int()

longlong Item_func_isnull::val_int()
{
  /*
    Handle optimization if the argument can't be null
    This has to be here because of the test in update_used_tables().
  */
  if (!used_tables_cache)
    return 0;
  (void) args[0]->val();
  return (args[0]->null_value) ? 1 : 0;
}