Loading mysql-test/r/func_group.result +9 −0 Original line number Diff line number Diff line Loading @@ -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; Loading mysql-test/t/func_group.test +10 −1 Original line number Diff line number Diff line Loading @@ -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 # Loading @@ -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 sql/item.h +5 −6 Original line number Diff line number Diff line Loading @@ -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; } Loading sql/item_sum.cc +5 −27 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -1890,14 +1884,8 @@ void Item_sum_count::reset_field() char *res=result_field->ptr; longlong nr=0; if (!args[0]->maybe_null) nr=1; else { args[0]->update_null_value(); if (!args[0]->null_value) if (!args[0]->maybe_null || !args[0]->is_null()) nr=1; } int8store(res,nr); } Loading Loading @@ -2000,14 +1988,8 @@ void Item_sum_count::update_field() char *res=result_field->ptr; nr=sint8korr(res); if (!args[0]->maybe_null) nr++; else { args[0]->update_null_value(); if (!args[0]->null_value) if (!args[0]->maybe_null || !args[0]->is_null()) nr++; } int8store(res,nr); } Loading Loading @@ -2431,13 +2413,9 @@ 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) if (item->const_item() && item->is_null()) always_null= 1; } } if (always_null) return FALSE; count_field_types(tmp_table_param,list,0); Loading Loading
mysql-test/r/func_group.result +9 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
mysql-test/t/func_group.test +10 −1 Original line number Diff line number Diff line Loading @@ -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 # Loading @@ -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
sql/item.h +5 −6 Original line number Diff line number Diff line Loading @@ -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; } Loading
sql/item_sum.cc +5 −27 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -1890,14 +1884,8 @@ void Item_sum_count::reset_field() char *res=result_field->ptr; longlong nr=0; if (!args[0]->maybe_null) nr=1; else { args[0]->update_null_value(); if (!args[0]->null_value) if (!args[0]->maybe_null || !args[0]->is_null()) nr=1; } int8store(res,nr); } Loading Loading @@ -2000,14 +1988,8 @@ void Item_sum_count::update_field() char *res=result_field->ptr; nr=sint8korr(res); if (!args[0]->maybe_null) nr++; else { args[0]->update_null_value(); if (!args[0]->null_value) if (!args[0]->maybe_null || !args[0]->is_null()) nr++; } int8store(res,nr); } Loading Loading @@ -2431,13 +2413,9 @@ 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) if (item->const_item() && item->is_null()) always_null= 1; } } if (always_null) return FALSE; count_field_types(tmp_table_param,list,0); Loading