How to \ef a function ?

Started by David Gauthierabout 2 years ago4 messagesgeneral
Jump to latest
#1David Gauthier
dfgpostgres@gmail.com

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 ?

#2Adrian Klaver
adrian.klaver@aklaver.com
In reply to: David Gauthier (#1)
Re: How to \ef a function ?

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

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Adrian Klaver (#2)
Re: How to \ef a function ?

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

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#3)
Re: How to \ef a function ?

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