1. Покажите функцию timestamp2tm. Это именно она не работает.
2. Покажите определение типа Timestamp.
Тогда кусок кода можно дописать:
/* rangecheck: see if timestamp_out would like it */
if (TIMESTAMP_NOT_FINITE(timestamp)){
/* ok */ ;
} else if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0){
char emsg[100];
snprintf(emsg,99,"timestamp out of range: %d %d %d %d %d %d", timestamp.year,timestamp.month,timestamp.day,timestamp.hour,timestamp.min,timestamp.sec);
ereport(ERROR,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
errmsg(emsg)));
}
Я это сделал в предположении, что Timestamp это структура с полями year, moth, day, hour, min, sec.
Добавлены фигурные скобочки (на всякий случай) и еще одна строковая переменная.
ОБН:
Хотя, 64 бита для такого набора это чересчур.
Можно написать несколько проще:
snprintf(emsg,99,"timestamp out of range: %lld", timestamp);
Но сомневаюсь, что это сильно поможет...
Хотя... Если даты представляются, как обычно в С, т.е. как количество секунд, прошедшее с 00оо 01-01-1970, то что-то достать можно.