summaryrefslogtreecommitdiff
path: root/sql/sql_analyse.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_analyse.cc')
-rw-r--r--sql/sql_analyse.cc33
1 files changed, 25 insertions, 8 deletions
diff --git a/sql/sql_analyse.cc b/sql/sql_analyse.cc
index 669f998cde5..e1f4b8f6076 100644
--- a/sql/sql_analyse.cc
+++ b/sql/sql_analyse.cc
@@ -466,7 +466,9 @@ void field_real::add()
void field_decimal::add()
{
+ /*TODO - remove rounding stuff after decimal_div returns proper frac */
my_decimal dec_buf, *dec= item->val_decimal(&dec_buf);
+ my_decimal rounded;
uint length;
TREE_ELEMENT *element;
@@ -476,6 +478,9 @@ void field_decimal::add()
return;
}
+ my_decimal_round(E_DEC_FATAL_ERROR, dec, item->decimals, FALSE,&rounded);
+ dec= &rounded;
+
length= my_decimal_string_length(dec);
if (decimal_is_zero(dec))
@@ -1021,10 +1026,16 @@ String *field_decimal::avg(String *s, ha_rows rows)
s->set((double) 0.0, 1,my_thd_charset);
return s;
}
- my_decimal num, avg_val;
+ my_decimal num, avg_val, rounded_avg;
+ int prec_increment= current_thd->variables.div_precincrement;
+
int2my_decimal(E_DEC_FATAL_ERROR, rows - nulls, FALSE, &num);
- my_decimal_div(E_DEC_FATAL_ERROR, &avg_val, sum+cur_sum, &num, 0);
- my_decimal2string(E_DEC_FATAL_ERROR, &avg_val, 0, 0, '0', s);
+ my_decimal_div(E_DEC_FATAL_ERROR, &avg_val, sum+cur_sum, &num, prec_increment);
+ /* TODO remove this after decimal_div returns proper frac */
+ my_decimal_round(E_DEC_FATAL_ERROR, &avg_val,
+ min(sum[cur_sum].frac + prec_increment, DECIMAL_MAX_SCALE),
+ FALSE,&rounded_avg);
+ my_decimal2string(E_DEC_FATAL_ERROR, &rounded_avg, 0, 0, '0', s);
return s;
}
@@ -1036,13 +1047,19 @@ String *field_decimal::std(String *s, ha_rows rows)
s->set((double) 0.0, 1,my_thd_charset);
return s;
}
- my_decimal num, std_val, sum2, sum2d;
+ my_decimal num, tmp, sum2, sum2d;
+ double std_sqr;
+ int prec_increment= current_thd->variables.div_precincrement;
+
int2my_decimal(E_DEC_FATAL_ERROR, rows - nulls, FALSE, &num);
my_decimal_mul(E_DEC_FATAL_ERROR, &sum2, sum+cur_sum, sum+cur_sum);
- my_decimal_div(E_DEC_FATAL_ERROR, &std_val, &sum2, &num, 0);
- my_decimal_sub(E_DEC_FATAL_ERROR, &sum2, sum_sqr+cur_sum, &std_val);
- my_decimal_div(E_DEC_FATAL_ERROR, &std_val, &sum2, &num, 0);
- my_decimal2string(E_DEC_FATAL_ERROR, &std_val, 0, 0, '0', s);
+ my_decimal_div(E_DEC_FATAL_ERROR, &tmp, &sum2, &num, prec_increment);
+ my_decimal_sub(E_DEC_FATAL_ERROR, &sum2, sum_sqr+cur_sum, &tmp);
+ my_decimal_div(E_DEC_FATAL_ERROR, &tmp, &sum2, &num, prec_increment);
+ my_decimal2double(E_DEC_FATAL_ERROR, &tmp, &std_sqr);
+ s->set(((double) std_sqr <= 0.0 ? 0.0 : sqrt(std_sqr)),
+ min(item->decimals + prec_increment, NOT_FIXED_DEC), my_thd_charset);
+
return s;
}