Please find the attached updated patch with PEP8 fixes.
On Wed, Jul 11, 2018 at 11:18 AM, Khushboo Vashi <
[email protected]> 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,