diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java index fa10035746c2..00c14f1c683b 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java @@ -114,10 +114,14 @@ static String quote(String s) { } private static boolean needsQuote(String s) { - for (int i = 0, n = s.length(); i < n; i++) { + if (!s.isEmpty() + && (!Character.isJavaIdentifierStart(s.charAt(0)) || s.charAt(0) == '$')) { + return true; + } + + for (int i = 1, n = s.length(); i < n; i++) { char c = s.charAt(i); - if (!Character.isJavaIdentifierPart(c) - || c == '$') { + if (!Character.isJavaIdentifierPart(c)) { return true; } } 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 61cf6672b53e..f65a5a96eefe 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 @@ -109,6 +109,7 @@ public static void setUp() throws Exception { doc.put("value", new BsonInt32(1231)); doc.put("ownerId", new BsonString("531e7789e4b0853ddb861313")); doc.put("arr", new BsonArray(Arrays.asList(new BsonString("a"), new BsonString("b")))); + doc.put("1_minute_aggregation", new BsonInt32(10)); datatypes.insertOne(doc); schema = new MongoSchema(database); @@ -605,18 +606,22 @@ private CalciteAssert.AssertThat assertModel(URL url) { "{$limit: 5}")); } - @Disabled("broken; [CALCITE-2115] is logged to fix it") @Test void testProject() { assertModel(MODEL) .query("select state, city, 0 as zero from zips order by state, city") .limit(2) - .returns("STATE=AK; CITY=AKHIOK; ZERO=0\n" - + "STATE=AK; CITY=AKIACHAK; ZERO=0\n") + .returns("STATE=AK; CITY=ANCHORAGE; ZERO=0\n" + + "STATE=AK; CITY=FAIRBANKS; ZERO=0\n") .queryContains( mongoChecker( - "{$project: {CITY: '$city', STATE: '$state'}}", - "{$sort: {STATE: 1, CITY: 1}}", - "{$project: {STATE: 1, CITY: 1, ZERO: {$literal: 0}}}")); + "{$project: {STATE: '$state', CITY: '$city', ZERO: {$literal: 0}}}", + "{$sort: {STATE: 1, CITY: 1}}")); + + assertModel(MODEL) + .query("select cast(_MAP['1_minute_aggregation'] as INT) as \"1_minute_aggregation\" " + + "from \"mongo_raw\".\"datatypes\"") + .queryContains( + mongoChecker("{$project: {'1_minute_aggregation': 1}}")); } @Test void testFilter() {