Please find the attached updated patch with PEP8 fixes.

On Wed, Jul 11, 2018 at 11:18 AM, Khushboo Vashi <
khushboo.va...@enterprisedb.com> wrote:

> 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..ba70393
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/test_package_edbfuncs_get.py
@@ -0,0 +1,138 @@
+##########################################################################
+#
+# 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