From: Bruce Momjian Date: Mon, 12 Jun 2006 16:09:11 +0000 (+0000) Subject: Win32 can't catch the exception thrown by INT_MIN / -1 or INT_MIN * -1, X-Git-Tag: REL9_0_0~7761 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=9fc6f4e1ae107f44807c4906105e1f7eb052ecb1;p=pg-rex%2Fsyncrep.git 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 de59276ecb..6289c538a3 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.72 2006/03/11 01:19:22 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/int.c,v 1.73 2006/06/12 16:09:11 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -735,6 +735,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; /* @@ -770,6 +781,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; /*