From 11aaa3f89cb85f7ef63e6cc5416c6b2f90e8322c Mon Sep 17 00:00:00 2001 From: "Charles S. Givre" Date: Mon, 26 Aug 2024 08:58:19 -0400 Subject: [PATCH] DRILL-8506: Ignore JSON Elements with Empty Keys (#2935) --- .../store/easy/json/parser/ObjectParser.java | 4 +-- .../store/easy/json/loader/TestBasics.java | 26 +++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/parser/ObjectParser.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/parser/ObjectParser.java index ad405c16417..a5787f85b0c 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/parser/ObjectParser.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/parser/ObjectParser.java @@ -238,8 +238,8 @@ private void parseMember(TokenIterator tokenizer) { */ private ElementParser detectValueParser(String key, TokenIterator tokenizer) { if (key.isEmpty()) { - throw errorFactory().structureError( - "Drill does not allow empty keys in JSON key/value pairs"); + logger.warn("Ignoring empty key: {}", key); + return DummyValueParser.INSTANCE; } ElementParser fieldParser = onField(key, tokenizer); if (fieldParser == null) { diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/easy/json/loader/TestBasics.java b/exec/java-exec/src/test/java/org/apache/drill/exec/store/easy/json/loader/TestBasics.java index 10fcbace9e9..0ab5c2b3c3c 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/store/easy/json/loader/TestBasics.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/easy/json/loader/TestBasics.java @@ -17,12 +17,6 @@ */ package org.apache.drill.exec.store.easy.json.loader; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - import org.apache.drill.categories.JsonTest; import org.apache.drill.common.exceptions.UserException; import org.apache.drill.common.types.TypeProtos.MinorType; @@ -35,6 +29,12 @@ import org.junit.Test; import org.junit.experimental.categories.Category; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + @Category(JsonTest.class) public class TestBasics extends BaseJsonLoaderTest { @@ -176,12 +176,22 @@ public void testMissingEndOuterArray() { @Test public void testEmptyKey() { - expectError("{\"\": 10}", "does not allow empty keys"); + JsonLoaderFixture loader = new JsonLoaderFixture(); + loader.jsonOptions.skipMalformedRecords = true; + loader.open("{\"\": 10}"); + RowSet results = loader.next(); + assertNotNull(results); + assertEquals(1, results.rowCount()); } @Test public void testBlankKey() { - expectError("{\" \": 10}", "does not allow empty keys"); + JsonLoaderFixture loader = new JsonLoaderFixture(); + loader.jsonOptions.skipMalformedRecords = true; + loader.open("{\" \": 10}"); + RowSet results = loader.next(); + assertNotNull(results); + assertEquals(1, results.rowCount()); } @Test