From b4cc19ab01ffe6a72a915b21aa41536de80923f5 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Mon, 1 Apr 2019 18:09:20 +0300 Subject: Throw error in jsonb_path_match() when result is not single boolean jsonb_path_match() checks if jsonb document matches jsonpath query. Therefore, jsonpath query should return single boolean. Currently, if result of jsonpath is not a single boolean, NULL is returned independently whether silent mode is on or off. But that appears to be wrong when silent mode is off. This commit makes jsonb_path_match() throw an error in this case. Author: Nikita Glukhov --- src/backend/utils/adt/jsonpath_exec.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'src/backend/utils/adt/jsonpath_exec.c') diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index c07225749e5..074cea24ae3 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -320,7 +320,6 @@ jsonb_path_match(PG_FUNCTION_ARGS) { Jsonb *jb = PG_GETARG_JSONB_P(0); JsonPath *jp = PG_GETARG_JSONPATH_P(1); - JsonbValue *jbv; JsonValueList found = {0}; Jsonb *vars = NULL; bool silent = true; @@ -333,18 +332,27 @@ jsonb_path_match(PG_FUNCTION_ARGS) (void) executeJsonPath(jp, vars, jb, !silent, &found); - if (JsonValueListLength(&found) < 1) - PG_RETURN_NULL(); - - jbv = JsonValueListHead(&found); - PG_FREE_IF_COPY(jb, 0); PG_FREE_IF_COPY(jp, 1); - if (jbv->type != jbvBool) - PG_RETURN_NULL(); + if (JsonValueListLength(&found) == 1) + { + JsonbValue *jbv = JsonValueListHead(&found); + + if (jbv->type == jbvBool) + PG_RETURN_BOOL(jbv->val.boolean); + + if (jbv->type == jbvNull) + PG_RETURN_NULL(); + } + + if (!silent) + ereport(ERROR, + (errcode(ERRCODE_SINGLETON_JSON_ITEM_REQUIRED), + errmsg(ERRMSG_SINGLETON_JSON_ITEM_REQUIRED), + errdetail("expression should return a singleton boolean"))); - PG_RETURN_BOOL(jbv->val.boolean); + PG_RETURN_NULL(); } /* -- cgit v1.2.3