Hi,

Please find the attached patch to fix #3191 : Debug option is not working.

Issues fixed:

1. EPAS packages' function/procedure does not honour INOUT arguments, it
converts INOUT to OUT.

2.  Packages' functions and procedures are not getting listed in their
respected nodes in some scenarios like procedure having INOUT argument and
function with void return type

3. The Reverse engineering SQL is not correct for Packages'
functions/procedures

4. In case of INOUT argument, debugger asks for mendatory input which
should not.


Thanks,
Khushboo
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
index b1b7521..8f0e712 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
@@ -391,32 +391,13 @@ class EdbFuncView(PGChildNodeView, DataTypeReader):
         proargmodenames = {'i': 'IN', 'o': 'OUT', 'b': 'INOUT',
                            'v': 'VARIADIC', 't': 'TABLE'}
 
-        # The proargtypes doesn't give OUT params, so we need to fetch
-        # those from database explicitly, below code is written for this
-        # purpose.
-        #
-        # proallargtypes gives all the Function's argument including OUT,
-        # but we have not used that column; as the data type of this
-        # column (i.e. oid[]) is not supported by oidvectortypes(oidvector)
-        # function which we have used to fetch the datatypes
-        # of the other parameters.
+        # EPAS explicitly converts OUT to INOUT, So we always have proargtypes
 
         proargmodes_fltrd = copy.deepcopy(proargmodes)
         proargnames_fltrd = []
         cnt = 0
         for m in proargmodes:
-            if m == 'o':  # Out Mode
-                SQL = render_template("/".join([self.sql_template_path,
-                                                'get_out_types.sql']),
-                                      out_arg_oid=proallargtypes[cnt])
-                status, out_arg_type = self.conn.execute_scalar(SQL)
-                if not status:
-                    return internal_server_error(errormsg=out_arg_type)
-
-                # Insert out parameter datatype
-                proargtypes.insert(cnt, out_arg_type)
-                proargdefaultvals.insert(cnt, '')
-            elif m == 'v':  # Variadic Mode
+            if m in ['v', 'o']:  # Out / Variadic Mode
                 proargdefaultvals.insert(cnt, '')
             elif m == 't':  # Table Mode
                 proargmodes_fltrd.remove(m)
