--test create function/procedure definer=user 
--grammar test
\c  mysqltest
create schema mysqlschema;
grant ALL  on SCHEMA mysqlschema to PUBLIC;
CREATE  DEFINER=testusr1 FUNCTION testfunc_definer1(integer, integer) RETURNS integer SECURITY DEFINER
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
ERROR:  role "testusr1" does not exist
CREATE  OR REPLACE DEFINER=testusr1 FUNCTION func_definer2(integer, integer) RETURNS integer SECURITY DEFINER
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
ERROR:  not support DEFINER function at or near ";"
LINE 5: RETURNS NULL ON NULL INPUT;
                                  ^
CREATE DEFINER=testusr1 procedure proc_definer1() SECURITY DEFINER
AS
BEGIN
   raise info 'create definer procedure.';
END;
/
ERROR:  role "testusr1" does not exist
CREATE OR REPLACE DEFINER=testusr1 procedure proc_definer2()  SECURITY DEFINER
AS 
BEGIN
   raise info 'create definer procedure.';
END;
/
ERROR:  not support DEFINER function at or near ";"
LINE 5: END;
           ^
	
CREATE USER testusr1 password '12345@abc';
CREATE  DEFINER=testusr1 FUNCTION func_definer1(integer, integer) RETURNS integer SECURITY INVOKER
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
CREATE DEFINER=testusr1 procedure proc_definer1() 
AS 
BEGIN
   raise info 'create definer procedure.';
END;
/
--test \sf 
\sf func_definer1
CREATE DEFINER = testusr1 FUNCTION public.func_definer1(integer, integer)
 RETURNS integer
 LANGUAGE sql
 IMMUTABLE STRICT NOT FENCED NOT SHIPPABLE
AS $function$select $1 + $2;$function$;
\sf  proc_definer1
CREATE DEFINER = testusr1 PROCEDURE public.proc_definer1()
AS  DECLARE BEGIN
   raise info 'create definer procedure.';
END;
/
--test create or replace function or procedure 
select usename from pg_user where  usesysid = (select proowner from pg_proc where proname='proc_definer1'); 
 usename  
----------
 testusr1
(1 row)

CREATE or replace procedure proc_definer1()
AS 
BEGIN
   raise info 'create definer procedure.';
END;
/
select usename from pg_user where  usesysid = (select proowner from pg_proc where proname='proc_definer1'); 
 usename  
----------
 testusr1
(1 row)

--dump  test
-- dump function
\! @abs_bindir@/gs_dump mysqltest -p @portstring@  -f @abs_bindir@/mysql_function_back.sql --disable-progress
--?gs_dump[port='@portstring@'][test_db].*
--?gs_dump[port='@portstring@'][test_db].*
--?gs_dump[port='@portstring@'][test_db].*
--?gs_dump[port='@portstring@'][test_db].*
--?gs_dump[port='@portstring@'][test_db].*
--?gs_dump[port='@portstring@'][test_db].*
-- restore data
\! @abs_bindir@/gsql -p @portstring@ -d mysqltestbak -f @abs_bindir@/mysql_function_back.sql
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
--? .*
\c mysqltestbak
\sf proc_definer1
CREATE DEFINER = testusr1 PROCEDURE public.proc_definer1()
AS DECLARE BEGIN
   raise info 'create definer procedure.';
END;
/