From 9fc6f4e1ae107f44807c4906105e1f7eb052ecb1 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 12 Jun 2006 16:09:11 +0000 Subject: [PATCH] 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. --- src/backend/utils/adt/int.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) 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; /* -- 2.11.0