I assumed that dblink function were not rolledback, but in the use case below it is. To summarize: Function1 is a dblink call dblink creating a table). Function2 calls function1. Function2 is defined as RETURNS text missing the RETURNS statement. On execution, function2 executes function1 then returns ERROR : Proccess reached end without return. The table from dblink is not created. Anyone has an explanation? Function1: ~~~ CREATE OR REPLACE FUNCTION function1 (_user text,_pwd text) RETURNS text AS $BODY$ DECLARE conn_string text; BEGIN conn_string := FORMAT('port = 5432 host=%1$s dbname=%2$s user=%3$s password=%4$s','host','db',_user,_mdp); DROP TABLE IF EXISTS foo; EXECUTE FORMAT('CREATE TABLE foo AS (SELECT * FROM dblink(''%1$s'',''SELECT * FROM bar'') AS t(id int, _text character varying, geom geometry(point)));',conn_string); RETURN 'foo created'; END; $BODY$; ~~~ Function2 : ~~~ CREATE OR REPLACE FUNCTION function2(_user text,_pwd text) RETURNS text DECLARE conn_string text; BEGIN PERFORM function1(_user,_pwd); END; -- END OF FUNCTION REACHED WITHOUT RETURN $BODY$; ~~~ I understand that function2 is not a working function. What I don't is the fact that function1 (and the dblink within) is rollbacked and would like to understand why.