Commit 286d1fc3 authored by Tom Lane's avatar Tom Lane

Fix numeric modulo operator for case of fractional right argument.

parent 2e7835f7
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* 1998 Jan Wieck * 1998 Jan Wieck
* *
* $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.36 2000/12/07 02:47:35 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.37 2001/03/14 16:50:37 tgl Exp $
* *
* ---------- * ----------
*/ */
...@@ -3355,16 +3355,19 @@ mod_var(NumericVar *var1, NumericVar *var2, NumericVar *result) ...@@ -3355,16 +3355,19 @@ mod_var(NumericVar *var1, NumericVar *var2, NumericVar *result)
init_var(&tmp); init_var(&tmp);
/* ---------- /* ----------
* We do it by fiddling around with global_rscale and truncating * We do this using the equation
* the result of the division. * mod(x,y) = x - trunc(x/y)*y
* We fiddle a bit with global_rscale to control result precision.
* ---------- * ----------
*/ */
save_global_rscale = global_rscale; save_global_rscale = global_rscale;
global_rscale = var2->rscale + 2; global_rscale = var2->rscale + 2;
div_var(var1, var2, &tmp); div_var(var1, var2, &tmp);
/* do trunc() by forgetting digits to the right of the decimal point */
tmp.ndigits = MAX(0, MIN(tmp.ndigits, tmp.weight + 1));
tmp.rscale = var2->rscale; tmp.rscale = var2->rscale;
tmp.ndigits = MAX(0, MIN(tmp.ndigits, tmp.weight + tmp.rscale + 1));
global_rscale = var2->rscale; global_rscale = var2->rscale;
mul_var(var2, &tmp, &tmp); mul_var(var2, &tmp, &tmp);
......
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