@ -14,7 +14,7 @@
* Copyright ( c ) 1998 - 2007 , PostgreSQL Global Development Group
*
* IDENTIFICATION
* $ PostgreSQL : pgsql / src / backend / utils / adt / numeric . c , v 1.103 2007 / 06 / 05 21 : 31 : 06 tgl Exp $
* $ PostgreSQL : pgsql / src / backend / utils / adt / numeric . c , v 1.104 2007 / 06 / 09 15 : 52 : 30 tgl Exp $
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
@ -29,6 +29,7 @@
# include "access/hash.h"
# include "catalog/pg_type.h"
# include "libpq/pqformat.h"
# include "miscadmin.h"
# include "utils/array.h"
# include "utils/builtins.h"
# include "utils/int8.h"
@ -1560,6 +1561,11 @@ numeric_fac(PG_FUNCTION_ARGS)
res = make_result ( & const_one ) ;
PG_RETURN_NUMERIC ( res ) ;
}
/* Fail immediately if the result would overflow */
if ( num > 32177 )
ereport ( ERROR ,
( errcode ( ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE ) ,
errmsg ( " value overflows numeric format " ) ) ) ;
init_var ( & fact ) ;
init_var ( & result ) ;
@ -1568,6 +1574,9 @@ numeric_fac(PG_FUNCTION_ARGS)
for ( num = num - 1 ; num > 1 ; num - - )
{
/* this loop can take awhile, so allow it to be interrupted */
CHECK_FOR_INTERRUPTS ( ) ;
int8_to_numericvar ( num , & fact ) ;
mul_var ( & result , & fact , & result , 0 ) ;