On Mar 8, 2013, at 1:21 PM, Andrew Dunstan <and...@dunslane.net> wrote:
> Here's what rfc2119 says about that wording: > > 4. SHOULD NOT This phrase, or the phrase "NOT RECOMMENDED" mean that > there may exist valid reasons in particular circumstances when the > particular behavior is acceptable or even useful, but the full > implications should be understood and the case carefully weighed > before implementing any behavior described with this label. I suspect this was allowed for the JavaScript behavior where multiple keys are allowed, but the last key in the list wins. > So we're allowed to do as Robert chose, and I think there are good reasons > for doing so (apart from anything else, checking it would slow down the > parser enormously). Yes, but the implications are going to start biting us on the ass now. > Now you could argue that in that case the extractor functions should allow it > too, and it's probably fairly easy to change them to allow it. In that case > we need to decide who wins. We could treat a later field lexically as > overriding an earlier field of the same name, which I think is what David > expected. That's what plv8 does (i.e. it's how v8 interprets JSON): > > andrew=# create or replace function jget(t json, fld text) returns > text language plv8 as ' return t[fld]; '; > CREATE FUNCTION > andrew=# select jget('{"f1":"x","f1":"y"}','f1'); > jget > ------ > y > (1 row) > > > Or you could take the view I originally took that in view of the RFC wording > we should raise an error if this was found. > > I can live with either view. I’m on the fence. On the one hand, I like the plv8 behavior, which is nice for a dynamic language. On the other hand, I don't much care for it in my database, where I want data storage requirements to be quite strict. I hate the idea of "0000-00-00" being allowed as a date, and am uncomfortable with allowing duplicate keys to be stored in the JSON data type. So my order of preference for the options would be: 1. Have the JSON type collapse objects so the last instance of a key wins and is actually stored 2. Throw an error when a JSON type has duplicate keys 3. Have the accessors find the last instance of a key and return that value 4. Let things remain as they are now On second though, I don't like 4 at all. It means that the JSON type things a value is valid while the accessor does not. They contradict one another. Best, David -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers