Skip to content

Commit 3fd8a49

Browse files
authored
fix: YearTransform passes wrong TransformType kTruncate instead of kYear (#715)
## Summary **Bug:** YearTransform constructor passed TransformType::kTruncate to the TransformFunction base class instead of TransformType::kYear. This caused transform_type() to return kTruncate on a bound YearTransform, affecting code paths that dispatch based on transform_type() (e.g., Transform::Project, Transform::ProjectStrict, Transform::SatisfiesOrderOf). **Fix:** Changed kTruncate to kYear in the YearTransform constructor. **Tests:** Added TransformFunctionTest cases for Year, Month, Day, Hour, and Void transforms to verify transform_type() after Bind(). The existing suite only tested Identity, Bucket, and Truncate.
1 parent 30c3120 commit 3fd8a49

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

‎src/iceberg/test/transform_test.cc‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,56 @@ TEST(TransformFunctionTest, CreateTruncateTransform) {
7171
EXPECT_EQ(transformPtr.value()->transform_type(), TransformType::kTruncate);
7272
}
7373

74+
TEST(TransformFunctionTest, CreateYearTransform) {
75+
auto transform = Transform::Year();
76+
EXPECT_EQ("year", transform->ToString());
77+
EXPECT_EQ("year", std::format("{}", *transform));
78+
79+
auto transformPtr = transform->Bind(iceberg::timestamp());
80+
ASSERT_TRUE(transformPtr);
81+
EXPECT_EQ(transformPtr.value()->transform_type(), TransformType::kYear);
82+
}
83+
84+
TEST(TransformFunctionTest, CreateMonthTransform) {
85+
auto transform = Transform::Month();
86+
EXPECT_EQ("month", transform->ToString());
87+
EXPECT_EQ("month", std::format("{}", *transform));
88+
89+
auto transformPtr = transform->Bind(iceberg::timestamp());
90+
ASSERT_TRUE(transformPtr);
91+
EXPECT_EQ(transformPtr.value()->transform_type(), TransformType::kMonth);
92+
}
93+
94+
TEST(TransformFunctionTest, CreateDayTransform) {
95+
auto transform = Transform::Day();
96+
EXPECT_EQ("day", transform->ToString());
97+
EXPECT_EQ("day", std::format("{}", *transform));
98+
99+
auto transformPtr = transform->Bind(iceberg::timestamp_tz());
100+
ASSERT_TRUE(transformPtr);
101+
EXPECT_EQ(transformPtr.value()->transform_type(), TransformType::kDay);
102+
}
103+
104+
TEST(TransformFunctionTest, CreateHourTransform) {
105+
auto transform = Transform::Hour();
106+
EXPECT_EQ("hour", transform->ToString());
107+
EXPECT_EQ("hour", std::format("{}", *transform));
108+
109+
auto transformPtr = transform->Bind(iceberg::timestamp());
110+
ASSERT_TRUE(transformPtr);
111+
EXPECT_EQ(transformPtr.value()->transform_type(), TransformType::kHour);
112+
}
113+
114+
TEST(TransformFunctionTest, CreateVoidTransform) {
115+
auto transform = Transform::Void();
116+
EXPECT_EQ("void", transform->ToString());
117+
EXPECT_EQ("void", std::format("{}", *transform));
118+
119+
auto transformPtr = transform->Bind(iceberg::int32());
120+
ASSERT_TRUE(transformPtr);
121+
EXPECT_EQ(transformPtr.value()->transform_type(), TransformType::kVoid);
122+
}
123+
74124
TEST(TransformFromStringTest, PositiveCases) {
75125
struct Case {
76126
std::string str;

‎src/iceberg/transform_function.cc‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ Result<std::unique_ptr<TransformFunction>> TruncateTransform::Make(
131131
}
132132

133133
YearTransform::YearTransform(std::shared_ptr<Type> const& source_type)
134-
: TransformFunction(TransformType::kTruncate, source_type) {}
134+
: TransformFunction(TransformType::kYear, source_type) {}
135135

136136
Result<Literal> YearTransform::Transform(const Literal& literal) {
137137
ICEBERG_DCHECK(*literal.type() == *source_type(),

0 commit comments

Comments
 (0)