mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-30 19:00:29 +08:00
Fix numeric modulo operator for case of fractional right argument.
This commit is contained in:
parent
2e7835f7f8
commit
286d1fc382
@ -5,7 +5,7 @@
|
||||
*
|
||||
* 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)
|
||||
init_var(&tmp);
|
||||
|
||||
/* ----------
|
||||
* We do it by fiddling around with global_rscale and truncating
|
||||
* the result of the division.
|
||||
* We do this using the equation
|
||||
* mod(x,y) = x - trunc(x/y)*y
|
||||
* We fiddle a bit with global_rscale to control result precision.
|
||||
* ----------
|
||||
*/
|
||||
save_global_rscale = global_rscale;
|
||||
global_rscale = var2->rscale + 2;
|
||||
|
||||
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.ndigits = MAX(0, MIN(tmp.ndigits, tmp.weight + tmp.rscale + 1));
|
||||
|
||||
global_rscale = var2->rscale;
|
||||
mul_var(var2, &tmp, &tmp);
|
||||
|
Loading…
Reference in New Issue
Block a user