Commit cdb8a844 authored by Tom Lane's avatar Tom Lane

Fix bug I introduced in recent rewrite of NUMERIC code: numeric to

integer conversions gave the wrong answer for values with stripped
trailing zeroes, such as 10000000.
parent b89140a7
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* Copyright (c) 1998-2003, PostgreSQL Global Development Group * Copyright (c) 1998-2003, PostgreSQL Global Development Group
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.61 2003/05/12 23:08:50 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.62 2003/07/03 19:41:47 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -2983,6 +2983,7 @@ numericvar_to_int8(NumericVar *var, int64 *result) ...@@ -2983,6 +2983,7 @@ numericvar_to_int8(NumericVar *var, int64 *result)
{ {
NumericDigit *digits; NumericDigit *digits;
int ndigits; int ndigits;
int weight;
int i; int i;
int64 val, int64 val,
oldval; oldval;
...@@ -3000,15 +3001,23 @@ numericvar_to_int8(NumericVar *var, int64 *result) ...@@ -3000,15 +3001,23 @@ numericvar_to_int8(NumericVar *var, int64 *result)
return true; return true;
} }
/*
* For input like 10000000000, we must treat stripped digits as real.
* So the loop assumes there are weight+1 digits before the decimal point.
*/
weight = var->weight;
Assert(weight >= 0 && ndigits <= weight+1);
/* Construct the result */ /* Construct the result */
digits = var->digits; digits = var->digits;
neg = (var->sign == NUMERIC_NEG); neg = (var->sign == NUMERIC_NEG);
val = digits[0]; val = digits[0];
for (i = 1; i < ndigits; i++) for (i = 1; i <= weight; i++)
{ {
oldval = val; oldval = val;
val *= NBASE; val *= NBASE;
val += digits[i]; if (i < ndigits)
val += digits[i];
/* /*
* The overflow check is a bit tricky because we want to accept * The overflow check is a bit tricky because we want to accept
* INT64_MIN, which will overflow the positive accumulator. We * INT64_MIN, which will overflow the positive accumulator. We
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment