Thread: ecpg-timestamp- interval problem V8.2.x

ecpg-timestamp- interval problem V8.2.x

From
paul tilles
Date:
A colleague of mine is working with the following code (postgres Version
8.2.4):

#include <stdio.h>
#include <stdlib.h>
#include "pgtypes_timestamp.h"
#include "pgtypes_interval.h"

EXEC SQL INCLUDE sqlca;

main(argc, argv)
   int argc;
   char *argv[];
{
 timestamp dt1st, dt2nd;
 interval *int_day, *int_pt;

 char timebeg[40];
 char timeend[40];
 int rc;

 strcpy(timebeg,"2008-04-01");
 strcpy(timeend,"2008-04-05");

 printf("timebeg: %s\n", timebeg);
 printf("timeend: %s\n", timeend);

 dt1st=PGTYPEStimestamp_from_asc(timebeg,NULL);
 dt2nd=PGTYPEStimestamp_from_asc(timeend,NULL);
 int_day=PGTYPESinterval_from_asc("02 01:02:03", NULL);
 printf("int_day : %s\n", PGTYPESinterval_to_asc(int_day));

 rc=PGTYPEStimestamp_sub(&dt2nd, &dt1st, int_pt);
 printf("rc, date2 - date1 = %d, %s\n", rc, PGTYPESinterval_to_asc(int_pt));
 exit(0);
}

--------------------------------------------------------------------------------------------
The output is

timebeg: 2008-04-01
timeend: 2008-04-05
int_day : @ 2 days 1 hour 2 mins 3 secs
rc, date2 - date1 = 0, @ 1 sec ago

--------------------------------------------------------------------------------------------

The result of the subtraction of the the two timestamps is not correct.


What's going on?

TIA.

Paul Tilles

Re: ecpg-timestamp- interval problem V8.2.x

From
Tom Lane
Date:
paul tilles <Paul.Tilles@noaa.gov> writes:
> {
>  timestamp dt1st, dt2nd;
>  interval *int_day, *int_pt;

>  char timebeg[40];
>  char timeend[40];
>  int rc;

>  strcpy(timebeg,"2008-04-01");
>  strcpy(timeend,"2008-04-05");

>  printf("timebeg: %s\n", timebeg);
>  printf("timeend: %s\n", timeend);

>  dt1st=PGTYPEStimestamp_from_asc(timebeg,NULL);
>  dt2nd=PGTYPEStimestamp_from_asc(timeend,NULL);
>  int_day=PGTYPESinterval_from_asc("02 01:02:03", NULL);
>  printf("int_day : %s\n", PGTYPESinterval_to_asc(int_day));

>  rc=PGTYPEStimestamp_sub(&dt2nd, &dt1st, int_pt);
>  printf("rc, date2 - date1 = %d, %s\n", rc, PGTYPESinterval_to_asc(int_pt));
>  exit(0);
> }

Surely this code is using "int_pt" without having first assigned to it?
IOW the interval result is being stored at some unpredictable place that
could get clobbered during the printf.

            regards, tom lane