]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
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);