Merge mysql.com:/home/ram/work/mysql-5.0-maint

into  mysql.com:/home/ram/work/b21976/my50-b21976
parents 73f0c5d7 294ae90d
......@@ -1296,6 +1296,15 @@ select var_samp(e) as '0.5', var_pop(e) as '0.25' from bug22555;
0.5 0.25
0.5000 0.2500
drop table bug22555;
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;
CREATE TABLE t1 (a INT, b INT);
INSERT INTO t1 VALUES (1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8);
INSERT INTO t1 SELECT a, b+8 FROM t1;
......
......@@ -793,6 +793,16 @@ select var_samp(e) as '0.5', var_pop(e) as '0.25' from bug22555;
drop table bug22555;
#
# 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;
#
# Bug #23184: SELECT causes server crash
#
......@@ -817,5 +827,4 @@ SELECT a,AVG(DISTINCT b) AS average FROM t1 GROUP BY a HAVING average > 50;
DROP TABLE t1;
###
--echo End of 5.0 tests
......@@ -694,12 +694,11 @@ class Item {
virtual bool get_date_result(TIME *ltime,uint fuzzydate)
{ return get_date(ltime,fuzzydate); }
/*
This function is used only in Item_func_isnull/Item_func_isnotnull
(implementations of IS NULL/IS NOT NULL clauses). Item_func_is{not}null
calls this method instead of one of val/result*() methods, which
normally will set null_value. This allows to determine nullness of
a complex expression without fully evaluating it.
Any new item which can be NULL must implement this call.
The method allows to determine nullness of a complex expression
without fully evaluating it, instead of calling val/result*() then
checking null_value. Used in Item_func_isnull/Item_func_isnotnull
and Item_sum_count/Item_sum_count_distinct.
Any new item which can be NULL must implement this method.
*/
virtual bool is_null() { return 0; }
......
......@@ -1050,14 +1050,8 @@ void Item_sum_count::clear()
bool Item_sum_count::add()
{
if (!args[0]->maybe_null)
if (!args[0]->maybe_null || !args[0]->is_null())
count++;
else
{
args[0]->update_null_value();
if (!args[0]->null_value)
count++;
}
return 0;
}
......@@ -1890,14 +1884,8 @@ void Item_sum_count::reset_field()
char *res=result_field->ptr;
longlong nr=0;
if (!args[0]->maybe_null)
if (!args[0]->maybe_null || !args[0]->is_null())
nr=1;
else
{
args[0]->update_null_value();
if (!args[0]->null_value)
nr=1;
}
int8store(res,nr);
}
......@@ -2000,14 +1988,8 @@ void Item_sum_count::update_field()
char *res=result_field->ptr;
nr=sint8korr(res);
if (!args[0]->maybe_null)
if (!args[0]->maybe_null || !args[0]->is_null())
nr++;
else
{
args[0]->update_null_value();
if (!args[0]->null_value)
nr++;
}
int8store(res,nr);
}
......@@ -2431,12 +2413,8 @@ bool Item_sum_count_distinct::setup(THD *thd)
Item *item=args[i];
if (list.push_back(item))
return TRUE; // End of memory
if (item->const_item())
{
item->update_null_value();
if (item->null_value)
always_null=1;
}
if (item->const_item() && item->is_null())
always_null= 1;
}
if (always_null)
return FALSE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment