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");
+ }
}