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

kenhuuu pushed a commit to branch stringify-params
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit eabfcbaf93c9a642ff83a434ac88e9608f8fb36b
Author: Ken Hu <[email protected]>
AuthorDate: Tue Apr 14 16:14:43 2026 -0700

    Fix null map key parsing in GenericLiteralVisitor
    
    The visitor treated all keyword map keys as their text representation,
    so a null key in [null:"value"] was parsed as the String "null" instead
    of Java null. This broke round-tripping maps with null keys through
    GremlinLang serialization and ANTLR parsing.
---
 .../tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java     | 3 ++-
 .../tinkerpop/gremlin/language/grammar/GeneralLiteralVisitorTest.java | 4 ++++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java
index e2f693554f..1ff0f790a9 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java
@@ -350,7 +350,8 @@ public class GenericLiteralVisitor extends 
DefaultGremlinBaseVisitor<Object> {
             } else if (kctx instanceof GremlinParser.GenericMapLiteralContext) 
{
                 key = 
visitGenericMapLiteral((GremlinParser.GenericMapLiteralContext) kctx);
             } else if (kctx instanceof GremlinParser.KeywordContext) {
-                key = ((GremlinParser.KeywordContext) kctx).getText();
+                final String keywordText = ((GremlinParser.KeywordContext) 
kctx).getText();
+                key = keywordText.equals("null") ? null : keywordText;
             } else if (kctx instanceof GremlinParser.NakedKeyContext) {
                 key = ((GremlinParser.NakedKeyContext) kctx).getText();
             } else if (kctx instanceof TerminalNode) {
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/GeneralLiteralVisitorTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/GeneralLiteralVisitorTest.java
index b0a61beea3..e21d9b7cea 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/GeneralLiteralVisitorTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/GeneralLiteralVisitorTest.java
@@ -632,6 +632,10 @@ public class GeneralLiteralVisitorTest {
                     {"[{'x'}: 'x']", createMap(new Object[]{new 
HashSet<>(Arrays.asList("x")), "x"})},
                     {"[['x']: ['x',{'y'}]]", createMap(new 
Object[]{Arrays.asList("x"), Arrays.asList("x", new 
HashSet<>(Arrays.asList("y")))})},
                     {"[['x']: ['x',['y']]]", createMap(new 
Object[]{Arrays.asList("x"), Arrays.asList("x", Arrays.asList("y"))})},
+                    {"[null:'x']", createMap(new Object[]{null, "x"})},
+                    {"[null:null]", createMap(new Object[]{null, null})},
+                    {"[null:'x','y':'z']", createMap(new Object[]{null, "x", 
"y", "z"})},
+                    {"['null':'x']", createMap(new Object[]{"null", "x"})},
             });
         }
 

Reply via email to