Обсуждение: How to \ef a function ?

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

How to \ef a function ?

От
David Gauthier
Дата:
atletx7-reg017:/home/dgauthie[ 120 ] --> dvdbdev
Pager usage is off.
psql (11.5, server 11.3)
Type "help" for help.

dvdb=# \df opid.bef_ins_axi_reqs_set_trig;
                                 List of functions
 Schema |           Name            | Result data type | Argument data types | Type
--------+---------------------------+------------------+---------------------+------
 opid   | bef_ins_axi_reqs_set_trig | trigger          |                     | func
(1 row)

dvdb=# \ef opid.bef_ins_axi_reqs_set_trig;
ERROR:  function "opid.bef_ins_axi_reqs_set_trig;" does not exist
dvdb=# \ef opid.bef_ins_axi_reqs_set_trig();
ERROR:  expected a right parenthesis
dvdb=# 

So the function exists with \df but not \ef ?
I get the need to identify the argument list (in case there's >1 with same name, diff arg list), but '()' doesn't work.  Does this have to do with the returned trigger type ?

Re: How to \ef a function ?

От
Adrian Klaver
Дата:
On 1/8/24 08:26, David Gauthier wrote:
> atletx7-reg017:/home/dgauthie[ 120 ] --> dvdbdev
> Pager usage is off.
> psql (11.5, server 11.3)
> Type "help" for help.
> 
> dvdb=# \df opid.bef_ins_axi_reqs_set_trig;
>                                   List of functions
>   Schema |           Name            | Result data type | Argument data 
> types | Type
> --------+---------------------------+------------------+---------------------+------
>   opid   | bef_ins_axi_reqs_set_trig | trigger          |               
>        | func
> (1 row)
> 
> dvdb=# \ef opid.bef_ins_axi_reqs_set_trig;
> ERROR:  function "opid.bef_ins_axi_reqs_set_trig;" does not exist

Lose the ';'.

It should be:

\ef opid.bef_ins_axi_reqs_set_trig

> dvdb=# \ef opid.bef_ins_axi_reqs_set_trig();
> ERROR:  expected a right parenthesis
> dvdb=#
> 
> So the function exists with \df but not \ef ?
> I get the need to identify the argument list (in case there's >1 with 
> same name, diff arg list), but '()' doesn't work.  Does this have to do 
> with the returned trigger type ?
> 

-- 
Adrian Klaver
adrian.klaver@aklaver.com




Re: How to \ef a function ?

От
Tom Lane
Дата:
Adrian Klaver <adrian.klaver@aklaver.com> writes:
> On 1/8/24 08:26, David Gauthier wrote:
>> dvdb=# \ef opid.bef_ins_axi_reqs_set_trig;
>> ERROR:  function "opid.bef_ins_axi_reqs_set_trig;" does not exist

> Lose the ';'.
> It should be:
> \ef opid.bef_ins_axi_reqs_set_trig

Yeah, that's what psql is expecting, but it does seem a bit
unforgiving considering that you can write a noise semicolon
in many other backslash commands.  And this:

>> dvdb=# \ef opid.bef_ins_axi_reqs_set_trig();
>> ERROR:  expected a right parenthesis

seems outright buggy.  I've not looked at the code though.

            regards, tom lane



Re: How to \ef a function ?

От
Tom Lane
Дата:
I wrote:
> Yeah, that's what psql is expecting, but it does seem a bit
> unforgiving considering that you can write a noise semicolon
> in many other backslash commands.  And this:

> dvdb=# \ef opid.bef_ins_axi_reqs_set_trig();
> ERROR:  expected a right parenthesis

> seems outright buggy.  I've not looked at the code though.

Ah, I see it.  The difference in the error messages is because \ef
feeds the whole argument to regprocin to find out the function OID
if there are no parens, but regprocedurein if there are parens.
Neither of those functions like the trailing semicolon, but their
complaints are different.

More interestingly, \ef is actually trying to ignore trailing
semicolons: exec_command_ef_ev tells psql_scan_slash_option
to do so.  But it's using OT_WHOLE_LINE mode and that function
ignores the request in that mode.  So that seems like an
oversight.

            regards, tom lane