Hi, I find if there are more than one functions in different schemas,
and the functions have the same name and the same arguments, \df[+] only display the function that schema earlier appeared in the search_path. And SELECT pg_function_is_visible(funoid) returns f. Because in FunctionIsVisible(Oid funcid) function, only use proname to see if the function can be found by FuncnameGetCandidates. I think \df[+] should display all the functions, and in FunctionIsVisible(Oid funcid) function, should use pronamespace and proname to see if the function can be found by FuncnameGetCandidates. Next is my test cases. The PostgreSQL version is 15.1. CREATE OR REPLACE FUNCTION fun1(arg1 INT, arg2 OUT int, arg3 IN OUT int) RETURNS RECORD AS $$ BEGIN arg3 := arg1 + arg2; END; $$ LANGUAGE plpgsql; CREATE OR REPLACE PROCEDURE proc1(arg1 INT, arg2 IN OUT INT, arg3 OUT INT) AS $$ BEGIN arg3 := arg1 + arg2; END; $$ LANGUAGE plpgsql; postgres=# \df List of functions Schema | Name | Result data type | Argument data types | Type --------+-------+------------------+-------------------------------------------------------+------ public | fun1 | record | arg1 integer, OUT arg2 integer, INOUT arg3 integer | func public | proc1 | | IN arg1 integer, INOUT arg2 integer, OUT arg3 integer | proc (2 rows) set search_path="$user", public, s1; CREATE SCHEMA s1; CREATE OR REPLACE FUNCTION s1.fun1(arg1 INT, arg2 OUT int, arg3 IN OUT int) RETURNS RECORD AS $$ BEGIN arg3 := arg1 + arg2; END; $$ LANGUAGE plpgsql; CREATE OR REPLACE PROCEDURE s1.proc1(arg1 INT, arg2 IN OUT INT, arg3 OUT INT) AS $$ BEGIN arg3 := arg1 + arg2; END; $$ LANGUAGE plpgsql; postgres=# \df List of functions Schema | Name | Result data type | Argument data types | Type --------+-------+------------------+-------------------------------------------------------+------ public | fun1 | record | arg1 integer, OUT arg2 integer, INOUT arg3 integer | func public | proc1 | | IN arg1 integer, INOUT arg2 integer, OUT arg3 integer | proc (2 rows) postgres=# \df fun1 List of functions Schema | Name | Result data type | Argument data types | Type --------+------+------------------+----------------------------------------------------+------ public | fun1 | record | arg1 integer, OUT arg2 integer, INOUT arg3 integer | func (1 row) postgres=# select * from pg_proc where proname like 'fun1'; oid | proname | pronamespace | proowner | prolang | procost | prorows | provariadic | prosupport | prokind | prosecdef | proleakproof | proisstrict | proretset | provolatile | proparallel | pronargs | pronargdefa ults | prorettype | proargtypes | proallargtypes | proargmodes | proargnames | proargdefaults | protrftypes | prosrc | probin | prosqlbody | proconfig | proacl -------+---------+--------------+----------+---------+---------+---------+-------------+------------+---------+-----------+--------------+-------------+-----------+-------------+-------------+----------+------------ -----+------------+-------------+----------------+-------------+------------------+----------------+-------------+------------------------+--------+------------+-----------+-------- 16386 | fun1 | 2200 | 10 | 13677 | 100 | 0 | 0 | - | f | f | f | f | f | v | u | 2 | 0 | 2249 | 23 23 | {23,23,23} | {i,o,b} | {arg1,arg2,arg3} | | | +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | BEGIN +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | arg3 := arg1 + arg2;+| | | | | | | | | | | | | | | | | | | | | | | | | | | | | END; +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 16389 | fun1 | 16388 | 10 | 13677 | 100 | 0 | 0 | - | f | f | f | f | f | v | u | 2 | 0 | 2249 | 23 23 | {23,23,23} | {i,o,b} | {arg1,arg2,arg3} | | | +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | BEGIN +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | arg3 := arg1 + arg2;+| | | | | | | | | | | | | | | | | | | | | | | | | | | | | END; +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (2 rows) postgres=# SELECT pg_function_is_visible(16386); pg_function_is_visible ------------------------ t (1 row) postgres=# SELECT pg_function_is_visible(16389); --Should display t? pg_function_is_visible ------------------------ f (1 row)