On further reflection, we'd better do the same in int.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 12 Mar 2011 00:04:18 +0000 (19:04 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 12 Mar 2011 00:04:18 +0000 (19:04 -0500)
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

index 3970bda83d2c2c0600073dd07a867e6a1a469e12..47a0bd2a801796266dab91331c8aed4687c1c0a2 100644 (file)
@@ -778,9 +778,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
 
@@ -918,9 +922,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;
 
@@ -1012,10 +1020,16 @@ int24div(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();
+   }
+
    /* No overflow is possible */
+
    PG_RETURN_INT32((int32) arg1 / arg2);
 }
 
@@ -1096,9 +1110,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;
 
@@ -1121,9 +1139,14 @@ 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();
+   }
+
    /* No overflow is possible */
 
    PG_RETURN_INT32(arg1 % arg2);
@@ -1136,9 +1159,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);
@@ -1151,9 +1179,14 @@ int24mod(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();
+   }
+
    /* No overflow is possible */
 
    PG_RETURN_INT32(arg1 % arg2);
@@ -1166,9 +1199,14 @@ int42mod(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_INT32(arg1 % arg2);