Skip to content

Commit b240edb

Browse files
author
Leo Yan
committed
fix: snowflake query string builder should follow timezone information from Arrow.
1 parent b38fdec commit b240edb

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

athena-snowflake/src/main/java/com/amazonaws/athena/connectors/snowflake/SnowflakeQueryStringBuilder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,11 @@ else if (value instanceof Number) {
288288
long millis = ((Number) value).longValue();
289289
Timestamp timestamp = new Timestamp(millis);
290290
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
291+
String timezone = ((ArrowType.Timestamp) arrowType).getTimezone();
292+
if (timezone == null || timezone.isEmpty()) {
293+
timezone = "UTC";
294+
}
295+
sdf.setTimeZone(java.util.TimeZone.getTimeZone(timezone));
291296
return sdf.format(timestamp);
292297
case Time:
293298
case Interval:

athena-snowflake/src/test/java/com/amazonaws/athena/connectors/snowflake/SnowflakeQueryStringBuilderTest.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,29 @@ void testGetObjectForWhereClause_Date() {
129129
}
130130

131131
@Test
132-
void testGetObjectForWhereClause_Timestamp() {
132+
void testGetObjectForWhereClause_TimestampWithNullZone() {
133+
Object result = queryBuilder.getObjectForWhereClause("created_at", 1711929600000L, new ArrowType.Timestamp(TimeUnit.MILLISECOND, null));
134+
assertEquals("2024-04-01 00:00:00", result);
135+
}
136+
137+
@Test
138+
void testGetObjectForWhereClause_TimestampWithUtcZone() {
133139
Object result = queryBuilder.getObjectForWhereClause("created_at", 1711929600000L, new ArrowType.Timestamp(TimeUnit.MILLISECOND, "UTC"));
134140
assertEquals("2024-04-01 00:00:00", result);
135141
}
136142

143+
@Test
144+
void testGetObjectForWhereClause_TimestampWithLocalZone() {
145+
Object result = queryBuilder.getObjectForWhereClause("created_at", 1711929600000L, new ArrowType.Timestamp(TimeUnit.MILLISECOND, "PST"));
146+
assertEquals("2024-03-31 17:00:00", result);
147+
148+
Object result1 = queryBuilder.getObjectForWhereClause("created_at", 1711929600000L, new ArrowType.Timestamp(TimeUnit.MILLISECOND, "America/Los_Angeles"));
149+
assertEquals("2024-03-31 17:00:00", result1);
150+
151+
Object result2 = queryBuilder.getObjectForWhereClause("created_at", 1711929600000L, new ArrowType.Timestamp(TimeUnit.MILLISECOND, "GMT-8:00"));
152+
assertEquals("2024-03-31 16:00:00", result2);
153+
}
154+
137155
@Test
138156
void testToPredicateWithUnsupportedType() {
139157
assertThrows(UnsupportedOperationException.class, () ->

0 commit comments

Comments
 (0)