Date:

Wed Aug 16 21:08:46 PDT 1995

Description

The datetimes implementation uses a non-portable way of passing arguments. In particular, this breaks on Sparc machines.

Thanks to Ginger Latta for discovering the problem.

Fix

Apply this patch.

===================================================================
RCS file: /usr/local/devel/pglite/cvs/src/backend/utils/adt/datetimes.c,v
retrieving revision 1.1
diff -c -r1.1 datetimes.c
*** 1.1	1995/06/23 03:20:57
--- src/backend/utils/adt/datetimes.c	1995/07/27 00:04:19
***************
*** 17,22 ****
--- 17,24 ----
  #include "utils/palloc.h"
  #include "utils/elog.h"
  
+ /* these things look like structs, but we pass them by value so be careful
+    For example, passing an int -> DateADT is not portable! */
  typedef struct DateADT {
      char	day;
      char	month;
***************
*** 76,91 ****
  }
  
  char *
! date_out(DateADT date)
  {
      char *datestr = palloc(11);
!     
  #ifdef AMERICAN_STYLE
      sprintf(datestr, "%02d-%02d-%04d",
! 	    (int)date.month, (int)date.day, (int)date.year);
  #else
      sprintf(datestr, "%02d-%02d-%04d",
! 	    (int)date.day, (int)date.month, (int)date.year);
  #endif
  
      return datestr;
--- 78,100 ----
  }
  
  char *
! date_out(int4 dateVal)
  {
      char *datestr = palloc(11);
!     int4 dateStore;
!     DateADT *date;
! 
!        /* DateADT is a structure that happens to be four bytes long,
!           trust me on this.... */
!     date = (DateADT*)&dateStore;
!     dateStore = dateVal;
! 
  #ifdef AMERICAN_STYLE
      sprintf(datestr, "%02d-%02d-%04d",
!             (int)date->month, (int)date->day, (int)date->year);
  #else
      sprintf(datestr, "%02d-%02d-%04d",
!             (int)date->day, (int)date->month, (int)date->year);
  #endif
  
      return datestr;
***************
*** 93,160 ****
  
  
  int
! date_eq(DateADT date1, DateADT date2)
  {
!     return (date1.day==date2.day && date1.month==date2.month &&
! 	    date1.year==date2.year);
  }
  
  int
! date_ne(DateADT date1, DateADT date2)
  {
!     return (date1.day!=date2.day || date1.month!=date2.month ||
! 	    date1.year!=date2.year);
  }
  
  int
! date_lt(DateADT date1, DateADT date2)
  {
!     if (date1.year!=date2.year)
! 	return (date1.yeardate2.year);
!     if (date1.month!=date2.month)
! 	return (date1.month>date2.month);
!     return (date1.day>date2.day);
  }
  
  int
! date_ge(DateADT date1, DateADT date2)
  {
!     if (date1.year!=date2.year)
! 	return (date1.year>=date2.year);
!     if (date1.month!=date2.month)
! 	return (date1.month>=date2.month);
!     return (date1.day>=date2.day);
  }
  
  int
! date_cmp(DateADT date1, DateADT date2)
  {
!     if (date1.year!=date2.year)
! 	return ((date1.yearday==date2->day && 
! 	    date1->month==date2->month &&
! 	    date1->year==date2->year);
  }
  
  int
! date_ne(int4 dateVal1, int4 dateVal2)
  {
!     int4 dateStore1 = dateVal1;
!     int4 dateStore2 = dateVal2;
!     DateADT *date1, *date2;
!     
!     date1 = (DateADT*)&dateStore1;
!     date2 = (DateADT*)&dateStore2;
! 
!     return (date1->day!=date2->day || date1->month!=date2->month ||
! 	    date1->year!=date2->year);
  }
  
  int
! date_lt(int4 dateVal1, int4 dateVal2)
  {
!     int4 dateStore1 = dateVal1;
!     int4 dateStore2 = dateVal2;
!     DateADT *date1, *date2;
!     
!     date1 = (DateADT*)&dateStore1;
!     date2 = (DateADT*)&dateStore2;
! 
!     if (date1->year!=date2->year)
! 	return (date1->yearyear);
!     if (date1->month!=date2->month)
! 	return (date1->monthmonth);
!     return (date1->dayday);
  }
  
  int
! date_le(int4 dateVal1, int4 dateVal2)
  {
! 
!     int4 dateStore1 = dateVal1;
!     int4 dateStore2 = dateVal2;
!     DateADT *date1, *date2;
!     
!     date1 = (DateADT*)&dateStore1;
!     date2 = (DateADT*)&dateStore2;
! 
!     if (date1->year!=date2->year)
! 	return (date1->year<=date2->year);
!     if (date1->month!=date2->month)
! 	return (date1->month<=date2->month);
!     return (date1->day<=date2->day);
  }
  
  int
! date_gt(int4 dateVal1, int4 dateVal2)
  {
!     int4 dateStore1 = dateVal1;
!     int4 dateStore2 = dateVal2;
!     DateADT *date1, *date2;
!     
!     date1 = (DateADT*)&dateStore1;
!     date2 = (DateADT*)&dateStore2;
! 
! 
!     if (date1->year!=date2->year)
! 	return (date1->year>date2->year);
!     if (date1->month!=date2->month)
! 	return (date1->month>date2->month);
!     return (date1->day>date2->day);
  }
  
  int
! date_ge(int4 dateVal1, int4 dateVal2)
  {
!     int4 dateStore1 = dateVal1;
!     int4 dateStore2 = dateVal2;
!     DateADT *date1, *date2;
!     
!     date1 = (DateADT*)&dateStore1;
!     date2 = (DateADT*)&dateStore2;
! 
!     if (date1->year!=date2->year)
! 	return (date1->year>=date2->year);
!     if (date1->month!=date2->month)
! 	return (date1->month>=date2->month);
!     return (date1->day>=date2->day);
  }
  
  int
! date_cmp(int4 dateVal1, int4 dateVal2)
  {
!     int4 dateStore1 = dateVal1;
!     int4 dateStore2 = dateVal2;
!     DateADT *date1, *date2;
!     
!     date1 = (DateADT*)&dateStore1;
!     date2 = (DateADT*)&dateStore2;
! 
!     if (date1->year!=date2->year)
! 	return ((date1->yearyear) ? -1 : 1);
!     if (date1->month!=date2->month)
! 	return ((date1->monthmonth) ? -1 : 1);
!     if (date1->day!=date2->day)
! 	return ((date1->dayday) ? -1 : 1);
      return 0;
  }
  
***************
*** 193,199 ****
  {
      char *timestr = palloc(16);
      
!     sprintf(timestr, "%02d:%02d:%02.6f",
  	    (int)time->hr, (int)time->min, time->sec);
  
      return timestr;
--- 254,260 ----
  {
      char *timestr = palloc(16);
      
!     sprintf(timestr, "%02d:%02d:%09.6f",
  	    (int)time->hr, (int)time->min, time->sec);
  
      return timestr;