Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Put in some more safeguards against executing a division-by-zero.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 11 Mar 2011 23:19:07 +0000 (18:19 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 11 Mar 2011 23:19:07 +0000 (18:19 -0500)
Add dummy returns before every potential division-by-zero in int8.c,
because apparently further "improvements" in gcc's optimizer have
enabled it to break functions that weren't broken before.

Aurelien Jarno, via Martin Pitt

src/backend/utils/adt/int8.c

index 3391769cd433fb1291be86192fc4994a1b8e5e04..88bf703df674bdbe8653996e7a44136ffe2b2c3e 100644 (file)
@@ -599,9 +599,13 @@ int8div(PG_FUNCTION_ARGS)
    int64       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;
 
@@ -645,9 +649,14 @@ int8mod(PG_FUNCTION_ARGS)
    int64       arg2 = PG_GETARG_INT64(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_INT64(arg1 % arg2);
@@ -821,9 +830,13 @@ int84div(PG_FUNCTION_ARGS)
    int64       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;
 
@@ -915,10 +928,16 @@ int48div(PG_FUNCTION_ARGS)
    int64       arg2 = PG_GETARG_INT64(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_INT64((int64) arg1 / arg2);
 }