From 1d5f3f976b26271b51a619f02436ec5c263db9f3 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 21 Dec 2020 13:11:30 -0500 Subject: Remove "invalid concatenation of jsonb objects" error case. The jsonb || jsonb operator arbitrarily rejected certain combinations of scalar and non-scalar inputs, while being willing to concatenate other combinations. This was of course quite undocumented. Rather than trying to document it, let's just remove the restriction, creating a uniform rule that unless we are handling an object-to-object concatenation, non-array inputs are converted to one-element arrays, resulting in an array-to-array concatenation. (This does not change the behavior for any case that didn't throw an error before.) Per complaint from Joel Jacobson. Back-patch to all supported branches. Discussion: https://postgr.es/m/163099.1608312033@sss.pgh.pa.us --- doc/src/sgml/func.sgml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'doc/src/sgml/func.sgml') diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 2890f0e2c4d..5feb23c9371 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -10896,10 +10896,13 @@ table2-mapping - The || operator concatenates the elements at the top level of - each of its operands. It does not operate recursively. For example, if - both operands are objects with a common key field name, the value of the - field in the result will just be the value from the right hand operand. + The || operator concatenates two JSON objects by + generating an object containing the union of their keys, taking the + second object's value when there are duplicate keys. All other cases + produce a JSON array: first, any non-array input is converted into a + single-element array, and then the two arrays are concatenated. + It does not operate recursively; only the top-level array or object + structure is merged. -- cgit v1.2.3