From: Bruce Momjian Date: Mon, 12 Jun 2006 16:09:39 +0000 (+0000) Subject: Win32 can't catch the exception thrown by INT_MIN / -1 or INT_MIN * -1, X-Git-Tag: REL8_1_5~82 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f7a0b645f548180bd3a6ef194369500605573e0e;p=postgresql Win32 can't catch the exception thrown by INT_MIN / -1 or INT_MIN * -1, so on that platform we test for those before the computation and throw an "out of range" error. Backpatch to 8.1.X. --- diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c index bbfa53b3f9..0c3ab63c70 100644 --- a/src/backend/utils/adt/int.c +++ b/src/backend/utils/adt/int.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/int.c,v 1.68.2.1 2006/03/02 21:13:11 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/int.c,v 1.68.2.2 2006/06/12 16:09:39 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -742,6 +742,17 @@ int4mul(PG_FUNCTION_ARGS) int32 arg2 = PG_GETARG_INT32(1); int32 result; +#ifdef WIN32 + /* + * Win32 doesn't throw a catchable exception for + * SELECT -2147483648 /* INT_MIN */ * (-1); + */ + if (arg2 == -1 && arg1 == INT_MIN) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("integer out of range"))); +#endif + result = arg1 * arg2; /* @@ -777,6 +788,17 @@ int4div(PG_FUNCTION_ARGS) (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); +#ifdef WIN32 + /* + * Win32 doesn't throw a catchable exception for + * SELECT -2147483648 /* INT_MIN */ / (-1); + */ + if (arg2 == -1 && arg1 == INT_MIN) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("integer out of range"))); +#endif + result = arg1 / arg2; /*