From f6b2ab7d95d718f67c0cde8e7638053d40c221e6 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 11 Mar 2011 19:04:05 -0500 Subject: [PATCH] On further reflection, we'd better do the same in int.c. We previously heard of the same problem in int24div(), so there's not a good reason to suppose the problem is confined to cases involving int8. --- src/backend/utils/adt/int.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c index ab8476b68a..609c3a7fc4 100644 --- a/src/backend/utils/adt/int.c +++ b/src/backend/utils/adt/int.c @@ -723,9 +723,13 @@ int4div(PG_FUNCTION_ARGS) int32 result; if (arg2 == 0) + { ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); + /* ensure compiler realizes we mustn't reach the division (gcc bug) */ + PG_RETURN_NULL(); + } #ifdef WIN32 @@ -864,9 +868,13 @@ int2div(PG_FUNCTION_ARGS) int16 result; if (arg2 == 0) + { ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); + /* ensure compiler realizes we mustn't reach the division (gcc bug) */ + PG_RETURN_NULL(); + } result = arg1 / arg2; @@ -1048,9 +1056,13 @@ int42div(PG_FUNCTION_ARGS) int32 result; if (arg2 == 0) + { ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); + /* ensure compiler realizes we mustn't reach the division (gcc bug) */ + PG_RETURN_NULL(); + } result = arg1 / arg2; @@ -1074,9 +1086,13 @@ int4mod(PG_FUNCTION_ARGS) int32 arg2 = PG_GETARG_INT32(1); if (arg2 == 0) + { ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); + /* ensure compiler realizes we mustn't reach the division (gcc bug) */ + PG_RETURN_NULL(); + } /* SELECT ((-2147483648)::int4) % (-1); causes a floating point exception */ if (arg1 == INT_MIN && arg2 == -1) @@ -1094,9 +1110,14 @@ int2mod(PG_FUNCTION_ARGS) int16 arg2 = PG_GETARG_INT16(1); if (arg2 == 0) + { ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); + /* ensure compiler realizes we mustn't reach the division (gcc bug) */ + PG_RETURN_NULL(); + } + /* No overflow is possible */ PG_RETURN_INT16(arg1 % arg2); -- 2.11.0