mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Fix for bug #21976: Unnecessary warning with count(decimal)
We use val_int() calls (followed by null_value check) to determine nullness in some Item_sum_count' and Item_sum_count_distinct' methods, as a side effect we get extra warnings raised in the val_int(). Fix: use is_null() instead. mysql-test/r/func_group.result: Fix for bug #21976: Unnecessary warning with count(decimal) - test result. mysql-test/t/func_group.test: Fix for bug #21976: Unnecessary warning with count(decimal) - test case. sql/item.h: Fix for bug #21976: Unnecessary warning with count(decimal) - comment adjusted. sql/item_sum.cc: Fix for bug #21976: Unnecessary warning with count(decimal) - use is_null() to determine nullness.
This commit is contained in:
@@ -1029,3 +1029,13 @@ t1 CREATE TABLE `t1` (
|
|||||||
`stddev(0)` double(8,4) default NULL
|
`stddev(0)` double(8,4) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (a decimal(20));
|
||||||
|
insert into t1 values (12345678901234567890);
|
||||||
|
select count(a) from t1;
|
||||||
|
count(a)
|
||||||
|
1
|
||||||
|
select count(distinct a) from t1;
|
||||||
|
count(distinct a)
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@@ -700,3 +700,14 @@ create table t1 select stddev(0);
|
|||||||
show create table t1;
|
show create table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #21976: Unnecessary warning with count(decimal)
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t1 (a decimal(20));
|
||||||
|
insert into t1 values (12345678901234567890);
|
||||||
|
select count(a) from t1;
|
||||||
|
select count(distinct a) from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo End of 5.0 tests
|
||||||
|
11
sql/item.h
11
sql/item.h
@@ -701,12 +701,11 @@ public:
|
|||||||
virtual bool get_date_result(TIME *ltime,uint fuzzydate)
|
virtual bool get_date_result(TIME *ltime,uint fuzzydate)
|
||||||
{ return get_date(ltime,fuzzydate); }
|
{ return get_date(ltime,fuzzydate); }
|
||||||
/*
|
/*
|
||||||
This function is used only in Item_func_isnull/Item_func_isnotnull
|
The method allows to determine nullness of a complex expression
|
||||||
(implementations of IS NULL/IS NOT NULL clauses). Item_func_is{not}null
|
without fully evaluating it, instead of calling val/result*() then
|
||||||
calls this method instead of one of val/result*() methods, which
|
checking null_value. Used in Item_func_isnull/Item_func_isnotnull
|
||||||
normally will set null_value. This allows to determine nullness of
|
and Item_sum_count/Item_sum_count_distinct.
|
||||||
a complex expression without fully evaluating it.
|
Any new item which can be NULL must implement this method.
|
||||||
Any new item which can be NULL must implement this call.
|
|
||||||
*/
|
*/
|
||||||
virtual bool is_null() { return 0; }
|
virtual bool is_null() { return 0; }
|
||||||
|
|
||||||
|
@@ -1034,14 +1034,8 @@ void Item_sum_count::clear()
|
|||||||
|
|
||||||
bool Item_sum_count::add()
|
bool Item_sum_count::add()
|
||||||
{
|
{
|
||||||
if (!args[0]->maybe_null)
|
if (!args[0]->maybe_null || !args[0]->is_null())
|
||||||
count++;
|
count++;
|
||||||
else
|
|
||||||
{
|
|
||||||
(void) args[0]->val_int();
|
|
||||||
if (!args[0]->null_value)
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1941,14 +1935,8 @@ void Item_sum_count::reset_field()
|
|||||||
char *res=result_field->ptr;
|
char *res=result_field->ptr;
|
||||||
longlong nr=0;
|
longlong nr=0;
|
||||||
|
|
||||||
if (!args[0]->maybe_null)
|
if (!args[0]->maybe_null || !args[0]->is_null())
|
||||||
nr=1;
|
nr=1;
|
||||||
else
|
|
||||||
{
|
|
||||||
(void) args[0]->val_int();
|
|
||||||
if (!args[0]->null_value)
|
|
||||||
nr=1;
|
|
||||||
}
|
|
||||||
int8store(res,nr);
|
int8store(res,nr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2051,14 +2039,8 @@ void Item_sum_count::update_field()
|
|||||||
char *res=result_field->ptr;
|
char *res=result_field->ptr;
|
||||||
|
|
||||||
nr=sint8korr(res);
|
nr=sint8korr(res);
|
||||||
if (!args[0]->maybe_null)
|
if (!args[0]->maybe_null || !args[0]->is_null())
|
||||||
nr++;
|
nr++;
|
||||||
else
|
|
||||||
{
|
|
||||||
(void) args[0]->val_int();
|
|
||||||
if (!args[0]->null_value)
|
|
||||||
nr++;
|
|
||||||
}
|
|
||||||
int8store(res,nr);
|
int8store(res,nr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2531,12 +2513,8 @@ bool Item_sum_count_distinct::setup(THD *thd)
|
|||||||
Item *item=args[i];
|
Item *item=args[i];
|
||||||
if (list.push_back(item))
|
if (list.push_back(item))
|
||||||
return TRUE; // End of memory
|
return TRUE; // End of memory
|
||||||
if (item->const_item())
|
if (item->const_item() && item->is_null())
|
||||||
{
|
always_null= 1;
|
||||||
(void) item->val_int();
|
|
||||||
if (item->null_value)
|
|
||||||
always_null=1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (always_null)
|
if (always_null)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
Reference in New Issue
Block a user