in src/afs.cc [975:1001]
arrow::Status Visit(const arrow::TimestampArray& array)
{
const auto unit =
std::static_pointer_cast<arrow::TimestampType>(array.type())->unit();
Timestamp value = 0;
switch (unit)
{
case arrow::TimeUnit::SECOND:
value += array.Value(i_row_) * 1000000;
break;
case arrow::TimeUnit::MILLI:
value += array.Value(i_row_) * 1000;
break;
case arrow::TimeUnit::MICRO:
value += array.Value(i_row_);
break;
case arrow::TimeUnit::NANO:
value += array.Value(i_row_) / 1000;
break;
default:
return arrow::Status::NotImplemented("Unsupported time unit: ", unit);
}
// Arrow uses UNIX epoch (1970-01-01) but PostgreSQL uses 2000-01-01.
value -= (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * USECS_PER_DAY;
datum_ = TimestampGetDatum(value);
return arrow::Status::OK();
}