On Tue, Nov 3, 2020 at 11:54 AM Nikhil Benesch <nikhil.bene...@gmail.com> wrote:
> to_json is declared as taking "anyelement" as input, which means > you can't pass it something of unknown type: > > postgres=# SELECT to_json('foo'); > ERROR: could not determine polymorphic type because input has type > unknown > > But this works fine with the very similar json_build_array function: > > postgres=# SELECT json_build_array('foo'); > json_build_array > ------------------ > ["foo"] > (1 row) > > The difference is that json_build_array takes type "any" as input, while > to_json takes "anyelement" as input. > > Is there some reason to_json couldn't be switched to take "any" as input? > Hacking this together seems to mostly just work: > > postgres=# CREATE FUNCTION my_to_json ("any") RETURNS json LANGUAGE > 'internal' AS 'to_json'; > postgres=# SELECT my_to_json('foo'); > my_to_json > ------------ > "foo" > (1 row) > > Is there something I'm missing? > > Nikhil > > Hm, good question. I am also curious as to why this happens. `json_build_array` ends up casting unknowns to text (from reading the code), which seems like a reasonable (although not completely tight) assumption. Not sure why `to_json` can't just do the same. You can always cast to text yourself, of course, but I am not familiar with the type hierarchy enough to tell why `to_json` can't deduce that as text whereas the other function can.