summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Docs/manual.texi9
-rw-r--r--mysql-test/r/func_isnull.result1
-rw-r--r--mysql-test/t/func_isnull.test10
-rw-r--r--sql/item_cmpfunc.cc49
4 files changed, 48 insertions, 21 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi
index f1700402c12..25db42c96e0 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -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
diff --git a/mysql-test/r/func_isnull.result b/mysql-test/r/func_isnull.result
new file mode 100644
index 00000000000..deaeaaf71c9
--- /dev/null
+++ b/mysql-test/r/func_isnull.result
@@ -0,0 +1 @@
+id mydate
diff --git a/mysql-test/t/func_isnull.test b/mysql-test/t/func_isnull.test
new file mode 100644
index 00000000000..bd3bcd8d04c
--- /dev/null
+++ b/mysql-test/t/func_isnull.test
@@ -0,0 +1,10 @@
+#
+# 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;
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 2b7f4cb6c40..0c0eef37841 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -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();
@@ -389,7 +393,7 @@ longlong Item_func_between::val_int()
{
longlong value=args[0]->val_int(),a,b;
if ((null_value=args[0]->null_value))
- return 0; /* purecov: inspected */
+ return 0; /* purecov: inspected */
a=args[1]->val_int();
b=args[2]->val_int();
if (!args[1]->null_value && !args[2]->null_value)
@@ -409,7 +413,7 @@ longlong Item_func_between::val_int()
{
double value=args[0]->val(),a,b;
if ((null_value=args[0]->null_value))
- return 0; /* purecov: inspected */
+ return 0; /* purecov: inspected */
a=args[1]->val();
b=args[2]->val();
if (!args[1]->null_value && !args[2]->null_value)
@@ -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)
@@ -914,7 +917,7 @@ byte *in_longlong::get_value(Item *item)
{
tmp=item->val_int();
if (item->null_value)
- return 0; /* purecov: inspected */
+ return 0; /* purecov: inspected */
return (byte*) &tmp;
}
@@ -932,7 +935,7 @@ byte *in_double::get_value(Item *item)
{
tmp=item->val();
if (item->null_value)
- return 0; /* purecov: inspected */
+ return 0; /* purecov: inspected */
return (byte*) &tmp;
}
@@ -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
- until we get a FALSE value or run out of values; This would
- require a lot of unnecessary evaluation, which we skip for now */
+ /*
+ 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
+ */
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;
}