@@ -532,8 +513,7 @@ class EdbFuncView(PGChildNodeView, DataTypeReader):
         """
         SQL = render_template(
             "/".join([self.sql_template_path, 'get_body.sql']),
-            scid=scid,
-            pkgid=pkgid)
+            edbfnid=edbfnid)
 
         status, res = self.conn.execute_dict(SQL)
         if not status:
@@ -543,7 +523,7 @@ class EdbFuncView(PGChildNodeView, DataTypeReader):
                 gettext("Could not find the function in the database.")
             )
 
-        body = self.get_inner(res['rows'][0]['pkgbodysrc'])
+        body = res['rows'][0]['funcdef']
 
         if body is None:
             body = ''
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/11_plus/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/11_plus/get_oid.sql
new file mode 100644
index 0000000..8908a27
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/11_plus/get_oid.sql
@@ -0,0 +1,17 @@
+SELECT
+    pr.oid, pr.proname || '(' || COALESCE(pg_catalog
+    .pg_get_function_identity_arguments(pr.oid), '') || ')' as name,
+    lanname, pg_get_userbyid(proowner) as funcowner
+FROM
+    pg_proc pr
+JOIN
+    pg_type typ ON typ.oid=prorettype
+JOIN
+    pg_language lng ON lng.oid=prolang
+JOIN
+    pg_namespace nsp ON nsp.oid=pr.pronamespace
+    AND nsp.nspname={{ nspname|qtLiteral }}
+WHERE
+    pr.prokind IN ('f', 'w')
+    AND typname NOT IN ('trigger', 'event_trigger')
+    AND pr.proname = {{ name|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/11_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/11_plus/properties.sql
new file mode 100644
index 0000000..a0cc7d7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/11_plus/properties.sql
@@ -0,0 +1,27 @@
+SELECT  pg_proc.oid,
+        proname AS name,
+        pronargs,
+        proallargtypes,
+        proargnames AS argnames,
+        pronargdefaults,
+        oidvectortypes(proargtypes) AS proargtypenames,
+        proargdeclaredmodes AS proargmodes,
+        proargnames,
+        pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals,
+        pg_get_userbyid(proowner) AS funcowner,
+        pg_get_function_result(pg_proc.oid) AS prorettypename,
+        prosrc,
+        lanname,
+        CASE
+        WHEN proaccess = '+' THEN 'Public'
+        WHEN proaccess = '-' THEN 'Private'
+        ELSE 'Unknown' END AS visibility
+FROM pg_proc, pg_namespace, pg_language lng
+WHERE pr.prokind IN ('f', 'w')
+AND pronamespace = {{pkgid}}::oid
+AND pg_proc.pronamespace = pg_namespace.oid
+AND lng.oid=prolang
+{% if edbfnid %}
+AND pg_proc.oid = {{edbfnid}}::oid
+{% endif %}
+  ORDER BY name
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_body.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_body.sql
deleted file mode 100644
index ad47f2e..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_body.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-SELECT  pg_catalog.edb_get_packagebodydef(nsp.oid) AS pkgbodysrc
-FROM pg_namespace nsp
-LEFT OUTER JOIN pg_description des ON (des.objoid=nsp.oid AND des.classoid='pg_namespace'::regclass)
-WHERE nspparent = {{scid}}::oid
-AND nsp.oid = {{pkgid}}::oid;
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_name.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_name.sql
deleted file mode 100644
index 7410b71..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_name.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-SELECT  proname AS name
-FROM pg_proc
-WHERE oid = {{edbfnid}}::oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_oid.sql
deleted file mode 100644
index 2bc76a2..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_oid.sql
+++ /dev/null
@@ -1,17 +0,0 @@
-SELECT
-    pr.oid, pr.proname || '(' || COALESCE(pg_catalog
-    .pg_get_function_identity_arguments(pr.oid), '') || ')' as name,
-    lanname, pg_get_userbyid(proowner) as funcowner
-FROM
-    pg_proc pr
-JOIN
-    pg_type typ ON typ.oid=prorettype
-JOIN
-    pg_language lng ON lng.oid=prolang
-JOIN
-    pg_namespace nsp ON nsp.oid=pr.pronamespace
-    AND nsp.nspname={{ nspname|qtLiteral }}
-WHERE
-    proisagg = FALSE
-    AND typname NOT IN ('trigger', 'event_trigger')
-    AND pr.proname = {{ name|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_schema.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_schema.sql
deleted file mode 100644
index 127d4b9..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/get_schema.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-SELECT
-    nspname
-FROM
-    pg_namespace
-WHERE
-    oid = {{ scid }}::oid;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/node.sql
deleted file mode 100644
index 44e3456..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/node.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-SELECT  pg_proc.oid,
-        pg_proc.proname || '(' || COALESCE(pg_catalog.pg_get_function_identity_arguments(pg_proc.oid), '') || ')' AS name,
-        pg_get_userbyid(proowner) AS funcowner
-FROM pg_proc, pg_namespace
-WHERE format_type(prorettype, NULL) != 'void'
-{% if fnid %}
-AND pg_proc.oid = {{ fnid|qtLiteral }}
-{% endif %}
-AND pronamespace = {{ pkgid|qtLiteral }}::oid
-AND pg_proc.pronamespace = pg_namespace.oid
-ORDER BY pg_proc.proname
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/properties.sql
deleted file mode 100644
index 6576daf..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/properties.sql
+++ /dev/null
@@ -1,27 +0,0 @@
-SELECT  pg_proc.oid,
-        proname AS name,
-        pronargs,
-        proallargtypes,
-        proargnames AS argnames,
-        pronargdefaults,
-        oidvectortypes(proargtypes) AS proargtypenames,
-        proargmodes,
-        proargnames,
-        pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals,
-        pg_get_userbyid(proowner) AS funcowner,
-        pg_get_function_result(pg_proc.oid) AS prorettypename,
-        prosrc,
-        lanname,
-        CASE
-        WHEN proaccess = '+' THEN 'Public'
-        WHEN proaccess = '-' THEN 'Private'
-        ELSE 'Unknown' END AS visibility
-FROM pg_proc, pg_namespace, pg_language lng
-WHERE format_type(prorettype, NULL) != 'void'
-AND pronamespace = {{pkgid}}::oid
-AND pg_proc.pronamespace = pg_namespace.oid
-AND lng.oid=prolang
-{% if edbfnid %}
-AND pg_proc.oid = {{edbfnid}}::oid
-{% endif %}
-  ORDER BY name
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/stats.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/stats.sql
deleted file mode 100644
index 2e276b6..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.1_plus/stats.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-SELECT
-    calls AS {{ conn|qtIdent(_('Number of calls')) }},
-    total_time AS {{ conn|qtIdent(_('Total time')) }},
-    self_time AS {{ conn|qtIdent(_('Self time')) }}
-FROM
-    pg_stat_user_functions
-WHERE
-    funcid = {{fnid}}::OID
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_body.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_body.sql
deleted file mode 100644
index 72675f4..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_body.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-SELECT  pg_catalog.edb_get_packagebodydef(nsp.oid) AS pkgbodysrc
-FROM pg_namespace nsp
-LEFT OUTER JOIN pg_description des ON (des.objoid=nsp.oid AND des.classoid='pg_namespace'::regclass)
-WHERE nspparent = {{scid}}::oid
-AND nsp.oid = {{pkgid}}::oid
-AND nspobjecttype = 0;
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_name.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_name.sql
deleted file mode 100644
index 7410b71..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_name.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-SELECT  proname AS name
-FROM pg_proc
-WHERE oid = {{edbfnid}}::oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_oid.sql
deleted file mode 100644
index 2bc76a2..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_oid.sql
+++ /dev/null
@@ -1,17 +0,0 @@
-SELECT
-    pr.oid, pr.proname || '(' || COALESCE(pg_catalog
-    .pg_get_function_identity_arguments(pr.oid), '') || ')' as name,
-    lanname, pg_get_userbyid(proowner) as funcowner
-FROM
-    pg_proc pr
-JOIN
-    pg_type typ ON typ.oid=prorettype
-JOIN
-    pg_language lng ON lng.oid=prolang
-JOIN
-    pg_namespace nsp ON nsp.oid=pr.pronamespace
-    AND nsp.nspname={{ nspname|qtLiteral }}
-WHERE
-    proisagg = FALSE
-    AND typname NOT IN ('trigger', 'event_trigger')
-    AND pr.proname = {{ name|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_schema.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_schema.sql
deleted file mode 100644
index 127d4b9..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/get_schema.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-SELECT
-    nspname
-FROM
-    pg_namespace
-WHERE
-    oid = {{ scid }}::oid;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/node.sql
deleted file mode 100644
index 9a58068..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/node.sql
+++ /dev/null
@@ -1,10 +0,0 @@
-SELECT  pg_proc.oid,
-        pg_proc.proname || '(' || COALESCE(pg_catalog.pg_get_function_identity_arguments(pg_proc.oid), '') || ')' AS name,
-        pg_get_userbyid(proowner) AS funcowner
-FROM pg_proc, pg_namespace
-WHERE format_type(prorettype, NULL) != 'void'
-{% if fnid %}
-AND pg_proc.oid = {{ fnid|qtLiteral }}
-{% endif %}
-AND pronamespace = {{pkgid|qtLiteral}}::oid
-AND pg_proc.pronamespace = pg_namespace.oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/properties.sql
deleted file mode 100644
index 6576daf..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/properties.sql
+++ /dev/null
@@ -1,27 +0,0 @@
-SELECT  pg_proc.oid,
-        proname AS name,
-        pronargs,
-        proallargtypes,
-        proargnames AS argnames,
-        pronargdefaults,
-        oidvectortypes(proargtypes) AS proargtypenames,
-        proargmodes,
-        proargnames,
-        pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals,
-        pg_get_userbyid(proowner) AS funcowner,
-        pg_get_function_result(pg_proc.oid) AS prorettypename,
-        prosrc,
-        lanname,
-        CASE
-        WHEN proaccess = '+' THEN 'Public'
-        WHEN proaccess = '-' THEN 'Private'
-        ELSE 'Unknown' END AS visibility
-FROM pg_proc, pg_namespace, pg_language lng
-WHERE format_type(prorettype, NULL) != 'void'
-AND pronamespace = {{pkgid}}::oid
-AND pg_proc.pronamespace = pg_namespace.oid
-AND lng.oid=prolang
-{% if edbfnid %}
-AND pg_proc.oid = {{edbfnid}}::oid
-{% endif %}
-  ORDER BY name
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/stats.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/stats.sql
deleted file mode 100644
index 2e276b6..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/9.2_plus/stats.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-SELECT
-    calls AS {{ conn|qtIdent(_('Number of calls')) }},
-    total_time AS {{ conn|qtIdent(_('Total time')) }},
-    self_time AS {{ conn|qtIdent(_('Self time')) }}
-FROM
-    pg_stat_user_functions
-WHERE
-    funcid = {{fnid}}::OID
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_body.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_body.sql
new file mode 100644
index 0000000..d82e09f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_body.sql
@@ -0,0 +1 @@
+SELECT pg_get_functiondef({{edbfnid}}::oid) AS funcdef;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_name.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_name.sql
new file mode 100644
index 0000000..7410b71
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_name.sql
@@ -0,0 +1,3 @@
+SELECT  proname AS name
+FROM pg_proc
+WHERE oid = {{edbfnid}}::oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_oid.sql
new file mode 100644
index 0000000..2bc76a2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_oid.sql
@@ -0,0 +1,17 @@
+SELECT
+    pr.oid, pr.proname || '(' || COALESCE(pg_catalog
+    .pg_get_function_identity_arguments(pr.oid), '') || ')' as name,
+    lanname, pg_get_userbyid(proowner) as funcowner
+FROM
+    pg_proc pr
+JOIN
+    pg_type typ ON typ.oid=prorettype
+JOIN
+    pg_language lng ON lng.oid=prolang
+JOIN
+    pg_namespace nsp ON nsp.oid=pr.pronamespace
+    AND nsp.nspname={{ nspname|qtLiteral }}
+WHERE
+    proisagg = FALSE
+    AND typname NOT IN ('trigger', 'event_trigger')
+    AND pr.proname = {{ name|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_schema.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_schema.sql
new file mode 100644
index 0000000..127d4b9
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/get_schema.sql
@@ -0,0 +1,6 @@
+SELECT
+    nspname
+FROM
+    pg_namespace
+WHERE
+    oid = {{ scid }}::oid;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/node.sql
new file mode 100644
index 0000000..a7d00be
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/node.sql
@@ -0,0 +1,10 @@
+SELECT  pg_proc.oid,
+        pg_proc.proname || '(' || COALESCE(pg_catalog.pg_get_function_identity_arguments(pg_proc.oid), '') || ')' AS name,
+        pg_get_userbyid(proowner) AS funcowner
+FROM pg_proc, pg_namespace
+WHERE protype = '0'::char
+{% if fnid %}
+AND pg_proc.oid = {{ fnid|qtLiteral }}
+{% endif %}
+AND pronamespace = {{pkgid|qtLiteral}}::oid
+AND pg_proc.pronamespace = pg_namespace.oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/properties.sql
new file mode 100644
index 0000000..dcc540d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/properties.sql
@@ -0,0 +1,27 @@
+SELECT  pg_proc.oid,
+        proname AS name,
+        pronargs,
+        proallargtypes,
+        proargnames AS argnames,
+        pronargdefaults,
+        oidvectortypes(proargtypes) AS proargtypenames,
+        proargdeclaredmodes AS proargmodes,
+        proargnames,
+        pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals,
+        pg_get_userbyid(proowner) AS funcowner,
+        pg_get_function_result(pg_proc.oid) AS prorettypename,
+        prosrc,
+        lanname,
+        CASE
+        WHEN proaccess = '+' THEN 'Public'
+        WHEN proaccess = '-' THEN 'Private'
+        ELSE 'Unknown' END AS visibility
+FROM pg_proc, pg_namespace, pg_language lng
+WHERE protype = '0'::char
+AND pronamespace = {{pkgid}}::oid
+AND pg_proc.pronamespace = pg_namespace.oid
+AND lng.oid=prolang
+{% if edbfnid %}
+AND pg_proc.oid = {{edbfnid}}::oid
+{% endif %}
+  ORDER BY name
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/stats.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/stats.sql
new file mode 100644
index 0000000..2e276b6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/ppas/default/stats.sql
@@ -0,0 +1,8 @@
+SELECT
+    calls AS {{ conn|qtIdent(_('Number of calls')) }},
+    total_time AS {{ conn|qtIdent(_('Total time')) }},
+    self_time AS {{ conn|qtIdent(_('Self time')) }}
+FROM
+    pg_stat_user_functions
+WHERE
+    funcid = {{fnid}}::OID
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/11_plus/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/11_plus/get_oid.sql
new file mode 100644
index 0000000..acd5069
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/11_plus/get_oid.sql
@@ -0,0 +1,17 @@
+SELECT
+    pr.oid, pr.proname || '(' || COALESCE(pg_catalog
+    .pg_get_function_identity_arguments(pr.oid), '') || ')' as name,
+    lanname, pg_get_userbyid(proowner) as funcowner
+FROM
+    pg_proc pr
+JOIN
+    pg_type typ ON typ.oid=prorettype
+JOIN
+    pg_language lng ON lng.oid=prolang
+JOIN
+    pg_namespace nsp ON nsp.oid=pr.pronamespace
+    AND nsp.nspname={{ nspname|qtLiteral }}
+WHERE
+    pr.prokind = 'p'
+    AND typname NOT IN ('trigger', 'event_trigger')
+    AND pr.proname = {{ name|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/11_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/11_plus/properties.sql
new file mode 100644
index 0000000..3f6f671
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/11_plus/properties.sql
@@ -0,0 +1,27 @@
+SELECT  pg_proc.oid,
+        proname AS name,
+        pronargs,
+        proallargtypes,
+        proargnames AS argnames,
+        pronargdefaults,
+        oidvectortypes(proargtypes) AS proargtypenames,
+        proargdeclaredmodes AS proargmodes,
+        proargnames,
+        pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals,
+        pg_get_userbyid(proowner) AS funcowner,
+        pg_get_function_result(pg_proc.oid) AS prorettypename,
+        prosrc,
+        lanname,
+        CASE
+        WHEN proaccess = '+' THEN 'Public'
+        WHEN proaccess = '-' THEN 'Private'
+        ELSE 'Unknown' END AS visibility
+FROM pg_proc, pg_namespace, pg_language lng
+WHERE pr.prokind = 'p'
+AND pronamespace = {{pkgid}}::oid
+AND pg_proc.pronamespace = pg_namespace.oid
+AND lng.oid=prolang
+{% if edbfnid %}
+AND pg_proc.oid = {{edbfnid}}::oid
+{% endif %}
+  ORDER BY name
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_body.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_body.sql
deleted file mode 100644
index ad47f2e..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_body.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-SELECT  pg_catalog.edb_get_packagebodydef(nsp.oid) AS pkgbodysrc
-FROM pg_namespace nsp
-LEFT OUTER JOIN pg_description des ON (des.objoid=nsp.oid AND des.classoid='pg_namespace'::regclass)
-WHERE nspparent = {{scid}}::oid
-AND nsp.oid = {{pkgid}}::oid;
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_name.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_name.sql
deleted file mode 100644
index 7410b71..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_name.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-SELECT  proname AS name
-FROM pg_proc
-WHERE oid = {{edbfnid}}::oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_oid.sql
deleted file mode 100644
index 2bc76a2..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_oid.sql
+++ /dev/null
@@ -1,17 +0,0 @@
-SELECT
-    pr.oid, pr.proname || '(' || COALESCE(pg_catalog
-    .pg_get_function_identity_arguments(pr.oid), '') || ')' as name,
-    lanname, pg_get_userbyid(proowner) as funcowner
-FROM
-    pg_proc pr
-JOIN
-    pg_type typ ON typ.oid=prorettype
-JOIN
-    pg_language lng ON lng.oid=prolang
-JOIN
-    pg_namespace nsp ON nsp.oid=pr.pronamespace
-    AND nsp.nspname={{ nspname|qtLiteral }}
-WHERE
-    proisagg = FALSE
-    AND typname NOT IN ('trigger', 'event_trigger')
-    AND pr.proname = {{ name|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_schema.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_schema.sql
deleted file mode 100644
index 127d4b9..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/get_schema.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-SELECT
-    nspname
-FROM
-    pg_namespace
-WHERE
-    oid = {{ scid }}::oid;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/node.sql
deleted file mode 100644
index 4d2a0df..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/node.sql
+++ /dev/null
@@ -1,10 +0,0 @@
-SELECT  pg_proc.oid,
-        pg_proc.proname || '(' || COALESCE(pg_catalog.pg_get_function_identity_arguments(pg_proc.oid), '') || ')' AS name,
-        pg_get_userbyid(proowner) AS funcowner
-FROM pg_proc, pg_namespace
-WHERE format_type(prorettype, NULL) = 'void'
-{% if fnid %}
-AND pg_proc.oid = {{ fnid|qtLiteral }}
-{% endif %}
-AND pronamespace = {{pkgid|qtLiteral}}::oid
-AND pg_proc.pronamespace = pg_namespace.oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/properties.sql
deleted file mode 100644
index 0677233..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/properties.sql
+++ /dev/null
@@ -1,27 +0,0 @@
-SELECT  pg_proc.oid,
-        proname AS name,
-        pronargs,
-        proallargtypes,
-        proargnames AS argnames,
-        pronargdefaults,
-        oidvectortypes(proargtypes) AS proargtypenames,
-        proargmodes,
-        proargnames,
-        pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals,
-        pg_get_userbyid(proowner) AS funcowner,
-        pg_get_function_result(pg_proc.oid) AS prorettypename,
-        prosrc,
-        lanname,
-        CASE
-        WHEN proaccess = '+' THEN 'Public'
-        WHEN proaccess = '-' THEN 'Private'
-        ELSE 'Unknown' END AS visibility
-FROM pg_proc, pg_namespace, pg_language lng
-WHERE format_type(prorettype, NULL) = 'void'
-AND pronamespace = {{pkgid}}::oid
-AND pg_proc.pronamespace = pg_namespace.oid
-AND lng.oid=prolang
-{% if edbfnid %}
-AND pg_proc.oid = {{edbfnid}}::oid
-{% endif %}
-  ORDER BY name
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/stats.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/stats.sql
deleted file mode 100644
index 2e276b6..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.1_plus/stats.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-SELECT
-    calls AS {{ conn|qtIdent(_('Number of calls')) }},
-    total_time AS {{ conn|qtIdent(_('Total time')) }},
-    self_time AS {{ conn|qtIdent(_('Self time')) }}
-FROM
-    pg_stat_user_functions
-WHERE
-    funcid = {{fnid}}::OID
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_body.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_body.sql
deleted file mode 100644
index 72675f4..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_body.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-SELECT  pg_catalog.edb_get_packagebodydef(nsp.oid) AS pkgbodysrc
-FROM pg_namespace nsp
-LEFT OUTER JOIN pg_description des ON (des.objoid=nsp.oid AND des.classoid='pg_namespace'::regclass)
-WHERE nspparent = {{scid}}::oid
-AND nsp.oid = {{pkgid}}::oid
-AND nspobjecttype = 0;
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_name.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_name.sql
deleted file mode 100644
index 7410b71..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_name.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-SELECT  proname AS name
-FROM pg_proc
-WHERE oid = {{edbfnid}}::oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_oid.sql
deleted file mode 100644
index 2bc76a2..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_oid.sql
+++ /dev/null
@@ -1,17 +0,0 @@
-SELECT
-    pr.oid, pr.proname || '(' || COALESCE(pg_catalog
-    .pg_get_function_identity_arguments(pr.oid), '') || ')' as name,
-    lanname, pg_get_userbyid(proowner) as funcowner
-FROM
-    pg_proc pr
-JOIN
-    pg_type typ ON typ.oid=prorettype
-JOIN
-    pg_language lng ON lng.oid=prolang
-JOIN
-    pg_namespace nsp ON nsp.oid=pr.pronamespace
-    AND nsp.nspname={{ nspname|qtLiteral }}
-WHERE
-    proisagg = FALSE
-    AND typname NOT IN ('trigger', 'event_trigger')
-    AND pr.proname = {{ name|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_schema.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_schema.sql
deleted file mode 100644
index 127d4b9..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/get_schema.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-SELECT
-    nspname
-FROM
-    pg_namespace
-WHERE
-    oid = {{ scid }}::oid;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/node.sql
deleted file mode 100644
index 4d2a0df..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/node.sql
+++ /dev/null
@@ -1,10 +0,0 @@
-SELECT  pg_proc.oid,
-        pg_proc.proname || '(' || COALESCE(pg_catalog.pg_get_function_identity_arguments(pg_proc.oid), '') || ')' AS name,
-        pg_get_userbyid(proowner) AS funcowner
-FROM pg_proc, pg_namespace
-WHERE format_type(prorettype, NULL) = 'void'
-{% if fnid %}
-AND pg_proc.oid = {{ fnid|qtLiteral }}
-{% endif %}
-AND pronamespace = {{pkgid|qtLiteral}}::oid
-AND pg_proc.pronamespace = pg_namespace.oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/properties.sql
deleted file mode 100644
index 0677233..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/properties.sql
+++ /dev/null
@@ -1,27 +0,0 @@
-SELECT  pg_proc.oid,
-        proname AS name,
-        pronargs,
-        proallargtypes,
-        proargnames AS argnames,
-        pronargdefaults,
-        oidvectortypes(proargtypes) AS proargtypenames,
-        proargmodes,
-        proargnames,
-        pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals,
-        pg_get_userbyid(proowner) AS funcowner,
-        pg_get_function_result(pg_proc.oid) AS prorettypename,
-        prosrc,
-        lanname,
-        CASE
-        WHEN proaccess = '+' THEN 'Public'
-        WHEN proaccess = '-' THEN 'Private'
-        ELSE 'Unknown' END AS visibility
-FROM pg_proc, pg_namespace, pg_language lng
-WHERE format_type(prorettype, NULL) = 'void'
-AND pronamespace = {{pkgid}}::oid
-AND pg_proc.pronamespace = pg_namespace.oid
-AND lng.oid=prolang
-{% if edbfnid %}
-AND pg_proc.oid = {{edbfnid}}::oid
-{% endif %}
-  ORDER BY name
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/stats.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/stats.sql
deleted file mode 100644
index 2e276b6..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/9.2_plus/stats.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-SELECT
-    calls AS {{ conn|qtIdent(_('Number of calls')) }},
-    total_time AS {{ conn|qtIdent(_('Total time')) }},
-    self_time AS {{ conn|qtIdent(_('Self time')) }}
-FROM
-    pg_stat_user_functions
-WHERE
-    funcid = {{fnid}}::OID
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_body.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_body.sql
new file mode 100644
index 0000000..d82e09f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_body.sql
@@ -0,0 +1 @@
+SELECT pg_get_functiondef({{edbfnid}}::oid) AS funcdef;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_name.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_name.sql
new file mode 100644
index 0000000..7410b71
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_name.sql
@@ -0,0 +1,3 @@
+SELECT  proname AS name
+FROM pg_proc
+WHERE oid = {{edbfnid}}::oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_oid.sql
new file mode 100644
index 0000000..2bc76a2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_oid.sql
@@ -0,0 +1,17 @@
+SELECT
+    pr.oid, pr.proname || '(' || COALESCE(pg_catalog
+    .pg_get_function_identity_arguments(pr.oid), '') || ')' as name,
+    lanname, pg_get_userbyid(proowner) as funcowner
+FROM
+    pg_proc pr
+JOIN
+    pg_type typ ON typ.oid=prorettype
+JOIN
+    pg_language lng ON lng.oid=prolang
+JOIN
+    pg_namespace nsp ON nsp.oid=pr.pronamespace
+    AND nsp.nspname={{ nspname|qtLiteral }}
+WHERE
+    proisagg = FALSE
+    AND typname NOT IN ('trigger', 'event_trigger')
+    AND pr.proname = {{ name|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_schema.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_schema.sql
new file mode 100644
index 0000000..127d4b9
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/get_schema.sql
@@ -0,0 +1,6 @@
+SELECT
+    nspname
+FROM
+    pg_namespace
+WHERE
+    oid = {{ scid }}::oid;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/node.sql
new file mode 100644
index 0000000..4aabd45
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/node.sql
@@ -0,0 +1,10 @@
+SELECT  pg_proc.oid,
+        pg_proc.proname || '(' || COALESCE(pg_catalog.pg_get_function_identity_arguments(pg_proc.oid), '') || ')' AS name,
+        pg_get_userbyid(proowner) AS funcowner
+FROM pg_proc, pg_namespace
+WHERE protype = '1'::char
+{% if fnid %}
+AND pg_proc.oid = {{ fnid|qtLiteral }}
+{% endif %}
+AND pronamespace = {{pkgid|qtLiteral}}::oid
+AND pg_proc.pronamespace = pg_namespace.oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/properties.sql
new file mode 100644
index 0000000..fb90c34
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/properties.sql
@@ -0,0 +1,27 @@
+SELECT  pg_proc.oid,
+        proname AS name,
+        pronargs,
+        proallargtypes,
+        proargnames AS argnames,
+        pronargdefaults,
+        oidvectortypes(proargtypes) AS proargtypenames,
+        proargmodes,
+        proargnames,
+        pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals,
+        pg_get_userbyid(proowner) AS funcowner,
+        pg_get_function_result(pg_proc.oid) AS prorettypename,
+        prosrc,
+        lanname,
+        CASE
+        WHEN proaccess = '+' THEN 'Public'
+        WHEN proaccess = '-' THEN 'Private'
+        ELSE 'Unknown' END AS visibility
+FROM pg_proc, pg_namespace, pg_language lng
+WHERE protype = '1'::char
+AND pronamespace = {{pkgid}}::oid
+AND pg_proc.pronamespace = pg_namespace.oid
+AND lng.oid=prolang
+{% if edbfnid %}
+AND pg_proc.oid = {{edbfnid}}::oid
+{% endif %}
+  ORDER BY name
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/stats.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/stats.sql
new file mode 100644
index 0000000..2e276b6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/ppas/default/stats.sql
@@ -0,0 +1,8 @@
+SELECT
+    calls AS {{ conn|qtIdent(_('Number of calls')) }},
+    total_time AS {{ conn|qtIdent(_('Total time')) }},
+    self_time AS {{ conn|qtIdent(_('Self time')) }}
+FROM
+    pg_stat_user_functions
+WHERE
+    funcid = {{fnid}}::OID
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/__init__.py
new file mode 100644
index 0000000..c895db1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2018, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class PackageEDBFuncsTestGenerator(BaseTestGenerator):
+
+    def runTest(self):
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/test_package_edbfuncs_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/test_package_edbfuncs_get.py
new file mode 100644
index 0000000..a78f53f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/test_package_edbfuncs_get.py
@@ -0,0 +1,134 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2018, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import uuid
+import json
+from pgadmin.browser.server_groups.servers.databases.schemas.tests import \
+    utils as schema_utils
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+    database_utils
+from pgadmin.utils import server_utils as server_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression import parent_node_dict
+from regression.python_test_utils import test_utils as utils
+
+
+class PackageEDBFuncsGetTestCase(BaseTestGenerator):
+    """ This class will fetch functions/procedures of package
+     under test schema. """
+    skip_on_database = ['gpdb', 'pg']
+
+    scenarios = [
+        # Fetching default URL for package node.
+        ('Fetch Package Functions/Procedures URL', dict(
+            url='/browser/{0}/nodes/'))
+    ]
+
+    def setUp(self):
+        super(PackageEDBFuncsGetTestCase, self).setUp()
+        schema_info = parent_node_dict["schema"][-1]
+        self.schema_id = schema_info["schema_id"]
+        self.schema_name = schema_info["schema_name"]
+        self.db_name = parent_node_dict["database"][-1]["db_name"]
+        self.pkg_name = "pkg_%s" % str(uuid.uuid4())[1:8]
+        self.proc_name = "proc_%s" % str(uuid.uuid4())[1:8]
+        self.func_name = "func_%s" % str(uuid.uuid4())[1:8]
+        self.server_id = schema_info["server_id"]
+        self.db_id = schema_info["db_id"]
+        server_con = server_utils.connect_server(self, self.server_id)
+
+        connection = utils.get_db_connection(self.db_name,
+                                             self.server['username'],
+                                             self.server['db_password'],
+                                             self.server['host'],
+                                             self.server['port'],
+                                             self.server['sslmode'])
+        pg_cursor = connection.cursor()
+        query = """
+        CREATE OR REPLACE PACKAGE %s.%s
+IS
+    emp_name character varying(10);
+    PROCEDURE %s(INOUT p_empno numeric);
+    FUNCTION %s() RETURN integer;
+END %s;
+
+
+CREATE OR REPLACE PACKAGE BODY %s.%s
+IS
+    v_counter integer;
+    PROCEDURE %s(INOUT p_empno numeric) IS
+    BEGIN
+        SELECT ename INTO emp_name FROM emp WHERE empno = p_empno;
+        v_counter := v_counter + 1;
+    END;
+    FUNCTION %s() RETURN integer IS
+    BEGIN
+        RETURN v_counter;
+    END;
+END %s;""" % (self.schema_name, self.pkg_name, self.proc_name,
+               self.func_name, self.pkg_name,
+               self.schema_name, self.pkg_name,
+               self.proc_name, self.func_name, self.pkg_name)
+
+        pg_cursor.execute(query)
+        connection.commit()
+        # Get 'oid' from newly created package
+        pg_cursor.execute("SELECT oid FROM pg_namespace WHERE nspname='%s'" %
+                          self.pkg_name)
+        self.package_id = pg_cursor.fetchone()[0]
+        connection.close()
+
+    def runTest(self):
+        db_con = database_utils.connect_database(self,
+                                                 utils.SERVER_GROUP,
+                                                 self.server_id,
+                                                 self.db_id)
+
+        if not db_con["info"] == "Database connected.":
+            raise Exception("Could not connect to database.")
+
+        schema_response = schema_utils.verify_schemas(self.server,
+                                                      self.db_name,
+                                                      self.schema_name)
+        if not schema_response:
+            raise Exception("Could not find the schema.")
+
+        # Fetch Package function
+        url = self.url.format('edbfunc') + str(utils.SERVER_GROUP) + '/' +\
+              str(self.server_id) + '/' + str(self.db_id) + '/' +\
+              str(self.schema_id) + '/' +str(self.package_id) + "/"
+        response = self.tester.get(url,
+                                   content_type='html/json')
+
+        response_data = json.loads(response.data.decode('utf-8'))
+
+        self.assertEquals(response.status_code, 200)
+        self.assertEquals(len(response_data['data']), 1)
+        self.assertEquals(response_data['data'][0]['label'], self.func_name + '()')
+        self.assertEquals(response_data['data'][0]['_type'], 'edbfunc')
+
+        # Fetch Package procedure
+        url = self.url.format('edbproc') + str(utils.SERVER_GROUP) + '/' +\
+              str(self.server_id) + '/' + str(self.db_id) + '/' + \
+              str(self.schema_id) + '/' + str(self.package_id) + "/"
+        response = self.tester.get(url,
+                                   content_type='html/json')
+
+        response_data = json.loads(response.data.decode('utf-8'))
+
+        self.assertEquals(response.status_code, 200)
+        self.assertEquals(len(response_data['data']), 1)
+        self.assertIn(self.proc_name, response_data['data'][0]['label'])
+        self.assertIn("INOUT", response_data['data'][0]['label'])
+        self.assertEquals(response_data['data'][0]['_type'], 'edbproc')
+
+    def tearDown(self):
+        """This function disconnect the test database."""
+        database_utils.disconnect_database(self, self.server_id,
+                                           self.db_id)
diff --git a/web/pgadmin/tools/debugger/templates/debugger/sql/get_function_debug_info.sql b/web/pgadmin/tools/debugger/templates/debugger/sql/get_function_debug_info.sql
index 2807cad..64195b5 100644
--- a/web/pgadmin/tools/debugger/templates/debugger/sql/get_function_debug_info.sql
+++ b/web/pgadmin/tools/debugger/templates/debugger/sql/get_function_debug_info.sql
@@ -26,7 +26,11 @@ SELECT
                     pg_catalog.generate_series(0, pg_catalog.array_upper(proargtypes, 1)) s(i)), ',')
         END AS proargtypes,
     pg_catalog.array_to_string(p.proargnames, ',') AS proargnames,
+    {% if is_ppas_database %}
+    pg_catalog.array_to_string(proargdeclaredmodes, ',') AS proargmodes,
+    {% else %}
     pg_catalog.array_to_string(proargmodes, ',') AS proargmodes,
+    {% endif %}
 
     {% if is_ppas_database %}
         CASE WHEN n.nspparent <> 0 THEN n.oid ELSE 0 END AS pkg,

Reply via email to