Re: Why does to_json take "anyelement" rather than "any"? - Mailing list pgsql-hackers

From Pavel Stehule
Subject Re: Why does to_json take "anyelement" rather than "any"?
Date
Msg-id CAFj8pRA7hiuXS7-nGeeZcLBsVwN3Tn7BewnyA+rrNzXwJH=xPg@mail.gmail.com
Whole thread Raw
In response to Re: Why does to_json take "anyelement" rather than "any"?  ("David G. Johnston" <david.g.johnston@gmail.com>)
List pgsql-hackers


pá 6. 11. 2020 v 1:39 odesílatel David G. Johnston <david.g.johnston@gmail.com> napsal:
On Thu, Nov 5, 2020 at 3:43 PM Mohamed Wael Khobalatte <mkhobalatte@grubhub.com> wrote:
 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. 

My understanding is that "any" is defined to accept that behavior - allowing any pseudo-type and unknown.  The "anyelement" polymorphic pseudo-type is defined such that only concrete known types are allowed to match - and then the rules of polymorphism apply when performing a lookup.  My uninformed conclusion is that since to_json only defines a single parameter that changing it from "anyelement" to "any" would be reasonable and the hack describe probably "just works" (though I'd test it on a wide-range of built-in types first if I was actually going to use the hack).

You only get to use "any" for a C-language function but that is indeed the case here.

Type "anyelement"  can force the function's result type directly. But there cannot be function that returns UNKNOWN. 

Type "any" just accept any argument without any impact on result type. Unfortunately, inside a function is necessary to do much more work related to casting types, and the execution can be slower. 

I checked the source code of to_json and this function can use "any" without any change. 

Regards

Pavel



David J.

pgsql-hackers by date:

Previous
From: Peter Smith
Date:
Subject: Re: extension patch of CREATE OR REPLACE TRIGGER
Next
From: Pavel Stehule
Date:
Subject: Re: default result formats setting