How to display the function, procedure, triggers source code in postgresql?

Postgresql

Postgresql Problem Overview


How to print functions and triggers sourcecode in postgresql? please let me know if any one know the query to display the function, triggers source code.

Postgresql Solutions


Solution 1 - Postgresql

\df+ in psql gives you the sourcecode.

Solution 2 - Postgresql

For function:

you can query the pg_proc view , just as the following

select proname,prosrc from pg_proc where proname= your_function_name; 

Another way is that just execute the commont \df and \ef which can list the functions.

skytf=> \df           
                                             List of functions
 Schema |         Name         | Result data type |              Argument data types               |  Type  
--------+----------------------+------------------+------------------------------------------------+--------
 public | pg_buffercache_pages | SETOF record     |                                                | normal


skytf=> \ef  pg_buffercache_pages

It will show the source code of the function.

For triggers:

I dont't know if there is a direct way to get the source code. Just know the following way, may be it will help you!

  • step 1 : Get the table oid of the trigger:
    skytf=> select tgrelid from pg_trigger  where tgname='insert_tbl_tmp_trigger';
    tgrelid

    26599
    
    (1 row)
  • step 2: Get the table name of the above oid !

skytf=> select oid,relname  from pg_class where oid=26599;
oid  |           relname
-------+----------------------------- 26599 | tbl_tmp (1 row)

  • step 3: list the table information

skytf=> \d tbl_tmp
It will show you the details of the trigger of the table . Usually a trigger uses a function. So you can get the source code of the trigger function just as the above that I pointed out !

Solution 3 - Postgresql

Here are few examples from PostgreSQL-9.5

Display list:

  1. Functions: \df+
  2. Triggers : \dy+

Display Definition:

postgres=# \sf
function name is required

postgres=# \sf pg_reload_conf()
CREATE OR REPLACE FUNCTION pg_catalog.pg_reload_conf()
 RETURNS boolean
 LANGUAGE internal
 STRICT
AS $function$pg_reload_conf$function$

postgres=# \sf pg_encoding_to_char
CREATE OR REPLACE FUNCTION pg_catalog.pg_encoding_to_char(integer)
 RETURNS name
 LANGUAGE internal
 STABLE STRICT
AS $function$PG_encoding_to_char$function$

Solution 4 - Postgresql

There are many possibilities. Simplest way is to just use pgAdmin and get this from SQL window. However if you want to get this programmatically then examinate pg_proc and pg_trigger system catalogs or routines and triggers views from information schema (that's SQL standard way, but it might not cover all features especially PostgreSQL-specific). For example:

SELECT
	routine_definition 
FROM
	information_schema.routines 
WHERE
	specific_schema LIKE 'public'
	AND routine_name LIKE 'functionName';

Solution 5 - Postgresql

Slightly more than just displaying the function, how about getting the edit in-place facility as well.

\ef <function_name> is very handy. It will open the source code of the function in editable format. You will not only be able to view it, you can edit and execute it as well.

Just \ef without function_name will open editable CREATE FUNCTION template.

For further reference -> https://www.postgresql.org/docs/9.6/static/app-psql.html

Solution 6 - Postgresql

\sf function_name in psql yields editable source code of a single function.

From https://www.postgresql.org/docs/9.6/static/app-psql.html:

> \sf[+] function_description This command fetches and shows the definition of the named function, in the form of a CREATE OR REPLACE FUNCTION command.

> If + is appended to the command name, then the output lines are numbered, with the first line of the function body being line 1.

Solution 7 - Postgresql

additionally to @franc's answer you can use this from sql interface:

select 
	prosrc
from pg_trigger, pg_proc
where
 pg_proc.oid=pg_trigger.tgfoid
 and pg_trigger.tgname like '<name>'

(taken from here: http://www.postgresql.org/message-id/Pine.BSF.4.10.10009140858080.28013-100000@megazone23.bigpanda.com)

Solution 8 - Postgresql

Since Version: psql (9.6.17, server 11.6)

I have tried all of above answer but For me

postgres=> \sf jsonb_extract_path_text
CREATE OR REPLACE FUNCTION pg_catalog.jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[])
 RETURNS text
 LANGUAGE internal
 IMMUTABLE PARALLEL SAFE STRICT
AS $function$jsonb_extract_path_text$function$



postgres=> \df+
ERROR:  column p.proisagg does not exist
LINE 6:   WHEN p.proisagg THEN 'agg'
               ^
HINT:  Perhaps you meant to reference the column "p.prolang".

df seems not working for me.

Solution 9 - Postgresql

To list all functions:

select n.nspname as function_schema,
       p.proname as function_name,
       l.lanname as function_language,
       case when l.lanname = 'internal' then p.prosrc
            else pg_get_functiondef(p.oid)
            end as definition,
       pg_get_function_arguments(p.oid) as function_arguments,
       t.typname as return_type
from pg_proc p
left join pg_namespace n on p.pronamespace = n.oid
left join pg_language l on p.prolang = l.oid
left join pg_type t on t.oid = p.prorettype 
where n.nspname not in ('pg_catalog', 'information_schema')
order by function_schema,
    	     function_name;

Now if you want to search a specific word or text in all function is something like that, make sure you replace your text in the function:

with tbl as (
select n.nspname as function_schema,
       p.proname as function_name,
       l.lanname as function_language,
       case when l.lanname = 'internal' then p.prosrc
            else pg_get_functiondef(p.oid)
            end as definition,
       pg_get_function_arguments(p.oid) as function_arguments,
       t.typname as return_type
from pg_proc p
left join pg_namespace n on p.pronamespace = n.oid
left join pg_language l on p.prolang = l.oid
left join pg_type t on t.oid = p.prorettype 
where n.nspname not in ('pg_catalog', 'information_schema')
)
	select *
	from tbl
	where definition ilike '%word or text you want to search%'
	order by function_schema,
    	     function_name;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionganeshView Question on Stackoverflow
Solution 1 - PostgresqlMateusz GrotekView Answer on Stackoverflow
Solution 2 - PostgresqlfrancsView Answer on Stackoverflow
Solution 3 - PostgresqlSathishView Answer on Stackoverflow
Solution 4 - PostgresqlGrzegorz SzpetkowskiView Answer on Stackoverflow
Solution 5 - PostgresqlmythicalcoderView Answer on Stackoverflow
Solution 6 - PostgresqlSergey TarasovView Answer on Stackoverflow
Solution 7 - PostgresqlAndreas CovidiotView Answer on Stackoverflow
Solution 8 - PostgresqlRavi ParekhView Answer on Stackoverflow
Solution 9 - PostgresqlBlackcrossView Answer on Stackoverflow