OSDN Git Service

Tweak interval_avg support to avoid coredump with Alpha/Tru64 compiler.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 21 Nov 2001 18:29:48 +0000 (18:29 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 21 Nov 2001 18:29:48 +0000 (18:29 +0000)
Per report from Bernd Tegge.

src/backend/utils/adt/timestamp.c

index 7bb5bca..490e7be 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.59 2001/10/25 05:49:45 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.60 2001/11/21 18:29:48 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1570,9 +1570,12 @@ interval_accum(PG_FUNCTION_ARGS)
         * buggy array code: it won't ensure proper alignment of Interval
         * objects on machines where double requires 8-byte alignment. That
         * should be fixed, but in the meantime...
+        *
+        * Note: must use DatumGetPointer here, not DatumGetIntervalP,
+        * else some compilers optimize into double-aligned load/store anyway.
         */
-       memcpy(&sumX, DatumGetIntervalP(transdatums[0]), sizeof(Interval));
-       memcpy(&N, DatumGetIntervalP(transdatums[1]), sizeof(Interval));
+       memcpy((void *) &sumX, DatumGetPointer(transdatums[0]), sizeof(Interval));
+       memcpy((void *) &N, DatumGetPointer(transdatums[1]), sizeof(Interval));
 
        newsum = DatumGetIntervalP(DirectFunctionCall2(interval_pl,
                                                                                                IntervalPGetDatum(&sumX),
@@ -1609,9 +1612,12 @@ interval_avg(PG_FUNCTION_ARGS)
         * buggy array code: it won't ensure proper alignment of Interval
         * objects on machines where double requires 8-byte alignment. That
         * should be fixed, but in the meantime...
+        *
+        * Note: must use DatumGetPointer here, not DatumGetIntervalP,
+        * else some compilers optimize into double-aligned load/store anyway.
         */
-       memcpy(&sumX, DatumGetIntervalP(transdatums[0]), sizeof(Interval));
-       memcpy(&N, DatumGetIntervalP(transdatums[1]), sizeof(Interval));
+       memcpy((void *) &sumX, DatumGetPointer(transdatums[0]), sizeof(Interval));
+       memcpy((void *) &N, DatumGetPointer(transdatums[1]), sizeof(Interval));
 
        /* SQL92 defines AVG of no values to be NULL */
        if (N.time == 0)