aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/numeric.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-12-02 00:26:59 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-12-02 00:26:59 +0000
commit145d9fa46cacde5a39e184b25ba1f921142d4e94 (patch)
tree56da983a7c7fbcd0fc9262e25e09c0a0a51c9aad /src/backend/utils/adt/numeric.c
parentea4b9f14f3a5e4edb0120bae412de505a36a06b6 (diff)
downloadpostgresql-145d9fa46cacde5a39e184b25ba1f921142d4e94.tar.gz
postgresql-145d9fa46cacde5a39e184b25ba1f921142d4e94.zip
Code and docs review for numeric-factorial patch.
Diffstat (limited to 'src/backend/utils/adt/numeric.c')
-rw-r--r--src/backend/utils/adt/numeric.c34
1 files changed, 12 insertions, 22 deletions
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c
index 7f16ee37a24..e825b101a16 100644
--- a/src/backend/utils/adt/numeric.c
+++ b/src/backend/utils/adt/numeric.c
@@ -14,7 +14,7 @@
* Copyright (c) 1998-2003, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/numeric.c,v 1.69 2003/12/01 21:52:37 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/numeric.c,v 1.70 2003/12/02 00:26:59 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1290,49 +1290,39 @@ numeric_larger(PG_FUNCTION_ARGS)
/*
* numeric_fac()
- * Computer factorial
+ *
+ * Compute factorial
*/
-
Datum
numeric_fac(PG_FUNCTION_ARGS)
{
-
int64 num = PG_GETARG_INT64(0);
- NumericVar count;
+ Numeric res;
NumericVar fact;
- NumericVar zerovar;
NumericVar result;
- Numeric res;
- if(num < 1) {
+ if (num <= 1)
+ {
res = make_result(&const_one);
PG_RETURN_NUMERIC(res);
}
-
init_var(&fact);
- init_var(&count);
init_var(&result);
- init_var(&zerovar);
- zero_var(&zerovar);
-
- int8_to_numericvar((int64)num, &result);
- set_var_from_var(&const_one, &count);
- for(num = num - 1; num > 0; num--) {
- set_var_from_var(&result,&count);
+ int8_to_numericvar(num, &result);
- int8_to_numericvar((int64)num,&fact);
+ for (num = num - 1; num > 1; num--)
+ {
+ int8_to_numericvar(num, &fact);
- mul_var(&count, &fact, &result, count.dscale + fact.dscale);
+ mul_var(&result, &fact, &result, 0);
}
- res = make_result(&count);
+ res = make_result(&result);
- free_var(&count);
free_var(&fact);
free_var(&result);
- free_var(&zerovar);
PG_RETURN_NUMERIC(res);
}