diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFJson.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFJson.java index 9e7e05361f9b..a680e9cca154 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFJson.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFJson.java @@ -239,11 +239,12 @@ private Object extract(Object json, String path, boolean skipMapProc) { indexListCache.put(path, indexList); } - if (indexList.size() > 0) { - json = extract_json_withindex(json, indexList); + if (indexList.isEmpty()) { + // Return null if index is invalid. + return path.contains("[") ? null : json; } - return json; + return extract_json_withindex(json, indexList); } private transient AddingList jsonList = new AddingList(); diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFJson.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFJson.java index c2d1f42fb730..3b9849f95532 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFJson.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFJson.java @@ -105,6 +105,9 @@ public void testRootArray() throws HiveException { runTest("[1,2,3]", "$0", null, udf); runTest("[1,2,3]", "0", null, udf); runTest("[1,2,3]", "$.", null, udf); + runTest("[1,2,3]", "$[1 ]", null, udf); + runTest("[1,2,3]", "$[ 1]", null, udf); + runTest("[1,2,3]", "$[invalid]", null, udf); runTest("[1,2,3]", "$", "[1,2,3]", udf); runTest("{\"a\":4}", "$", "{\"a\":4}", udf); diff --git a/ql/src/test/queries/clientpositive/udf_get_json_object.q b/ql/src/test/queries/clientpositive/udf_get_json_object.q index e5762c2e552b..c156e496ac19 100644 --- a/ql/src/test/queries/clientpositive/udf_get_json_object.q +++ b/ql/src/test/queries/clientpositive/udf_get_json_object.q @@ -64,4 +64,6 @@ get_json_object('[{"k1":[{"k11":[1,2,3]}]}]', '$[0].k1[0].k11[1]'); SELECT get_json_object('[1,2,3]', '[2]'), get_json_object('[1,2,3]', '$0'), +get_json_object('[1,2,3]', '$[0 ]'), +get_json_object('[1,2,3]', '$[ 0]'), get_json_object('[1,2,3]', '$[3]'); \ No newline at end of file diff --git a/ql/src/test/results/clientpositive/llap/udf_get_json_object.q.out b/ql/src/test/results/clientpositive/llap/udf_get_json_object.q.out index d2ae71c96b17..05e50c97b1cf 100644 --- a/ql/src/test/results/clientpositive/llap/udf_get_json_object.q.out +++ b/ql/src/test/results/clientpositive/llap/udf_get_json_object.q.out @@ -227,6 +227,8 @@ POSTHOOK: Input: _dummy_database@_dummy_table PREHOOK: query: SELECT get_json_object('[1,2,3]', '[2]'), get_json_object('[1,2,3]', '$0'), +get_json_object('[1,2,3]', '$[0 ]'), +get_json_object('[1,2,3]', '$[ 0]'), get_json_object('[1,2,3]', '$[3]') PREHOOK: type: QUERY PREHOOK: Input: _dummy_database@_dummy_table @@ -234,8 +236,10 @@ PREHOOK: Input: _dummy_database@_dummy_table POSTHOOK: query: SELECT get_json_object('[1,2,3]', '[2]'), get_json_object('[1,2,3]', '$0'), +get_json_object('[1,2,3]', '$[0 ]'), +get_json_object('[1,2,3]', '$[ 0]'), get_json_object('[1,2,3]', '$[3]') POSTHOOK: type: QUERY POSTHOOK: Input: _dummy_database@_dummy_table #### A masked pattern was here #### -NULL NULL NULL +NULL NULL NULL NULL NULL