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

dmsysolyatin 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 683e4ae242 [CALCITE-6026] MongoDB: Column is not quoted in "order by" 
clause and throws JsonParseException
683e4ae242 is described below

commit 683e4ae24238b2ea852d6e3d796571667c569b86
Author: Tim Nieradzik <[email protected]>
AuthorDate: Tue Sep 26 10:39:57 2023 +0300

    [CALCITE-6026] MongoDB: Column is not quoted in "order by" clause and 
throws JsonParseException
    
    The following query fails with a `JsonParseException`:
    
    ```sql
    select state as "STATE", avg(pop) as "AVG(pop)"
    from zips
    group by "STATE"
    order by "AVG(pop)"
    ```
    
    Stack trace:
    ```
    org.bson.json.JsonParseException: JSON reader was expecting ':' but found 
'('.
            at org.bson.json.JsonReader.readBsonType(JsonReader.java:150)
            at 
org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:85)
            at 
org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:42)
            at 
org.bson.codecs.BsonDocumentCodec.readValue(BsonDocumentCodec.java:104)
            at 
org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:87)
            at org.bson.BsonDocument.parse(BsonDocument.java:66)
            at 
org.apache.calcite.adapter.mongodb.MongoTable.aggregate(MongoTable.java:138)
            at 
org.apache.calcite.adapter.mongodb.MongoTable.access$200(MongoTable.java:53)
            at 
org.apache.calcite.adapter.mongodb.MongoTable$MongoQueryable.aggregate(MongoTable.java:189)
    ```
    
    This is caused by the column name in the `order by` clause not being 
escaped.
---
 .../java/org/apache/calcite/adapter/mongodb/MongoSort.java     |  2 +-
 .../org/apache/calcite/adapter/mongodb/MongoAdapterTest.java   | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git 
a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSort.java 
b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSort.java
index 0a4ade089f..fd79235c4a 100644
--- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSort.java
+++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSort.java
@@ -66,7 +66,7 @@ public class MongoSort extends Sort implements MongoRel {
       for (RelFieldCollation fieldCollation : collation.getFieldCollations()) {
         final String name =
             fields.get(fieldCollation.getFieldIndex()).getName();
-        keys.add(name + ": " + direction(fieldCollation));
+        keys.add(MongoRules.maybeQuote(name) + ": " + 
direction(fieldCollation));
         if (false) {
           // TODO: NULLS FIRST and NULLS LAST
           switch (fieldCollation.nullDirection) {
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 9ab0fcad4e..61cf6672b5 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
@@ -818,4 +818,14 @@ public class MongoAdapterTest implements SchemaFactory {
       }
     };
   }
+
+  @Test void testColumnQuoting() {
+    assertModel(MODEL)
+        .query("select state as \"STATE\", avg(pop) as \"AVG(pop)\" "
+            + "from zips "
+            + "group by \"STATE\" "
+            + "order by \"AVG(pop)\"")
+        .limit(2)
+        .returns("STATE=VT; AVG(pop)=26408\nSTATE=AK; AVG(pop)=26856\n");
+  }
 }

Reply via email to