From 69bc91e8d3e6689d3cd41eaa8961f698ba286b60 Mon Sep 17 00:00:00 2001 From: Xavier Date: Wed, 23 Apr 2025 11:54:25 +0800 Subject: [PATCH] Add more test cases for json_query function --- .../sql/query/TestJsonQueryFunction.java | 53 ++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/core/trino-main/src/test/java/io/trino/sql/query/TestJsonQueryFunction.java b/core/trino-main/src/test/java/io/trino/sql/query/TestJsonQueryFunction.java index 8914b5a3ec60..21275f1d6899 100644 --- a/core/trino-main/src/test/java/io/trino/sql/query/TestJsonQueryFunction.java +++ b/core/trino-main/src/test/java/io/trino/sql/query/TestJsonQueryFunction.java @@ -425,7 +425,7 @@ public void testNullInput() } @Test - public void testDescendantMemberAccessor() + public void testDescendantMemberAccessorWithArrayWrapper() { assertThat(assertions.query( """ @@ -434,9 +434,58 @@ SELECT json_query( 'lax $..c' WITH ARRAY WRAPPER) """)) + .matches(""" + VALUES cast('[[true,{"c":{"c":null}}],{"c":null},null]'AS varchar) + """); + + // `json_query` must return a single JSON item. + // `WITH ARRAY WRAPPER` wraps `Diana` and `John` into a single JSON array, which can then be successfully returned. + assertThat(assertions.query( + """ + SELECT json_query( + '{"author":"Diana","id":{"value":1, "author":"John"},"notes":[{"type":1,"comment":"foo"},{"type":2,"comment":null}],"comment":["bar","baz"]}', + 'lax $..author' + WITH ARRAY WRAPPER) + """)) .matches( """ - VALUES cast('[[true,{"c":{"c":null}}],{"c":null},null]'AS varchar) + VALUES cast('["Diana","John"]'AS varchar) """); } + + @Test + public void testDescendantMemberAccessorWithoutArrayWrapper() + { + // Test `json_query` to find a non-existent member in the JSON. + assertThat(assertions.query( + """ + select json_query( + '{"id":{"value":1},"notes":[{"type":1,"comment":"foo"},{"type":2,"comment":null}],"comment":["bar","baz"]}', + 'lax $..author' + omit quotes) + """)) + .matches("VALUES cast(NULL as varchar)"); + + // Test `json_query` to find a single descendant member in the JSON. + assertThat(assertions.query( + """ + select json_query( + '{"author":"Diana","id":{"value":1},"notes":[{"type":1,"comment":"foo"},{"type":2,"comment":null}],"comment":["bar","baz"]}', + 'lax $..author' + omit quotes) + """)) + .matches("VALUES cast('Diana' as varchar)"); + + // Test `json_query` to find multiple descendant members in the JSON. + // `json_query` must return a single JSON item. + // `WITHOUT ARRAY WRAPPER` returns `NULL`, which is the default result in case of an error. + assertThat(assertions.query( + """ + select json_query( + '{"author":"Diana","id":{"value":1, "author":"John"},"notes":[{"type":1,"comment":"foo"},{"type":2,"comment":null}],"comment":["bar","baz"]}', + 'lax $..author' + omit quotes) + """)) + .matches("VALUES cast(NULL as varchar)"); + } }