diff options
author | Bruce Momjian <bruce@momjian.us> | 2006-06-12 16:09:39 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2006-06-12 16:09:39 +0000 |
commit | f7a0b645f548180bd3a6ef194369500605573e0e (patch) | |
tree | cd27dc1301e6786d5438ebd751f78f1c9c636209 /src/backend/utils/adt/int.c | |
parent | b45f5bb7265a624a59f710fbabcd252ad2594b30 (diff) |
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.
Diffstat (limited to 'src/backend/utils/adt/int.c')
-rw-r--r-- | src/backend/utils/adt/int.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c index bbfa53b3f95..0c3ab63c702 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; /* |