From f243072a9ca3d135745441ab016996a00d183bd2 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Sun, 13 Sep 2015 17:06:45 -0400 Subject: Fix the fastpath rule for jsonb_concat with an empty operand. To prevent perverse results, we now only return the other operand if it's not scalar, and if both operands are of the same kind (array or object). Original bug complaint and patch from Oskari Saarenmaa, extended by me to cover the cases of different kinds of jsonb. Backpatch to 9.5 where jsonb_concat was introduced. --- src/backend/utils/adt/jsonfuncs.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/backend/utils/adt/jsonfuncs.c') diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index 3b8d42e4d51..154a8837e17 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -3359,12 +3359,18 @@ jsonb_concat(PG_FUNCTION_ARGS) *it2; /* - * If one of the jsonb is empty, just return other. + * If one of the jsonb is empty, just return the other if it's not + * scalar and both are of the same kind. If it's a scalar or they are + * of different kinds we need to perform the concatenation even if one is + * empty. */ - if (JB_ROOT_COUNT(jb1) == 0) - PG_RETURN_JSONB(jb2); - else if (JB_ROOT_COUNT(jb2) == 0) - PG_RETURN_JSONB(jb1); + if (JB_ROOT_IS_OBJECT(jb1) == JB_ROOT_IS_OBJECT(jb2)) + { + if (JB_ROOT_COUNT(jb1) == 0 && !JB_ROOT_IS_SCALAR(jb2)) + PG_RETURN_JSONB(jb2); + else if (JB_ROOT_COUNT(jb2) == 0 && !JB_ROOT_IS_SCALAR(jb1)) + PG_RETURN_JSONB(jb1); + } it1 = JsonbIteratorInit(&jb1->root); it2 = JsonbIteratorInit(&jb2->root); -- cgit v1.2.3