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.
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;