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 4c246f6cf5e3399b3e7b853a1432ca3589b129a1
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 6a7f621c10..d133fb6bb1 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
@@ -349,7 +349,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 ed519b6b31..71f4acce19 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
@@ -642,6 +642,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