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 <t...@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>. */