| 508 | } |
| 509 | |
| 510 | void gatherFromTimestampBufferIPC( |
| 511 | const BaseVector& vec, |
| 512 | const Selection& rows, |
| 513 | TimestampUnit unit, |
| 514 | Buffer& out) { |
| 515 | auto src = (*vec.values()).as<Timestamp>(); |
| 516 | auto dst = out.asMutable<int64_t>(); |
| 517 | vector_size_t j = 0; |
| 518 | |
| 519 | auto safeConv = [&](const Timestamp& ts, int64_t* outVal) -> bool { |
| 520 | const int64_t sec = ts.getSeconds(); |
| 521 | const int64_t nanos = ts.getNanos(); |
| 522 | |
| 523 | if (UNLIKELY(nanos < 0 || nanos >= 1000000000LL)) { |
| 524 | return false; |
| 525 | } |
| 526 | |
| 527 | __int128 v = 0; |
| 528 | switch (unit) { |
| 529 | case TimestampUnit::kSecond: |
| 530 | v = static_cast<__int128>(sec); |
| 531 | break; |
| 532 | case TimestampUnit::kMilli: |
| 533 | // sec * 1'000 + nanos / 1'000'000 |
| 534 | v = static_cast<__int128>(sec) * 1000 + nanos / 1000000; |
| 535 | break; |
| 536 | case TimestampUnit::kMicro: |
| 537 | // sec * 1'000'000 + nanos / 1'000 |
| 538 | v = static_cast<__int128>(sec) * 1000000 + nanos / 1000; |
| 539 | break; |
| 540 | case TimestampUnit::kNano: |
| 541 | // sec * 1'000'000'000 + nanos |
| 542 | v = static_cast<__int128>(sec) * 1000000000 + nanos; |
| 543 | break; |
| 544 | default: |
| 545 | BOLT_UNREACHABLE(); |
| 546 | } |
| 547 | |
| 548 | if (UNLIKELY( |
| 549 | v > std::numeric_limits<int64_t>::max() || |
| 550 | v < std::numeric_limits<int64_t>::min())) { |
| 551 | return false; |
| 552 | } |
| 553 | |
| 554 | *outVal = static_cast<int64_t>(v); |
| 555 | return true; |
| 556 | }; |
| 557 | |
| 558 | auto writeOrZero = [&](vector_size_t i) { |
| 559 | int64_t v; |
| 560 | if (LIKELY(safeConv(src[i], &v))) { |
| 561 | dst[j] = v; |
| 562 | } else { |
| 563 | dst[j] = 0; |
| 564 | } |
| 565 | ++j; |
| 566 | }; |
| 567 |
no test coverage detected