create or replace function number_src(text) returns text as ' declare v_src alias for $1; v_pos integer; v_ret text default ''''; v_tmp text; v_cnt integer default -1; begin if v_src is null then return null; end if; v_tmp := v_src; LOOP v_pos := position(''\n'' in v_tmp); v_cnt := v_cnt + 1; exit when v_pos = 0; if v_cnt != 0 then v_ret := v_ret || to_char(v_cnt,''9999'') || '':'' || substr(v_tmp,1,v_pos); end if; v_tmp := substr(v_tmp,v_pos + 1); end LOOP; return v_ret || to_char(v_cnt,''9999'') || '':'' || v_tmp; end;' language 'plpgsql' immutable strict; create or replace function get_func_definition (varchar,oidvector) returns text as ' declare fname alias for $1; args alias for $2; nargs integer default 0; v_pos integer; v_funcdef text default ''''; v_args varchar; v_one_arg varchar; v_one_type varchar; v_nargs integer; v_src text; v_rettype varchar; begin select proargtypes, pronargs, number_src(prosrc), (select typname from pg_type where oid = p.prorettype::integer) into v_args, v_nargs, v_src, v_rettype from pg_proc p where proname = fname::name and proargtypes = args; v_funcdef := v_funcdef || '' create or replace function '' || fname || ''(''; v_pos := position('' '' in v_args); while nargs < v_nargs loop nargs := nargs + 1; if nargs = v_nargs then v_one_arg := v_args; v_args := ''''; else v_one_arg := substr(v_args, 1, v_pos \- 1); v_args := substr(v_args, v_pos + 1); v_pos := position('' '' in v_args); end if; select case when nargs = 1 then typname else '','' || typname end into v_one_type from pg_type where oid = v_one_arg::integer; v_funcdef := v_funcdef || v_one_type; end loop; v_funcdef := v_funcdef || '') returns '' || v_rettype || '' as \\\'\\n'' || v_src || ''\\\' language \\\'plpgsql\\\';''; return v_funcdef; end;' language 'plpgsql' stable strict;