14
14
* Copyright (c) 1998-2005, PostgreSQL Global Development Group
15
15
*
16
16
* IDENTIFICATION
17
- * $PostgreSQL: pgsql/src/backend/utils/adt/numeric.c,v 1.83 2005/04/06 23:56:07 neilc Exp $
17
+ * $PostgreSQL: pgsql/src/backend/utils/adt/numeric.c,v 1.84 2005/06/04 14:12:50 momjian Exp $
18
18
*
19
19
*-------------------------------------------------------------------------
20
20
*/
@@ -265,7 +265,7 @@ static void sub_var(NumericVar *var1, NumericVar *var2, NumericVar *result);
265
265
static void mul_var (NumericVar * var1 , NumericVar * var2 , NumericVar * result ,
266
266
int rscale );
267
267
static void div_var (NumericVar * var1 , NumericVar * var2 , NumericVar * result ,
268
- int rscale );
268
+ int rscale , bool round );
269
269
static int select_div_scale (NumericVar * var1 , NumericVar * var2 );
270
270
static void mod_var (NumericVar * var1 , NumericVar * var2 , NumericVar * result );
271
271
static void ceil_var (NumericVar * var , NumericVar * result );
@@ -906,14 +906,14 @@ compute_bucket(Numeric operand, Numeric bound1, Numeric bound2,
906
906
sub_var (& operand_var , & bound1_var , & operand_var );
907
907
sub_var (& bound2_var , & bound1_var , & bound2_var );
908
908
div_var (& operand_var , & bound2_var , result_var ,
909
- select_div_scale (& operand_var , & bound2_var ));
909
+ select_div_scale (& operand_var , & bound2_var ), true );
910
910
}
911
911
else
912
912
{
913
913
sub_var (& bound1_var , & operand_var , & operand_var );
914
914
sub_var (& bound1_var , & bound2_var , & bound1_var );
915
915
div_var (& operand_var , & bound1_var , result_var ,
916
- select_div_scale (& operand_var , & bound1_var ));
916
+ select_div_scale (& operand_var , & bound1_var ), true );
917
917
}
918
918
919
919
mul_var (result_var , count_var , result_var ,
@@ -1266,7 +1266,7 @@ numeric_div(PG_FUNCTION_ARGS)
1266
1266
/*
1267
1267
* Do the divide and return the result
1268
1268
*/
1269
- div_var (& arg1 , & arg2 , & result , rscale );
1269
+ div_var (& arg1 , & arg2 , & result , rscale , true );
1270
1270
1271
1271
res = make_result (& result );
1272
1272
@@ -2246,7 +2246,7 @@ numeric_variance(PG_FUNCTION_ARGS)
2246
2246
{
2247
2247
mul_var (& vN , & vNminus1 , & vNminus1 , 0 ); /* N * (N - 1) */
2248
2248
rscale = select_div_scale (& vsumX2 , & vNminus1 );
2249
- div_var (& vsumX2 , & vNminus1 , & vsumX , rscale ); /* variance */
2249
+ div_var (& vsumX2 , & vNminus1 , & vsumX , rscale , true ); /* variance */
2250
2250
2251
2251
res = make_result (& vsumX );
2252
2252
}
@@ -2322,7 +2322,7 @@ numeric_stddev(PG_FUNCTION_ARGS)
2322
2322
{
2323
2323
mul_var (& vN , & vNminus1 , & vNminus1 , 0 ); /* N * (N - 1) */
2324
2324
rscale = select_div_scale (& vsumX2 , & vNminus1 );
2325
- div_var (& vsumX2 , & vNminus1 , & vsumX , rscale ); /* variance */
2325
+ div_var (& vsumX2 , & vNminus1 , & vsumX , rscale , true ); /* variance */
2326
2326
sqrt_var (& vsumX , & vsumX , rscale ); /* stddev */
2327
2327
2328
2328
res = make_result (& vsumX );
@@ -3840,7 +3840,7 @@ mul_var(NumericVar *var1, NumericVar *var2, NumericVar *result,
3840
3840
*/
3841
3841
static void
3842
3842
div_var (NumericVar * var1 , NumericVar * var2 , NumericVar * result ,
3843
- int rscale )
3843
+ int rscale , bool round )
3844
3844
{
3845
3845
int div_ndigits ;
3846
3846
int res_sign ;
@@ -4079,8 +4079,11 @@ div_var(NumericVar *var1, NumericVar *var2, NumericVar *result,
4079
4079
result -> sign = res_sign ;
4080
4080
4081
4081
/* Round to target rscale (and set result->dscale) */
4082
- round_var (result , rscale );
4083
-
4082
+ if (round )
4083
+ round_var (result , rscale );
4084
+ else
4085
+ trunc_var (result , rscale );
4086
+
4084
4087
/* Strip leading and trailing zeroes */
4085
4088
strip_var (result );
4086
4089
}
@@ -4178,7 +4181,7 @@ mod_var(NumericVar *var1, NumericVar *var2, NumericVar *result)
4178
4181
*/
4179
4182
rscale = select_div_scale (var1 , var2 );
4180
4183
4181
- div_var (var1 , var2 , & tmp , rscale );
4184
+ div_var (var1 , var2 , & tmp , rscale , false );
4182
4185
4183
4186
trunc_var (& tmp , 0 );
4184
4187
@@ -4294,7 +4297,7 @@ sqrt_var(NumericVar *arg, NumericVar *result, int rscale)
4294
4297
4295
4298
for (;;)
4296
4299
{
4297
- div_var (& tmp_arg , result , & tmp_val , local_rscale );
4300
+ div_var (& tmp_arg , result , & tmp_val , local_rscale , true );
4298
4301
4299
4302
add_var (result , & tmp_val , result );
4300
4303
mul_var (result , & const_zero_point_five , result , local_rscale );
@@ -4384,7 +4387,7 @@ exp_var(NumericVar *arg, NumericVar *result, int rscale)
4384
4387
4385
4388
/* Compensate for input sign, and round to requested rscale */
4386
4389
if (xneg )
4387
- div_var (& const_one , result , result , rscale );
4390
+ div_var (& const_one , result , result , rscale , true );
4388
4391
else
4389
4392
round_var (result , rscale );
4390
4393
@@ -4450,7 +4453,7 @@ exp_var_internal(NumericVar *arg, NumericVar *result, int rscale)
4450
4453
add_var (& ni , & const_one , & ni );
4451
4454
mul_var (& xpow , & x , & xpow , local_rscale );
4452
4455
mul_var (& ifac , & ni , & ifac , 0 );
4453
- div_var (& xpow , & ifac , & elem , local_rscale );
4456
+ div_var (& xpow , & ifac , & elem , local_rscale , true );
4454
4457
4455
4458
if (elem .ndigits == 0 )
4456
4459
break ;
@@ -4534,7 +4537,7 @@ ln_var(NumericVar *arg, NumericVar *result, int rscale)
4534
4537
*/
4535
4538
sub_var (& x , & const_one , result );
4536
4539
add_var (& x , & const_one , & elem );
4537
- div_var (result , & elem , result , local_rscale );
4540
+ div_var (result , & elem , result , local_rscale , true );
4538
4541
set_var_from_var (result , & xx );
4539
4542
mul_var (result , result , & x , local_rscale );
4540
4543
@@ -4544,7 +4547,7 @@ ln_var(NumericVar *arg, NumericVar *result, int rscale)
4544
4547
{
4545
4548
add_var (& ni , & const_two , & ni );
4546
4549
mul_var (& xx , & x , & xx , local_rscale );
4547
- div_var (& xx , & ni , & elem , local_rscale );
4550
+ div_var (& xx , & ni , & elem , local_rscale , true );
4548
4551
4549
4552
if (elem .ndigits == 0 )
4550
4553
break ;
@@ -4614,7 +4617,7 @@ log_var(NumericVar *base, NumericVar *num, NumericVar *result)
4614
4617
/* Select scale for division result */
4615
4618
rscale = select_div_scale (& ln_num , & ln_base );
4616
4619
4617
- div_var (& ln_num , & ln_base , result , rscale );
4620
+ div_var (& ln_num , & ln_base , result , rscale , true );
4618
4621
4619
4622
free_var (& ln_num );
4620
4623
free_var (& ln_base );
@@ -4752,7 +4755,7 @@ power_var_int(NumericVar *base, int exp, NumericVar *result, int rscale)
4752
4755
round_var (result , rscale );
4753
4756
return ;
4754
4757
case -1 :
4755
- div_var (& const_one , base , result , rscale );
4758
+ div_var (& const_one , base , result , rscale , true );
4756
4759
return ;
4757
4760
case 2 :
4758
4761
mul_var (base , base , result , rscale );
@@ -4790,7 +4793,7 @@ power_var_int(NumericVar *base, int exp, NumericVar *result, int rscale)
4790
4793
4791
4794
/* Compensate for input sign, and round to requested rscale */
4792
4795
if (neg )
4793
- div_var (& const_one , result , result , rscale );
4796
+ div_var (& const_one , result , result , rscale , true );
4794
4797
else
4795
4798
round_var (result , rscale );
4796
4799
}
0 commit comments