/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.presto.operator.scalar; import org.testng.annotations.Test; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; import static com.facebook.presto.type.JsonType.JSON; import static io.airlift.slice.Slices.utf8Slice; import static java.lang.String.format; public class TestJsonFunctions extends AbstractTestFunctions { @Test public void testJsonArrayLength() { assertFunction("JSON_ARRAY_LENGTH('[]')", BIGINT, 0L); assertFunction("JSON_ARRAY_LENGTH('[1]')", BIGINT, 1L); assertFunction("JSON_ARRAY_LENGTH('[1, \"foo\", null]')", BIGINT, 3L); assertFunction("JSON_ARRAY_LENGTH('[2, 4, {\"a\": [8, 9]}, [], [5], 4]')", BIGINT, 6L); assertFunction("JSON_ARRAY_LENGTH(JSON '[]')", BIGINT, 0L); assertFunction("JSON_ARRAY_LENGTH(JSON '[1]')", BIGINT, 1L); assertFunction("JSON_ARRAY_LENGTH(JSON '[1, \"foo\", null]')", BIGINT, 3L); assertFunction("JSON_ARRAY_LENGTH(JSON '[2, 4, {\"a\": [8, 9]}, [], [5], 4]')", BIGINT, 6L); assertFunction("JSON_ARRAY_LENGTH(null)", BIGINT, null); } @Test public void testJsonArrayContainsBoolean() { assertFunction("JSON_ARRAY_CONTAINS('[]', true)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[true]', true)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[false]', false)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[true, false]', false)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[false, true]', true)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[1]', true)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[[true]]', true)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[1, \"foo\", null, \"true\"]', true)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[2, 4, {\"a\": [8, 9]}, [], [5], false]', false)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[]', true)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[true]', true)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[false]', false)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[true, false]', false)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[false, true]', true)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[1]', true)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[[true]]', true)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[1, \"foo\", null, \"true\"]', true)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[2, 4, {\"a\": [8, 9]}, [], [5], false]', false)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(null, true)", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS(null, null)", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS('[]', null)", BOOLEAN, null); } @Test public void testJsonArrayContainsLong() { assertFunction("JSON_ARRAY_CONTAINS('[]', 1)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[3]', 3)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[-4]', -4)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[1.0]', 1)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[[2]]', 2)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[1, \"foo\", null, \"8\"]', 8)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[2, 4, {\"a\": [8, 9]}, [], [5], 6]', 6)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[92233720368547758071]', -9)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[]', 1)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[3]', 3)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[-4]', -4)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[1.0]', 1)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[[2]]', 2)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[1, \"foo\", null, \"8\"]', 8)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[2, 4, {\"a\": [8, 9]}, [], [5], 6]', 6)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[92233720368547758071]', -9)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(null, 1)", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS(null, null)", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS('[3]', null)", BOOLEAN, null); } @Test public void testJsonArrayContainsDouble() { assertFunction("JSON_ARRAY_CONTAINS('[]', 1)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[1.5]', 1.5)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[-9.5]', -9.5)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[1]', 1.0)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[[2.5]]', 2.5)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[1, \"foo\", null, \"8.2\"]', 8.2)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[2, 4, {\"a\": [8, 9]}, [], [5], 6.1]', 6.1)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[9.6E400]', 4.2)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[]', 1)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[1.5]', 1.5)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[-9.5]', -9.5)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[1]', 1.0)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[[2.5]]', 2.5)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[1, \"foo\", null, \"8.2\"]', 8.2)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[2, 4, {\"a\": [8, 9]}, [], [5], 6.1]', 6.1)", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[9.6E400]', 4.2)", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(null, 1.5)", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS(null, null)", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS('[3.5]', null)", BOOLEAN, null); } @Test public void testJsonArrayContainsString() { assertFunction("JSON_ARRAY_CONTAINS('[]', 'x')", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[\"foo\"]', 'foo')", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[\"foo\", null]', cast(null as varchar))", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS('[\"8\"]', '8')", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[1, \"foo\", null]', 'foo')", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[1, 5]', '5')", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS('[2, 4, {\"a\": [8, 9]}, [], [5], \"6\"]', '6')", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[]', 'x')", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[\"foo\"]', 'foo')", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[\"foo\", null]', cast(null as varchar))", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS(JSON '[\"8\"]', '8')", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[1, \"foo\", null]', 'foo')", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(JSON '[1, 5]', '5')", BOOLEAN, false); assertFunction("JSON_ARRAY_CONTAINS(JSON '[2, 4, {\"a\": [8, 9]}, [], [5], \"6\"]', '6')", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS(null, 'x')", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS(null, '')", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS(null, null)", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS('[\"\"]', null)", BOOLEAN, null); assertFunction("JSON_ARRAY_CONTAINS('[\"\"]', '')", BOOLEAN, true); assertFunction("JSON_ARRAY_CONTAINS('[\"\"]', 'x')", BOOLEAN, false); } @Test public void testJsonArrayGetLong() { assertFunction("JSON_ARRAY_GET('[1]', 0)", JSON, utf8Slice(String.valueOf(1))); assertFunction("JSON_ARRAY_GET('[2, 7, 4]', 1)", JSON, utf8Slice(String.valueOf(7))); assertFunction("JSON_ARRAY_GET('[2, 7, 4, 6, 8, 1, 0]', 6)", JSON, utf8Slice(String.valueOf(0))); assertFunction("JSON_ARRAY_GET('[]', 0)", JSON, null); assertFunction("JSON_ARRAY_GET('[1, 3, 2]', 3)", JSON, null); assertFunction("JSON_ARRAY_GET('[2, 7, 4, 6, 8, 1, 0]', -1)", JSON, utf8Slice(String.valueOf(0))); assertFunction("JSON_ARRAY_GET('[2, 7, 4, 6, 8, 1, 0]', -2)", JSON, utf8Slice(String.valueOf(1))); assertFunction("JSON_ARRAY_GET('[2, 7, 4, 6, 8, 1, 0]', -7)", JSON, utf8Slice(String.valueOf(2))); assertFunction("JSON_ARRAY_GET('[2, 7, 4, 6, 8, 1, 0]', -8)", JSON, null); assertFunction("JSON_ARRAY_GET(JSON '[1]', 0)", JSON, utf8Slice(String.valueOf(1))); assertFunction("JSON_ARRAY_GET(JSON '[2, 7, 4]', 1)", JSON, utf8Slice(String.valueOf(7))); assertFunction("JSON_ARRAY_GET(JSON '[2, 7, 4, 6, 8, 1, 0]', 6)", JSON, utf8Slice(String.valueOf(0))); assertFunction("JSON_ARRAY_GET(JSON '[]', 0)", JSON, null); assertFunction("JSON_ARRAY_GET(JSON '[1, 3, 2]', 3)", JSON, null); assertFunction("JSON_ARRAY_GET(JSON '[2, 7, 4, 6, 8, 1, 0]', -1)", JSON, utf8Slice(String.valueOf(0))); assertFunction("JSON_ARRAY_GET(JSON '[2, 7, 4, 6, 8, 1, 0]', -2)", JSON, utf8Slice(String.valueOf(1))); assertFunction("JSON_ARRAY_GET(JSON '[2, 7, 4, 6, 8, 1, 0]', -7)", JSON, utf8Slice(String.valueOf(2))); assertFunction("JSON_ARRAY_GET(JSON '[2, 7, 4, 6, 8, 1, 0]', -8)", JSON, null); assertFunction("JSON_ARRAY_GET('[]', null)", JSON, null); assertFunction("JSON_ARRAY_GET('[1]', null)", JSON, null); assertFunction("JSON_ARRAY_GET('', null)", JSON, null); assertFunction("JSON_ARRAY_GET('', 1)", JSON, null); assertFunction("JSON_ARRAY_GET('', -1)", JSON, null); assertFunction("JSON_ARRAY_GET('[1]', -9223372036854775807 - 1)", JSON, null); } @Test public void testJsonArrayGetString() { assertFunction("JSON_ARRAY_GET('[\"jhfa\"]', 0)", JSON, "jhfa"); assertFunction("JSON_ARRAY_GET('[\"jhfa\", null]', 1)", JSON, null); assertFunction("JSON_ARRAY_GET('[\"as\", \"fgs\", \"tehgf\"]', 1)", JSON, "fgs"); assertFunction("JSON_ARRAY_GET('[\"as\", \"fgs\", \"tehgf\", \"gjyj\", \"jut\"]', 4)", JSON, "jut"); assertFunction("JSON_ARRAY_GET(JSON '[\"jhfa\"]', 0)", JSON, "jhfa"); assertFunction("JSON_ARRAY_GET(JSON '[\"jhfa\", null]', 1)", JSON, null); assertFunction("JSON_ARRAY_GET(JSON '[\"as\", \"fgs\", \"tehgf\"]', 1)", JSON, "fgs"); assertFunction("JSON_ARRAY_GET(JSON '[\"as\", \"fgs\", \"tehgf\", \"gjyj\", \"jut\"]', 4)", JSON, "jut"); assertFunction("JSON_ARRAY_GET('[\"\"]', 0)", JSON, ""); assertFunction("JSON_ARRAY_GET('[]', 0)", JSON, null); assertFunction("JSON_ARRAY_GET('[null]', 0)", JSON, null); assertFunction("JSON_ARRAY_GET('[]', null)", JSON, null); assertFunction("JSON_ARRAY_GET('[1]', -9223372036854775807 - 1)", JSON, null); } @Test public void testJsonArrayGetDouble() { assertFunction("JSON_ARRAY_GET('[3.14]', 0)", JSON, utf8Slice(String.valueOf(3.14))); assertFunction("JSON_ARRAY_GET('[3.14, null]', 1)", JSON, null); assertFunction("JSON_ARRAY_GET('[1.12, 3.54, 2.89]', 1)", JSON, utf8Slice(String.valueOf(3.54))); assertFunction("JSON_ARRAY_GET('[0.58, 9.7, 7.6, 11.2, 5.02]', 4)", JSON, utf8Slice(String.valueOf(5.02))); assertFunction("JSON_ARRAY_GET(JSON '[3.14]', 0)", JSON, utf8Slice(String.valueOf(3.14))); assertFunction("JSON_ARRAY_GET(JSON '[3.14, null]', 1)", JSON, null); assertFunction("JSON_ARRAY_GET(JSON '[1.12, 3.54, 2.89]', 1)", JSON, utf8Slice(String.valueOf(3.54))); assertFunction("JSON_ARRAY_GET(JSON '[0.58, 9.7, 7.6, 11.2, 5.02]', 4)", JSON, utf8Slice(String.valueOf(5.02))); assertFunction("JSON_ARRAY_GET('[1.0]', -1)", JSON, utf8Slice(String.valueOf(1.0))); assertFunction("JSON_ARRAY_GET('[1.0]', null)", JSON, null); } @Test public void testJsonArrayGetBoolean() { assertFunction("JSON_ARRAY_GET('[true]', 0)", JSON, utf8Slice(String.valueOf(true))); assertFunction("JSON_ARRAY_GET('[true, null]', 1)", JSON, null); assertFunction("JSON_ARRAY_GET('[false, false, true]', 1)", JSON, utf8Slice(String.valueOf(false))); assertFunction( "JSON_ARRAY_GET('[true, false, false, true, true, false]', 5)", JSON, utf8Slice(String.valueOf(false)) ); assertFunction("JSON_ARRAY_GET(JSON '[true]', 0)", JSON, utf8Slice(String.valueOf(true))); assertFunction("JSON_ARRAY_GET(JSON '[true, null]', 1)", JSON, null); assertFunction("JSON_ARRAY_GET(JSON '[false, false, true]', 1)", JSON, utf8Slice(String.valueOf(false))); assertFunction( "JSON_ARRAY_GET(JSON '[true, false, false, true, true, false]', 5)", JSON, utf8Slice(String.valueOf(false)) ); assertFunction("JSON_ARRAY_GET('[true]', -1)", JSON, utf8Slice(String.valueOf(true))); } @Test public void testJsonArrayGetNonScalar() { assertFunction("JSON_ARRAY_GET('[{\"hello\":\"world\"}]', 0)", JSON, utf8Slice(String.valueOf("{\"hello\":\"world\"}"))); assertFunction("JSON_ARRAY_GET('[{\"hello\":\"world\"}, [1,2,3]]', 1)", JSON, utf8Slice(String.valueOf("[1,2,3]"))); assertFunction("JSON_ARRAY_GET('[{\"hello\":\"world\"}, [1,2, {\"x\" : 2} ]]', 1)", JSON, utf8Slice(String.valueOf("[1,2,{\"x\":2}]"))); assertFunction("JSON_ARRAY_GET('[{\"hello\":\"world\"}, {\"a\":[{\"x\":99}]}]', 1)", JSON, utf8Slice(String.valueOf("{\"a\":[{\"x\":99}]}"))); assertFunction("JSON_ARRAY_GET('[{\"hello\":\"world\"}, {\"a\":[{\"x\":99}]}]', -1)", JSON, utf8Slice(String.valueOf("{\"a\":[{\"x\":99}]}"))); assertFunction("JSON_ARRAY_GET('[{\"hello\": null}]', 0)", JSON, utf8Slice(String.valueOf("{\"hello\":null}"))); assertFunction("JSON_ARRAY_GET('[{\"\":\"\"}]', 0)", JSON, utf8Slice(String.valueOf("{\"\":\"\"}"))); assertFunction("JSON_ARRAY_GET('[{null:null}]', 0)", JSON, null); assertFunction("JSON_ARRAY_GET('[{null:\"\"}]', 0)", JSON, null); assertFunction("JSON_ARRAY_GET('[{\"\":null}]', 0)", JSON, utf8Slice(String.valueOf("{\"\":null}"))); assertFunction("JSON_ARRAY_GET('[{\"\":null}]', -1)", JSON, utf8Slice(String.valueOf("{\"\":null}"))); } @Test public void testJsonArrayContainsInvalid() { for (String value : new String[] {"'x'", "2.5", "8", "true", "cast(null as varchar)"}) { for (String array : new String[] {"", "123", "[", "[1,0,]", "[1,,0]"}) { assertFunction(format("JSON_ARRAY_CONTAINS('%s', %s)", array, value), BOOLEAN, null); } } } @Test public void testInvalidJsonParse() { assertInvalidFunction("JSON 'INVALID'", INVALID_FUNCTION_ARGUMENT); assertInvalidFunction("JSON_PARSE('INVALID')", INVALID_FUNCTION_ARGUMENT); } @Test public void testTryInvalidJsonParse() { assertFunction("TRY (JSON 'INVALID')", JSON, null); assertFunction("TRY (JSON_PARSE('INVALID'))", JSON, null); } @Test public void testJsonFormat() { assertFunction("JSON_FORMAT(JSON '[\"a\", \"b\"]')", VARCHAR, "[\"a\",\"b\"]"); } @Test public void testJsonSize() { assertFunction(format("JSON_SIZE('%s', '%s')", "{\"x\": {\"a\" : 1, \"b\" : 2} }", "$"), BIGINT, 1L); assertFunction(format("JSON_SIZE('%s', '%s')", "{\"x\": {\"a\" : 1, \"b\" : 2} }", "$.x"), BIGINT, 2L); assertFunction(format("JSON_SIZE('%s', '%s')", "{\"x\": {\"a\" : 1, \"b\" : [1,2,3], \"c\" : {\"w\":9}} }", "$.x"), BIGINT, 3L); assertFunction(format("JSON_SIZE('%s', '%s')", "{\"x\": {\"a\" : 1, \"b\" : 2} }", "$.x.a"), BIGINT, 0L); assertFunction(format("JSON_SIZE('%s', '%s')", "[1,2,3]", "$"), BIGINT, 3L); assertFunction(format("JSON_SIZE('%s', CHAR '%s')", "[1,2,3]", "$"), BIGINT, 3L); assertFunction(format("JSON_SIZE(null, '%s')", "$"), BIGINT, null); assertFunction(format("JSON_SIZE('%s', '%s')", "INVALID_JSON", "$"), BIGINT, null); assertFunction(format("JSON_SIZE('%s', null)", "[1,2,3]"), BIGINT, null); assertFunction(format("JSON_SIZE(JSON '%s', '%s')", "{\"x\": {\"a\" : 1, \"b\" : 2} }", "$"), BIGINT, 1L); assertFunction(format("JSON_SIZE(JSON '%s', '%s')", "{\"x\": {\"a\" : 1, \"b\" : 2} }", "$.x"), BIGINT, 2L); assertFunction(format("JSON_SIZE(JSON '%s', '%s')", "{\"x\": {\"a\" : 1, \"b\" : [1,2,3], \"c\" : {\"w\":9}} }", "$.x"), BIGINT, 3L); assertFunction(format("JSON_SIZE(JSON '%s', '%s')", "{\"x\": {\"a\" : 1, \"b\" : 2} }", "$.x.a"), BIGINT, 0L); assertFunction(format("JSON_SIZE(JSON '%s', '%s')", "[1,2,3]", "$"), BIGINT, 3L); assertFunction(format("JSON_SIZE(null, '%s')", "$"), BIGINT, null); assertFunction(format("JSON_SIZE(JSON '%s', null)", "[1,2,3]"), BIGINT, null); assertInvalidFunction(format("JSON_SIZE('%s', '%s')", "{\"\":\"\"}", ""), "Invalid JSON path: ''"); assertInvalidFunction(format("JSON_SIZE('%s', CHAR '%s')", "{\"\":\"\"}", " "), "Invalid JSON path: ' '"); assertInvalidFunction(format("JSON_SIZE('%s', '%s')", "{\"\":\"\"}", "."), "Invalid JSON path: '.'"); assertInvalidFunction(format("JSON_SIZE('%s', '%s')", "{\"\":\"\"}", "null"), "Invalid JSON path: 'null'"); assertInvalidFunction(format("JSON_SIZE('%s', '%s')", "{\"\":\"\"}", null), "Invalid JSON path: 'null'"); } @Test public void testJsonEquality() { assertFunction("JSON '[1,2,3]' = JSON '[1,2,3]'", BOOLEAN, true); assertFunction("JSON '{\"a\":1, \"b\":2}' = JSON '{\"b\":2, \"a\":1}'", BOOLEAN, true); assertFunction("JSON '{\"a\":1, \"b\":2}' = CAST(MAP(ARRAY['b','a'], ARRAY[2,1]) AS JSON)", BOOLEAN, true); assertFunction("JSON 'null' = JSON 'null'", BOOLEAN, true); assertFunction("JSON 'true' = JSON 'true'", BOOLEAN, true); assertFunction("JSON '{\"x\":\"y\"}' = JSON '{\"x\":\"y\"}'", BOOLEAN, true); assertFunction("JSON '[1,2,3]' = JSON '[2,3,1]'", BOOLEAN, false); assertFunction("JSON '{\"p_1\": 1, \"p_2\":\"v_2\", \"p_3\":null, \"p_4\":true, \"p_5\": {\"p_1\":1}}' = " + "JSON '{\"p_2\":\"v_2\", \"p_4\":true, \"p_1\": 1, \"p_3\":null, \"p_5\": {\"p_1\":1}}'", BOOLEAN, true); assertFunction("JSON '[1,2,3]' != JSON '[1,2,3]'", BOOLEAN, false); assertFunction("JSON '{\"a\":1, \"b\":2}' != JSON '{\"b\":2, \"a\":1}'", BOOLEAN, false); assertFunction("JSON 'null' != JSON 'null'", BOOLEAN, false); assertFunction("JSON 'true' != JSON 'true'", BOOLEAN, false); assertFunction("JSON '{\"x\":\"y\"}' != JSON '{\"x\":\"y\"}'", BOOLEAN, false); assertFunction("JSON '[1,2,3]' != JSON '[2,3,1]'", BOOLEAN, true); assertFunction("JSON '{\"p_1\": 1, \"p_2\":\"v_2\", \"p_3\":null, \"p_4\":true, \"p_5\": {\"p_1\":1}}' != " + "JSON '{\"p_2\":\"v_2\", \"p_4\":true, \"p_1\": 1, \"p_3\":null, \"p_5\": {\"p_1\":1}}'", BOOLEAN, false); } }