Function Signature Types¶
Function signature types are essentially a way to type functions with a specific arguments and return type signature.
Whereas regproc and regprocedure denote that the type is a function or a procedure, the type itself does not convey
its signature. This limits their usefulness.
Function signature types, on the other hand, can be used to call functions that match the signature.
Defining a function signature type¶
To define such a type, use omni_types.function_signature_type(name, ...signature):
In the above example, it will define type sig that denotes a function that takes text and returns int (the last
element in the variadic signature argument is the return type)
| Parameter | Type | Description |
|---|---|---|
| name | name | Name of the newly created type |
| signature | variadic regtype | Signature of the function. Last value is the return type |
Calling the function with the same arguments will return the same type without attempting to recreate it, if the signatures match. Otherwise, an error will occur.
Defining a signature from a prototype¶
One can also define a function signature type by using an existing function as a prototype
with omni_types.function_signature_type(name, function):
| Parameter | Type | Description |
|---|---|---|
| name | name | Name of the newly created type |
| func | text | Name (pg_backend_pid) or argument signature (length(text)) of the function |
Casting to a function signature type¶
With the type defined, one can cast a function name into it. It will return a sig type successfully if it matches:
If no function is matching the signature captured by the type, this will fail with an error. If this is undesirable,
<TYPE>_conforming_function(text) can be used instead:
with funcs as (select sig_confirming_function(name::text) as f from names)
select funcs
where f is not null;
Calling a function¶
Function signature types can be called (and it is one of its primary benefits!) by using an auto-generated call_<NAME>
function: