Re: Why does to_json take "anyelement" rather than "any"?
От | Mohamed Wael Khobalatte |
---|---|
Тема | Re: Why does to_json take "anyelement" rather than "any"? |
Дата | |
Msg-id | CABZeWdwoR9UGJuLEMg7HxfboYUH_MX+yWq6e6DicW+WCKj7bpg@mail.gmail.com обсуждение исходный текст |
Ответ на | Why does to_json take "anyelement" rather than "any"? (Nikhil Benesch <nikhil.benesch@gmail.com>) |
Ответы |
Re: Why does to_json take "anyelement" rather than "any"?
|
Список | pgsql-hackers |
On Tue, Nov 3, 2020 at 11:54 AM Nikhil Benesch <nikhil.benesch@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.
В списке pgsql-hackers по дате отправления: