Re: jsonb concatenate operator's semantics seem questionable - Mailing list pgsql-hackers

From Petr Jelinek
Subject Re: jsonb concatenate operator's semantics seem questionable
Date
Msg-id 555C1F0F.4050901@2ndquadrant.com
Whole thread Raw
In response to Re: jsonb concatenate operator's semantics seem questionable  (Jim Nasby <Jim.Nasby@BlueTreble.com>)
Responses Re: jsonb concatenate operator's semantics seem questionable  (Peter Geoghegan <pg@heroku.com>)
Re: jsonb concatenate operator's semantics seem questionable  (Alvaro Herrera <alvherre@2ndquadrant.com>)
List pgsql-hackers
On 20/05/15 01:38, Jim Nasby wrote:
> On 5/18/15 3:15 PM, Marko Tiikkaja wrote:
>> On 2015-05-18 22:10, Josh Berkus wrote:
>>> On 05/18/2015 01:04 PM, Ryan Pedela wrote:
>>>> In the context of splitting shallow and deep merge into two
>>>> operators, I
>>>> think + is better for shallow and || better for deep. The reason for +
>>>> is because many programming languages have this behavior. If I see the
>>>> below code in language I have never used before:
>>>>
>>>> objC = objA + objB
>>>>
>>>> My default assumption is that + performs a shallow merge. Like I
>>>> said, I
>>>> would rather there just be one operator.
>>>
>>> Thank you, that helps.  Anyone else?
>>
>> If everyone thinks the operators mean different things, we could just
>> not add any operators and only provide functions instead.
>
> My $0.02: I would expect || to be what I want to use to add something to
> an existing JSON document, no matter what the path of what I'm adding
> is. In other words, deep merge. I certainly wouldn't expect it to be
> shallow.
>
> If we get this wrong now, we'll be stuck with it forever. At a minimum I
> think we should use anything other than || until we can figure this out.
> That leaves || available for whichever case we decide on.
>

I am of strong opinion that concat should be shallow by default. Again 
it's how jquery works by default, it's how python's dict.update works 
and you can find this behavior in other languages as well when dealing 
with nested hashes. It's also how json would behave if you'd just did 
string concatenation (removing the outermost curly brackets) and parse 
it to json afterwards.

I think this whole discussion shows primarily that it's by far not 
universally agreed if concatenation of json should be shallow or deep by 
default and AFAICS this is true even in javascript world so we don't 
really have where to look for precedents.

Given the above I would vote to just provide the function and leave out 
the || operator for now.

--  Petr Jelinek                  http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training &
Services



pgsql-hackers by date:

Previous
From: Jim Nasby
Date:
Subject: Re: Change pg_cancel_*() to ignore current backend
Next
From: Peter Geoghegan
Date:
Subject: Re: Minor ON CONFLICT related fixes