Hi hackers,
I detected two problems about ECPG.
I show my opinion. Please comment.
If it's correct, I will prepare a patch.
Thank you.
1.
It is indefinite what PGTYPEStimestamp_from_asc() returns in error.
The following is written in document(36.6.8. Special Constants of pgtypeslib):
A value of type timestamp representing an invalid time stamp.
This is returned by the function PGTYPEStimestamp_from_asc on parse error.
Note that due to the internal representation of the timestamp data type,
PGTYPESInvalidTimestamp is also a valid timestamp at the same time.
It is set to 1899-12-31 23:59:59. In order to detect errors,
make sure that your application does not only test for PGTYPESInvalidTimestamp
but also for errno != 0 after each call to PGTYPEStimestamp_from_asc.
However, PGTYPESInvalidTimestamp is not defined anywhere.
It no loger exists at REL6_2 that is the oldest branch.
At current implementation, PGTYPEStimestamp_from_asc returns -1.
So we must fix the document so that users write as follows:
r = PGTYPEStimestamp_from_asc(.....);
if (r < 0 || errno != 0)
goto error;
2.
Regression test of pgtypelib is not robust (maybe incorrect).
Our test failed although there is no bug actually.
I think block2 and block3 should be swapped.
---[src/interfaces/ecpg/test/pgtypeslib/dt_test.pgc]---
// block1 (my comment)
ts1 = PGTYPEStimestamp_from_asc("96-02-29", NULL);
text = PGTYPEStimestamp_to_asc(ts1);
printf("timestamp_to_asc1: %s\n", text);
PGTYPESchar_free(text);
// block2
ts1 = PGTYPEStimestamp_from_asc("1994-02-11 26:10:35", NULL);
text = PGTYPEStimestamp_to_asc(ts1);
printf("timestamp_to_asc3: %s\n", text);
PGTYPESchar_free(text);
// The following comment is for block1 clearly.
/* abc-03:10:35-def-02/11/94-gh */
/* 12345678901234567890123456789 */
// block3
// Maybe the following is for 'ts1' returned in block1.
// In our environment, 'out' is indefinite because PGTYPEStimestamp_fmt_asc()
// didn't complete and the area is not initialized.
out = (char*) malloc(32);
i = PGTYPEStimestamp_fmt_asc(&ts1, out, 31, "abc-%X-def-%x-ghi%%");
printf("timestamp_fmt_asc: %d: %s\n", i, out);
free(out);
------------------------------------
Best Regards
Ryo Matsumura
Best Regards
Ryo Matsumura