Обсуждение: Documentation Chapter 16: 8.21

Поиск
Список
Период
Сортировка

Documentation Chapter 16: 8.21

От
PG Doc comments form
Дата:
The following documentation comment has been logged on the website:

Page: https://www.postgresql.org/docs/16/datatype-pseudo.html
Description:

I tryed to implement a safe_cast function with 2 parameters and a return of
type "any" but it failed. I get a syntax error, if I use "any" as a data
type, because it is a sql function (similar to array contains) and not a
data type.

And if there is a data type "any" in postgres too, how should it work as
parameter and wheres the difference to "anyelement"?

Re: Documentation Chapter 16: 8.21

От
Erik Wienhold
Дата:
On 2024-04-20 14:22 +0200, PG Doc comments form wrote:
> The following documentation comment has been logged on the website:
> 
> Page: https://www.postgresql.org/docs/16/datatype-pseudo.html
> Description:
> 
> I tryed to implement a safe_cast function with 2 parameters and a return of
> type "any" but it failed. I get a syntax error, if I use "any" as a data
> type, because it is a sql function (similar to array contains) and not a
> data type.

You have to use a double-quoted identifier, i.e. "any" instead of ANY.
But it won't work with PL languages:

    => create function f() returns "any" as 'select 1' language sql;
    ERROR:  SQL functions cannot return type "any"

You have to code a C function for that.

> And if there is a data type "any" in postgres too, how should it work as
> parameter and wheres the difference to "anyelement"?

"any" is like "anyelement" just without the polymorphic[1] behavior.
So an argument of type "any" does not determine the result type for
"anyarray" as "anyelement" would.

[1] https://www.postgresql.org/docs/current/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC

-- 
Erik



Re: Documentation Chapter 16: 8.21

От
Tom Lane
Дата:
Erik Wienhold <ewie@ewie.name> writes:
> On 2024-04-20 14:22 +0200, PG Doc comments form wrote:
>> I tryed to implement a safe_cast function with 2 parameters and a return of
>> type "any" but it failed.
>> And if there is a data type "any" in postgres too, how should it work as
>> parameter and wheres the difference to "anyelement"?

> "any" is like "anyelement" just without the polymorphic[1] behavior.
> So an argument of type "any" does not determine the result type for
> "anyarray" as "anyelement" would.

By the same token, there is just about no use-case for a function
declared to return "any".  The parser will not infer some other
data type the way it would do for "anyelement", so you'll end up
with an object that you can't do anything with.

            regards, tom lane