Skip to content

Commit 7b3e35d

Browse files
committed
feat: add literal cast to date
1 parent dc73627 commit 7b3e35d

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

src/iceberg/expression/literal.cc

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "iceberg/util/checked_cast.h"
2828
#include "iceberg/util/conversions.h"
2929
#include "iceberg/util/macros.h"
30+
#include "iceberg/util/temporal_util.h"
3031

3132
namespace iceberg {
3233

@@ -209,8 +210,10 @@ Result<Literal> LiteralCaster::CastFromTimestamp(
209210
auto timestamp_val = std::get<int64_t>(literal.value_);
210211

211212
switch (target_type->type_id()) {
212-
case TypeId::kDate:
213-
return NotImplemented("Cast from Timestamp to Date is not implemented yet");
213+
case TypeId::kDate: {
214+
ICEBERG_ASSIGN_OR_RAISE(auto days, TemporalUtils::ExtractDay(literal));
215+
return Literal::Date(std::get<int32_t>(days.value()));
216+
}
214217
case TypeId::kTimestampTz:
215218
return Literal::TimestampTz(timestamp_val);
216219
default:
@@ -224,8 +227,10 @@ Result<Literal> LiteralCaster::CastFromTimestampTz(
224227
auto micros = std::get<int64_t>(literal.value_);
225228

226229
switch (target_type->type_id()) {
227-
case TypeId::kDate:
228-
return NotImplemented("Cast from TimestampTz to Date is not implemented yet");
230+
case TypeId::kDate: {
231+
ICEBERG_ASSIGN_OR_RAISE(auto days, TemporalUtils::ExtractDay(literal));
232+
return Literal::Date(std::get<int32_t>(days.value()));
233+
}
229234
case TypeId::kTimestamp:
230235
return Literal::Timestamp(micros);
231236
default:

src/iceberg/test/literal_test.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,14 @@ INSTANTIATE_TEST_SUITE_P(
689689
.source_literal = Literal::Long(42L),
690690
.target_type = timestamp_tz(),
691691
.expected_literal = Literal::TimestampTz(42L)},
692+
CastLiteralTestParam{.test_name = "TimestampToDate",
693+
.source_literal = Literal::Timestamp(1622547800000000),
694+
.target_type = date(),
695+
.expected_literal = Literal::Date(18779)},
696+
CastLiteralTestParam{.test_name = "TimestampTzToDate",
697+
.source_literal = Literal::TimestampTz(1622547800000000),
698+
.target_type = date(),
699+
.expected_literal = Literal::Date(18779)},
692700
// Float cast tests
693701
CastLiteralTestParam{.test_name = "FloatToDouble",
694702
.source_literal = Literal::Float(2.0f),

0 commit comments

Comments
 (0)