Skip to content

Commit

Permalink
[CALCITE-6703] RelJson cannot handle timestamps prior to 1970-01-25 2…
Browse files Browse the repository at this point in the history
…0:31:23.648
  • Loading branch information
tanclary committed Nov 22, 2024
1 parent d4b7342 commit 1a6d87a
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -830,9 +830,15 @@ public RexNode toRex(RelOptCluster cluster, Object o) {
Sarg sarg = sargFromJson((Map) literal, type);
return rexBuilder.makeSearchArgumentLiteral(sarg, type);
}
if (type.getSqlTypeName() == SqlTypeName.SYMBOL) {
SqlTypeName sqlTypeName = type.getSqlTypeName();
if (sqlTypeName == SqlTypeName.SYMBOL) {
literal = RelEnumTypes.toEnum((String) literal);
}
if (sqlTypeName == SqlTypeName.TIMESTAMP || sqlTypeName == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE) {
if (literal instanceof Integer) {
literal = ((Integer) literal).longValue();
}
}
return rexBuilder.makeLiteral(literal, type);
}
if (map.containsKey("sargLiteral")) {
Expand Down
49 changes: 48 additions & 1 deletion core/src/test/java/org/apache/calcite/plan/RelWriterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -740,6 +740,53 @@ private static Fixture relFn(Function<RelBuilder, RelNode> relFn) {
.assertThatPlan(isLinux(expected));
}

/** Test case for
* <a href="https://issues.apache.org/jira/browse/CALCITE-6703">[CALCITE-6703]
* RelJson cannot handle timestamps prior to 1970-01-25 20:31:23.648</a>. */
@Test void testJsonToRexForTimestamp() {
final String timestampRepresentedAsInt = "{\n"
+ " \"literal\": 2129400000,\n"
+ " \"type\": {\n"
+ " \"type\": \"TIMESTAMP\",\n"
+ " \"nullable\": false\n"
+ " }\n"
+ "}\n";
final String timestampRepresentedAsLong = "{\n"
+ " \"literal\": 3129400000,\n"
+ " \"type\": {\n"
+ " \"type\": \"TIMESTAMP\",\n"
+ " \"nullable\": false\n"
+ " }\n"
+ "}\n";

assertThatReadExpressionResult(timestampRepresentedAsInt, is("1970-01-25 15:30:00"));
assertThatReadExpressionResult(timestampRepresentedAsLong, is("1970-02-06 05:16:40"));
}

/** Test case for
* <a href="https://issues.apache.org/jira/browse/CALCITE-6703">[CALCITE-6703]
* RelJson cannot handle timestamps prior to 1970-01-25 20:31:23.648</a>. */
@Test void testJsonToRexForTimestampWithLocalTimeZone() {
final String timestampWithLocalTzRepresentedAsInt = "{\n"
+ " \"literal\": 2129400000,\n"
+ " \"type\": {\n"
+ " \"type\": \"TIMESTAMP_WITH_LOCAL_TIME_ZONE\",\n"
+ " \"nullable\": false\n"
+ " }\n"
+ "}\n";
final String timestampWithLocalTzRepresentedAsLong = "{\n"
+ " \"literal\": 3129400000,\n"
+ " \"type\": {\n"
+ " \"type\": \"TIMESTAMP_WITH_LOCAL_TIME_ZONE\",\n"
+ " \"nullable\": false\n"
+ " }\n"
+ "}\n";

assertThatReadExpressionResult(timestampWithLocalTzRepresentedAsInt, is("1970-01-25 15:30:00:TIMESTAMP_WITH_LOCAL_TIME_ZONE(0)"));
assertThatReadExpressionResult(timestampWithLocalTzRepresentedAsLong, is("1970-02-06 05:16:40:TIMESTAMP_WITH_LOCAL_TIME_ZONE(0)"));
}


@Test void testJsonToRex() {
// Test simple literal without inputs
final String jsonString1 = "{\n"
Expand Down Expand Up @@ -908,7 +955,7 @@ private static RexNode translateInput(RelJson relJson, int input,
// Test Calcite DateString class works in a Range
final DateString d1 =
DateString.fromCalendarFields(
new TimestampString(1970, 2, 1, 1, 1, 0).toCalendar());
new TimestampString(1970, 1, 1, 1, 1, 0).toCalendar());
final DateString d2 = DateString.fromDaysSinceEpoch(100);
final DateString d3 = DateString.fromDaysSinceEpoch(1000);
RexNode dateNode =
Expand Down

0 comments on commit 1a6d87a

Please sign in to comment.