@@ -150,6 +150,10 @@ Result<Literal> LiteralCaster::CastFromLong(
150150 return Literal::Timestamp (long_val);
151151 case TypeId::kTimestampTz :
152152 return Literal::TimestampTz (long_val);
153+ case TypeId::kTimestampNs :
154+ return Literal::TimestampNs (long_val);
155+ case TypeId::kTimestampTzNs :
156+ return Literal::TimestampTzNs (long_val);
153157 default :
154158 return NotSupported (" Cast from Long to {} is not supported" ,
155159 target_type->ToString ());
@@ -215,6 +219,15 @@ Result<Literal> LiteralCaster::CastFromString(
215219 TransformUtil::ParseTimestampWithZone (str_val));
216220 return Literal::TimestampTz (micros);
217221 }
222+ case TypeId::kTimestampNs : {
223+ ICEBERG_ASSIGN_OR_RAISE (auto nanos, TransformUtil::ParseTimestampNs (str_val));
224+ return Literal::TimestampNs (nanos);
225+ }
226+ case TypeId::kTimestampTzNs : {
227+ ICEBERG_ASSIGN_OR_RAISE (auto nanos,
228+ TransformUtil::ParseTimestampNsWithZone (str_val));
229+ return Literal::TimestampTzNs (nanos);
230+ }
218231 case TypeId::kBinary : {
219232 ICEBERG_ASSIGN_OR_RAISE (auto bytes, StringUtils::HexStringToBytes (str_val));
220233 return Literal::Binary (std::move (bytes));
@@ -250,14 +263,27 @@ Result<Literal> LiteralCaster::CastFromString(
250263Result<Literal> LiteralCaster::CastFromTimestamp (
251264 const Literal& literal, const std::shared_ptr<PrimitiveType>& target_type) {
252265 auto timestamp_val = std::get<int64_t >(literal.value_ );
266+ const auto & source_timestamp =
267+ internal::checked_cast<const TimestampBase&>(*literal.type ());
268+ const bool source_is_nanos = source_timestamp.time_unit () == TimeUnit::kNanosecond ;
253269
254270 switch (target_type->type_id ()) {
255271 case TypeId::kDate : {
256272 ICEBERG_ASSIGN_OR_RAISE (auto days, TemporalUtils::ExtractDay (literal));
257273 return Literal::Date (std::get<int32_t >(days.value ()));
258274 }
275+ case TypeId::kTimestamp :
276+ return source_is_nanos ? Literal::Timestamp (timestamp_val / 1000 )
277+ : Literal::Timestamp (timestamp_val);
259278 case TypeId::kTimestampTz :
260- return Literal::TimestampTz (timestamp_val);
279+ return source_is_nanos ? Literal::TimestampTz (timestamp_val / 1000 )
280+ : Literal::TimestampTz (timestamp_val);
281+ case TypeId::kTimestampNs :
282+ return source_is_nanos ? Literal::TimestampNs (timestamp_val)
283+ : Literal::TimestampNs (timestamp_val * 1000 );
284+ case TypeId::kTimestampTzNs :
285+ return source_is_nanos ? Literal::TimestampTzNs (timestamp_val)
286+ : Literal::TimestampTzNs (timestamp_val * 1000 );
261287 default :
262288 return NotSupported (" Cast from Timestamp to {} is not supported" ,
263289 target_type->ToString ());
@@ -266,15 +292,28 @@ Result<Literal> LiteralCaster::CastFromTimestamp(
266292
267293Result<Literal> LiteralCaster::CastFromTimestampTz (
268294 const Literal& literal, const std::shared_ptr<PrimitiveType>& target_type) {
269- auto micros = std::get<int64_t >(literal.value_ );
295+ auto timestamp_val = std::get<int64_t >(literal.value_ );
296+ const auto & source_timestamp =
297+ internal::checked_cast<const TimestampBase&>(*literal.type ());
298+ const bool source_is_nanos = source_timestamp.time_unit () == TimeUnit::kNanosecond ;
270299
271300 switch (target_type->type_id ()) {
272301 case TypeId::kDate : {
273302 ICEBERG_ASSIGN_OR_RAISE (auto days, TemporalUtils::ExtractDay (literal));
274303 return Literal::Date (std::get<int32_t >(days.value ()));
275304 }
305+ case TypeId::kTimestampTz :
306+ return source_is_nanos ? Literal::TimestampTz (timestamp_val / 1000 )
307+ : Literal::TimestampTz (timestamp_val);
276308 case TypeId::kTimestamp :
277- return Literal::Timestamp (micros);
309+ return source_is_nanos ? Literal::Timestamp (timestamp_val / 1000 )
310+ : Literal::Timestamp (timestamp_val);
311+ case TypeId::kTimestampNs :
312+ return source_is_nanos ? Literal::TimestampNs (timestamp_val)
313+ : Literal::TimestampNs (timestamp_val * 1000 );
314+ case TypeId::kTimestampTzNs :
315+ return source_is_nanos ? Literal::TimestampTzNs (timestamp_val)
316+ : Literal::TimestampTzNs (timestamp_val * 1000 );
278317 default :
279318 return NotSupported (" Cast from TimestampTz to {} is not supported" ,
280319 target_type->ToString ());
@@ -329,6 +368,12 @@ Literal Literal::Timestamp(int64_t value) { return {Value{value}, timestamp()};
329368
330369Literal Literal::TimestampTz (int64_t value) { return {Value{value}, timestamp_tz ()}; }
331370
371+ Literal Literal::TimestampNs (int64_t value) { return {Value{value}, timestamp_ns ()}; }
372+
373+ Literal Literal::TimestampTzNs (int64_t value) {
374+ return {Value{value}, timestamp_tz_ns ()};
375+ }
376+
332377Literal Literal::Float (float value) { return {Value{value}, float32 ()}; }
333378
334379Literal Literal::Double (double value) { return {Value{value}, float64 ()}; }
@@ -395,8 +440,11 @@ bool Comparable(TypeId lhs, TypeId rhs) {
395440 case TypeId::kLong :
396441 case TypeId::kTimestamp :
397442 case TypeId::kTimestampTz :
443+ case TypeId::kTimestampNs :
444+ case TypeId::kTimestampTzNs :
398445 return rhs == TypeId::kLong || rhs == TypeId::kTimestamp ||
399- rhs == TypeId::kTimestampTz ;
446+ rhs == TypeId::kTimestampTz || rhs == TypeId::kTimestampNs ||
447+ rhs == TypeId::kTimestampTzNs ;
400448 default :
401449 return lhs == rhs;
402450 }
@@ -439,7 +487,9 @@ std::partial_ordering Literal::operator<=>(const Literal& other) const {
439487 case TypeId::kLong :
440488 case TypeId::kTime :
441489 case TypeId::kTimestamp :
442- case TypeId::kTimestampTz : {
490+ case TypeId::kTimestampTz :
491+ case TypeId::kTimestampNs :
492+ case TypeId::kTimestampTzNs : {
443493 auto this_val = std::get<int64_t >(value_);
444494 auto other_val = std::get<int64_t >(other.value_ );
445495 return this_val <=> other_val;
@@ -548,7 +598,9 @@ std::string Literal::ToString() const {
548598 }
549599 case TypeId::kTime :
550600 case TypeId::kTimestamp :
551- case TypeId::kTimestampTz : {
601+ case TypeId::kTimestampTz :
602+ case TypeId::kTimestampNs :
603+ case TypeId::kTimestampTzNs : {
552604 return std::to_string (std::get<int64_t >(value_));
553605 }
554606 case TypeId::kDate : {
@@ -613,6 +665,10 @@ Result<Literal> LiteralCaster::CastTo(const Literal& literal,
613665 return CastFromTimestamp (literal, target_type);
614666 case TypeId::kTimestampTz :
615667 return CastFromTimestampTz (literal, target_type);
668+ case TypeId::kTimestampNs :
669+ return CastFromTimestamp (literal, target_type);
670+ case TypeId::kTimestampTzNs :
671+ return CastFromTimestampTz (literal, target_type);
616672 default :
617673 break ;
618674 }
0 commit comments