diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-12-02 00:26:59 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-12-02 00:26:59 +0000 |
commit | 145d9fa46cacde5a39e184b25ba1f921142d4e94 (patch) | |
tree | 56da983a7c7fbcd0fc9262e25e09c0a0a51c9aad /src/backend/utils/adt/numeric.c | |
parent | ea4b9f14f3a5e4edb0120bae412de505a36a06b6 (diff) | |
download | postgresql-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.c | 34 |
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); } |