You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2023/01/13 00:55:50 UTC

[calcite] branch main updated: [CALCITE-5405] MongoDB adapter does not parse dates correctly

This is an automated email from the ASF dual-hosted git repository.

jhyde pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new ad145397d9 [CALCITE-5405] MongoDB adapter does not parse dates correctly
ad145397d9 is described below

commit ad145397d91eea981a48d8f2002b3d36de5591ee
Author: Tim Nieradzik <ti...@sparse.tech>
AuthorDate: Tue Nov 29 16:29:04 2022 +0300

    [CALCITE-5405] MongoDB adapter does not parse dates correctly
    
    The following conversion does not work as expected:
    
    cast(_MAP['date'] as TIMESTAMP)
    
    The resulting date is always 1970-01-01 and only the fractional seconds are set.
---
 .../calcite/adapter/mongodb/MongoEnumerator.java   |  4 +++-
 .../calcite/adapter/mongodb/MongoAdapterTest.java  | 23 ++++++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java
index 0045044c34..0c3d327fa5 100644
--- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java
+++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java
@@ -129,7 +129,9 @@ class MongoEnumerator implements Enumerator<Object> {
     if (clazz.isInstance(o)) {
       return o;
     }
-    if (o instanceof Date && primitive != null) {
+    if (o instanceof Date && clazz == Long.class) {
+      o = ((Date) o).getTime();
+    } else if (o instanceof Date && primitive != null) {
       o = ((Date) o).getTime() / DateTimeUtils.MILLIS_PER_DAY;
     }
     if (o instanceof Number && primitive != null) {
diff --git a/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java b/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java
index 79d5e81d26..a9aa191fa6 100644
--- a/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java
+++ b/mongodb/src/test/java/org/apache/calcite/adapter/mongodb/MongoAdapterTest.java
@@ -708,6 +708,29 @@ public class MongoAdapterTest implements SchemaFactory {
         .returnsUnordered("EXPR$0=2012-09-05");
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-5405">[CALCITE-5405]
+   * Error casting MongoDB dates to TIMESTAMP</a>. */
+  @Test void testDateConversion() {
+    assertModel("{\n"
+        + "  version: '1.0',\n"
+        + "  defaultSchema: 'test',\n"
+        + "   schemas: [\n"
+        + "     {\n"
+        + "       type: 'custom',\n"
+        + "       name: 'test',\n"
+        + "       factory: 'org.apache.calcite.adapter.mongodb.MongoSchemaFactory',\n"
+        + "       operand: {\n"
+        + "         host: 'localhost',\n"
+        + "         database: 'test'\n"
+        + "       }\n"
+        + "     }\n"
+        + "   ]\n"
+        + "}")
+        .query("select cast(_MAP['date'] as TIMESTAMP) from \"datatypes\"")
+        .returnsUnordered("EXPR$0=2012-09-05 00:00:00");
+  }
+
   /** Test case for
    * <a href="https://issues.apache.org/jira/browse/CALCITE-665">[CALCITE-665]
    * ClassCastException in MongoDB adapter</a>. */