Skip to content

Commit df6c554

Browse files
committed
fix: TruncateInteger should consider Literal type
1 parent 518b850 commit df6c554

File tree

1 file changed

+38
-15
lines changed

1 file changed

+38
-15
lines changed

src/iceberg/util/projection_util_internal.h

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,29 @@ class ProjectionUtil {
8787
std::string_view name, const std::shared_ptr<BoundLiteralPredicate>& predicate,
8888
const std::shared_ptr<TransformFunction>& func) {
8989
const Literal& literal = predicate->literal();
90-
bool is_source_date_type = func->source_type()->type_id() == TypeId::kDate;
9190

9291
switch (predicate->op()) {
9392
case Expression::Operation::kLt: {
9493
// adjust closed and then transform ltEq
95-
ICEBERG_ASSIGN_OR_RAISE(
96-
auto transformed,
97-
func->Transform(is_source_date_type
98-
? Literal::Date(std::get<T>(literal.value()) - 1)
99-
: Literal::Int(std::get<T>(literal.value()) - 1)));
100-
return Expressions::Predicate(Expression::Operation::kLtEq, std::string(name),
101-
transformed);
94+
if constexpr (std::is_same_v<T, int32_t>) {
95+
ICEBERG_ASSIGN_OR_RAISE(
96+
auto transformed,
97+
func->Transform(literal.type()->type_id() == TypeId::kDate
98+
? Literal::Date(std::get<T>(literal.value()) - 1)
99+
: Literal::Int(std::get<T>(literal.value()) - 1)));
100+
return Expressions::Predicate(Expression::Operation::kLtEq, std::string(name),
101+
transformed);
102+
} else {
103+
ICEBERG_ASSIGN_OR_RAISE(
104+
auto transformed,
105+
func->Transform(
106+
literal.type()->type_id() == TypeId::kTimestamp ||
107+
literal.type()->type_id() == TypeId::kTimestampTz
108+
? Literal::Timestamp(std::get<int64_t>(literal.value()) - 1)
109+
: Literal::Long(std::get<int64_t>(literal.value()) - 1)));
110+
return Expressions::Predicate(Expression::Operation::kLtEq, std::string(name),
111+
transformed);
112+
}
102113
}
103114
case Expression::Operation::kLtEq: {
104115
ICEBERG_ASSIGN_OR_RAISE(auto transformed, func->Transform(literal));
@@ -107,13 +118,25 @@ class ProjectionUtil {
107118
}
108119
case Expression::Operation::kGt: {
109120
// adjust closed and then transform gtEq
110-
ICEBERG_ASSIGN_OR_RAISE(
111-
auto transformed,
112-
func->Transform(is_source_date_type
113-
? Literal::Date(std::get<T>(literal.value()) + 1)
114-
: Literal::Int(std::get<T>(literal.value()) + 1)));
115-
return Expressions::Predicate(Expression::Operation::kGtEq, std::string(name),
116-
transformed);
121+
if constexpr (std::is_same_v<T, int32_t>) {
122+
ICEBERG_ASSIGN_OR_RAISE(
123+
auto transformed,
124+
func->Transform(literal.type()->type_id() == TypeId::kDate
125+
? Literal::Date(std::get<T>(literal.value()) + 1)
126+
: Literal::Int(std::get<T>(literal.value()) + 1)));
127+
return Expressions::Predicate(Expression::Operation::kGtEq, std::string(name),
128+
transformed);
129+
} else {
130+
ICEBERG_ASSIGN_OR_RAISE(
131+
auto transformed,
132+
func->Transform(
133+
literal.type()->type_id() == TypeId::kTimestamp ||
134+
literal.type()->type_id() == TypeId::kTimestampTz
135+
? Literal::Timestamp(std::get<int64_t>(literal.value()) + 1)
136+
: Literal::Long(std::get<int64_t>(literal.value()) + 1)));
137+
return Expressions::Predicate(Expression::Operation::kGtEq, std::string(name),
138+
transformed);
139+
}
117140
}
118141
case Expression::Operation::kGtEq: {
119142
ICEBERG_ASSIGN_OR_RAISE(auto transformed, func->Transform(literal));

0 commit comments

Comments
 (0)