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 9a43fe6
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 1 deletion.
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
55 changes: 55 additions & 0 deletions 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,61 @@ 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() {
// Below Integer.MAX_VALUE
final String timestampRepresentedAsInt = "{\n"
+ " \"literal\": 2129400000,\n"
+ " \"type\": {\n"
+ " \"type\": \"TIMESTAMP\",\n"
+ " \"nullable\": false\n"
+ " }\n"
+ "}\n";
// Above Integer.MAX_VALUE
final String timestampRepresentedAsLong = "{\n"
+ " \"literal\": 3129400000,\n"
+ " \"type\": {\n"
+ " \"type\": \"TIMESTAMP\",\n"
+ " \"nullable\": false\n"
+ " }\n"
+ "}\n";

// These timestamps were verified using BigQuery's UNIX_MILLIS function.
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() {
// Below Integer.MAX_VALUE
final String timestampWithLocalTzRepresentedAsInt = "{\n"
+ " \"literal\": 2129400000,\n"
+ " \"type\": {\n"
+ " \"type\": \"TIMESTAMP_WITH_LOCAL_TIME_ZONE\",\n"
+ " \"nullable\": false\n"
+ " }\n"
+ "}\n";
// Above Integer.MAX_VALUE
final String timestampWithLocalTzRepresentedAsLong = "{\n"
+ " \"literal\": 3129400000,\n"
+ " \"type\": {\n"
+ " \"type\": \"TIMESTAMP_WITH_LOCAL_TIME_ZONE\",\n"
+ " \"nullable\": false\n"
+ " }\n"
+ "}\n";

// These timestamps were verified using BigQuery's UNIX_MILLIS function.
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

0 comments on commit 9a43fe6

Please sign in to comment.