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