On Tue, May 31, 2016 at 6:20 PM, Tom Lane <t...@sss.pgh.pa.us> wrote:
> David Fetter <da...@fetter.org> writes:
> > On Tue, May 31, 2016 at 05:06:00PM -0400, David G. Johnston wrote:
> >> While likely not that common the introduction of an ambiguity makes
> >> raises the bar considerably.
> > What ambiguity?
> You get that as a result of the recent introduction of unnest(tsvector),
> which we debated a few weeks ago and seem to have decided to leave as-is.
> But it failed before 9.6 too, with
> So at least in this particular case, adding unnest(jsonb) wouldn't be a
> problem from the standpoint of not being able to resolve calls that we
> could resolve before.
> Nonetheless, there *is* an ambiguity here, which is specific to json(b):
> what type of array are you expecting to get? The reason we have both
> json[b]_array_elements() and json[b]_array_elements_text() is that there
> are plausible use-cases for returning either json or plain text. It's not
> hard to imagine that somebody will want json[b]_array_elements_numeric()
> before long, too. If you want to have an unnest(jsonb) then you will need
> to make an arbitrary decision about which type it will return, and that
> doesn't seem like an especially great idea to me.
I'm on the fence given the presence of the tsvector overload and the lack
of any syntactic concerns.
I would either have it keep the same form as our main unnest function:
<unnest(anyarray) : setof anyelement>
and/or have two functions
unnest(json, anyelement) : anyelement
unnest(jsonb, anyelement) : anyelement
The first one cannot fail at runtime (do to type conversion) while the
later two can.
If you can't tell I do like our introduction of what are basically Java
generics into our idiomatic json implementation.
I'd call this implementing a better option for polymorphism than creating
a new function every time someone wants typed output.