1414 * Copyright (c) 1998-2003, PostgreSQL Global Development Group
1515 *
1616 * IDENTIFICATION
17- * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.61 2003/05/12 23:08:50 tgl Exp $
17+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.62 2003/07/03 19:41:47 tgl Exp $
1818 *
1919 *-------------------------------------------------------------------------
2020 */
@@ -2983,6 +2983,7 @@ numericvar_to_int8(NumericVar *var, int64 *result)
29832983{
29842984NumericDigit * digits ;
29852985int ndigits ;
2986+ int weight ;
29862987int i ;
29872988int64 val ,
29882989oldval ;
@@ -3000,15 +3001,23 @@ numericvar_to_int8(NumericVar *var, int64 *result)
30003001return true;
30013002}
30023003
3004+ /*
3005+ * For input like 10000000000, we must treat stripped digits as real.
3006+ * So the loop assumes there are weight+1 digits before the decimal point.
3007+ */
3008+ weight = var -> weight ;
3009+ Assert (weight >=0 && ndigits <=weight + 1 );
3010+
30033011/* Construct the result */
30043012digits = var -> digits ;
30053013neg = (var -> sign == NUMERIC_NEG );
30063014val = digits [0 ];
3007- for (i = 1 ;i < ndigits ;i ++ )
3015+ for (i = 1 ;i <= weight ;i ++ )
30083016{
30093017oldval = val ;
30103018val *=NBASE ;
3011- val += digits [i ];
3019+ if (i < ndigits )
3020+ val += digits [i ];
30123021/*
30133022 * The overflow check is a bit tricky because we want to accept
30143023 * INT64_MIN, which will overflow the positive accumulator. We