diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py index 7b2ba2d..65a906c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py @@ -257,8 +257,13 @@ class FunctionView(PGChildNodeView, DataTypeReader): req = request.args or request.form if 'fnid' not in kwargs: + req_args = self.required_args + # We need to remove 'prosrc' from the required arguments list + # if language is 'c'. + if req['lanname'] == 'c' and 'prosrc' in req_args: + req_args.remove('prosrc') - for arg in self.required_args: + for arg in req_args: if (arg not in req or req[arg] == '') or \ (arg == 'probin' and req['lanname'] == 'c' and (arg not in req or req[arg] == '')): @@ -1153,12 +1158,14 @@ class FunctionView(PGChildNodeView, DataTypeReader): old_data['pronamespace'] ) - if 'provolatile' in old_data: + if 'provolatile' in old_data and \ + old_data['provolatile'] is not None: old_data['provolatile'] = vol_dict[old_data['provolatile']] - if 'proparallel' in old_data: - old_data['proparallel'] = parallel_dict[ - old_data['proparallel']] + if 'proparallel' in old_data and \ + old_data['proparallel'] is not None: + old_data['proparallel'] = \ + parallel_dict[old_data['proparallel']] # If any of the below argument is changed, # then CREATE OR REPLACE SQL statement should be called @@ -1354,6 +1361,17 @@ class FunctionView(PGChildNodeView, DataTypeReader): resp_data.update(parse_variables_from_db([ {"setconfig": resp_data['proconfig']}])) + # Reset Volatile, Cost and Parallel parameter for Procedures + # if language is not 'edbspl' and database server version is + # greater than 10. + if self.manager.sversion >= 110000 \ + and ('prokind' in resp_data and resp_data['prokind'] == 'p') \ + and ('lanname' in resp_data and + resp_data['lanname'] != 'edbspl'): + resp_data['procost'] = None + resp_data['provolatile'] = None + resp_data['proparallel'] = None + return resp_data def _get_schema(self, scid): diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js index c4cd91a..b478870 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js @@ -255,6 +255,7 @@ define('pgadmin.node.function', [ },{ id: 'provolatile', label: gettext('Volatility'), cell: 'string', control: 'node-ajax-options', type: 'text', group: gettext('Options'), + deps: ['lanname'], options:[ {'label': 'VOLATILE', 'value': 'v'}, {'label': 'STABLE', 'value': 's'}, @@ -267,6 +268,7 @@ define('pgadmin.node.function', [ },{ id: 'proisstrict', label: gettext('Strict?'), type: 'switch', group: gettext('Options'), disabled: 'isDisabled', + deps: ['lanname'], options: { 'onText': gettext('Yes'), 'offText': gettext('No'), 'onColor': 'success', 'offColor': 'primary', @@ -283,6 +285,7 @@ define('pgadmin.node.function', [ },{ id: 'proparallel', label: gettext('Parallel'), cell: 'string', control: 'node-ajax-options', type: 'text', group: gettext('Options'), + deps: ['lanname'], options:[ {'label': 'UNSAFE', 'value': 'u'}, {'label': 'RESTRICTED', 'value': 'r'}, @@ -291,7 +294,7 @@ define('pgadmin.node.function', [ select2: {allowClear: false}, },{ id: 'procost', label: gettext('Estimated cost'), group: gettext('Options'), - cell:'string', type: 'text', disabled: 'isDisabled', + cell:'string', type: 'text', disabled: 'isDisabled', deps: ['lanname'], },{ id: 'prorows', label: gettext('Estimated rows'), type: 'text', deps: ['proretset'], visible: 'isVisible', disabled: 'isDisabled', @@ -299,7 +302,7 @@ define('pgadmin.node.function', [ },{ id: 'proleakproof', label: gettext('Leak proof?'), group: gettext('Options'), cell:'boolean', type: 'switch', min_version: 90200, - disabled: 'isDisabled', + disabled: 'isDisabled', deps: ['lanname'], },{ id: 'proacl', label: gettext('Privileges'), type: 'text', mode: ['properties'], group: gettext('Security'), diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js index 0397e64..a721248 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js @@ -105,7 +105,22 @@ define('pgadmin.node.procedure', [ case 'proisstrict': case 'procost': case 'proleakproof': - return (this.node_info.server.version < 90500 || this.node_info.server.server_type != 'ppas'); + if(this.node_info.server.version < 90500 || + this.node_info.server.server_type != 'ppas' || + m.get('lanname') != 'edbspl') { + + setTimeout(function() { + m.set('provolatile', undefined); + m.set('proisstrict', undefined); + m.set('procost', undefined); + m.set('proleakproof', undefined); + }, 10); + return true; + } + else{ + return false; + } + case 'variables': case 'prosecdef': return this.node_info.server.version < 90500; @@ -116,7 +131,17 @@ define('pgadmin.node.procedure', [ case 'proargs': return true; case 'proparallel': - return (this.node_info.server.version < 90600 || this.node_info.server.server_type != 'ppas'); + if (this.node_info.server.version < 90600 || + this.node_info.server.server_type != 'ppas' || + m.get('lanname') != 'edbspl') { + setTimeout(function() { + m.set('proparallel', undefined); + }, 10); + return true; + } + else{ + return false; + } case 'lanname': return this.node_info.server.version < 110000; default: @@ -144,11 +169,24 @@ define('pgadmin.node.procedure', [ errmsg = errmsg || err['lanname']; } - if (_.isUndefined(this.get('prosrc')) || String(this.get('prosrc')).replace(/^\s+|\s+$/g, '') == '') { - err['prosrc'] = gettext('Code cannot be empty.'); - errmsg = errmsg || err['prosrc']; - } + if (String(this.get('lanname')) == 'c') { + if (_.isUndefined(this.get('probin')) || String(this.get('probin')) + .replace(/^\s+|\s+$/g, '') == '') { + err['probin'] = gettext('Object File cannot be empty.'); + errmsg = errmsg || err['probin']; + } + if (_.isUndefined(this.get('prosrc_c')) || String(this.get('prosrc_c')).replace(/^\s+|\s+$/g, '') == '') { + err['prosrc_c'] = gettext('Link Symbol cannot be empty.'); + errmsg = errmsg || err['prosrc_c']; + } + } + else { + if (_.isUndefined(this.get('prosrc')) || String(this.get('prosrc')).replace(/^\s+|\s+$/g, '') == '') { + err['prosrc'] = gettext('Code cannot be empty.'); + errmsg = errmsg || err['prosrc']; + } + } if (seclabels) { var secLabelsErr; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.6_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.6_plus/create.sql index 78cf8f9..652fd2c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.6_plus/create.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.6_plus/create.sql @@ -19,7 +19,7 @@ CREATE{% if query_type is defined %}{{' OR REPLACE'}}{% endif %} FUNCTION {{ con {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %}LEAKPROOF {% endif %} {% if data.proisstrict %}STRICT {% endif %} {% if data.prosecdef %}SECURITY DEFINER {% endif %} -{% if data.proiswindow %}WINDOW{% endif %} +{% if data.proiswindow %}WINDOW {% endif %} {% if data.proparallel and (data.proparallel == 'r' or data.proparallel == 's') %} {% if data.proparallel == 'r' %}PARALLEL RESTRICTED{% elif data.proparallel == 's' %}PARALLEL SAFE{% endif %}{% endif %} {% if data.procost %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/acl.sql new file mode 100644 index 0000000..2e7aae5 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/acl.sql @@ -0,0 +1,35 @@ +SELECT + COALESCE(gt.rolname, 'PUBLIC') AS grantee, + g.rolname AS grantor, array_agg(privilege_type) AS privileges, + array_agg(is_grantable) AS grantable +FROM + (SELECT + d.grantee, d.grantor, d.is_grantable, + CASE d.privilege_type + WHEN 'CONNECT' THEN 'c' + WHEN 'CREATE' THEN 'C' + WHEN 'DELETE' THEN 'd' + WHEN 'EXECUTE' THEN 'X' + WHEN 'INSERT' THEN 'a' + WHEN 'REFERENCES' THEN 'x' + WHEN 'SELECT' THEN 'r' + WHEN 'TEMPORARY' THEN 'T' + WHEN 'TRIGGER' THEN 't' + WHEN 'TRUNCATE' THEN 'D' + WHEN 'UPDATE' THEN 'w' + WHEN 'USAGE' THEN 'U' + ELSE 'UNKNOWN' + END AS privilege_type + FROM + (SELECT + (d).grantee AS grantee, (d).grantor AS grantor, + (d).is_grantable AS is_grantable, + (d).privilege_type AS privilege_type + FROM + (SELECT aclexplode(db.proacl) AS d FROM pg_proc db + WHERE db.oid = {{fnid}}::OID) a + ) d + ) d + LEFT JOIN pg_catalog.pg_roles g ON (d.grantor = g.oid) + LEFT JOIN pg_catalog.pg_roles gt ON (d.grantee = gt.oid) +GROUP BY g.rolname, gt.rolname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/coll_stats.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/coll_stats.sql new file mode 100644 index 0000000..5924679 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/coll_stats.sql @@ -0,0 +1,20 @@ +SELECT + funcname AS {{ conn|qtIdent(_('Name')) }}, + 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 + schemaname = {{schema_name|qtLiteral}} + AND funcid IN ( + SELECT p.oid + FROM + pg_proc p + JOIN + pg_type typ ON typ.oid=p.prorettype + WHERE + p.prokind = 'p'::char + AND typname NOT IN ('trigger', 'event_trigger') + ) +ORDER BY funcname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/create.sql new file mode 100644 index 0000000..3c71640 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/create.sql @@ -0,0 +1,50 @@ +{% import 'macros/functions/security.macros' as SECLABEL %} +{% import 'macros/functions/privilege.macros' as PRIVILEGE %} +{% import 'macros/functions/variable.macros' as VARIABLE %} +{% set is_columns = [] %} +{% if data %} +{% if query_for == 'sql_panel' and func_def is defined %} +CREATE OR REPLACE PROCEDURE {{func_def}} +{% else %} +CREATE OR REPLACE PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}{% if data.arguments is defined %} +({% for p in data.arguments %}{% if p.argmode %}{{p.argmode}} {% endif %}{% if p.argname %}{{ conn|qtIdent(p.argname)}} {% endif %}{% if p.argtype %}{{ conn|qtTypeIdent(p.argtype) }}{% endif %}{% if p.argdefval %} DEFAULT {{p.argdefval}}{% endif %} +{% if not loop.last %}, {% endif %} +{% endfor -%} +{% endif %} +) +{% endif %} +LANGUAGE {{ data.lanname|qtLiteral }} +{% if data.prosecdef %}SECURITY DEFINER {% endif %} +{% if data.variables %}{% for v in data.variables %} + +SET {{ conn|qtIdent(v.name) }}={{ v.value|qtLiteral }}{% endfor -%} +{% endif %} + +AS {% if data.lanname == 'c' %} +{{ data.probin|qtLiteral }}, {{ data.prosrc_c|qtLiteral }} +{% else %} +$BODY${{ data.prosrc }}$BODY${% endif -%}; +{% if data.acl and not is_sql %} +{% for p in data.acl %} + +{{ PRIVILEGE.SET(conn, "PROCEDURE", p.grantee, data.name, p.without_grant, p.with_grant, data.pronamespace, data.func_args_without)}} +{% endfor %}{% endif %} +{% if data.revoke_all %} + +{{ PRIVILEGE.UNSETALL(conn, "PROCEDURE", "PUBLIC", data.name, data.pronamespace, data.func_args_without)}} +{% endif %} +{% if data.description %} + +COMMENT ON PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }} + IS {{ data.description|qtLiteral }}; +{% endif -%} +{% if data.seclabels %} +{% for r in data.seclabels %} +{% if r.label and r.provider %} + +{{ SECLABEL.SET(conn, 'PROCEDURE', data.name, r.provider, r.label, data.pronamespace, data.func_args_without) }} +{% endif %} +{% endfor %} +{% endif -%} + +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/delete.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/delete.sql new file mode 100644 index 0000000..3835410 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/delete.sql @@ -0,0 +1,21 @@ +{% if scid and fnid %} +SELECT + pr.proname as name, '(' || COALESCE(pg_catalog + .pg_get_function_identity_arguments(pr.oid), '') || ')' as func_args, + nspname +FROM + pg_proc pr +JOIN + pg_type typ ON typ.oid=prorettype +JOIN + pg_namespace nsp ON nsp.oid=pr.pronamespace +WHERE + pr.prokind = 'p'::char + AND pronamespace = {{scid}}::oid + AND typname NOT IN ('trigger', 'event_trigger') + AND pr.oid = {{fnid}}; +{% endif %} + +{% if name %} +DROP PROCEDURE {{ conn|qtIdent(nspname, name) }}{{func_args}}{% if cascade %} CASCADE{% endif %}; +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_definition.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_definition.sql new file mode 100644 index 0000000..4c2e9d9 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_definition.sql @@ -0,0 +1,15 @@ +SELECT + pg_get_functiondef({{fnid}}::oid) AS func_def, + COALESCE(pg_catalog.pg_get_function_identity_arguments(pr.oid), '') as + func_with_identity_arguments, + nspname, + pr.proname as proname, + COALESCE(pg_catalog.pg_get_function_arguments(pr.oid), '') as func_args +FROM + pg_proc pr +JOIN + pg_namespace nsp ON nsp.oid=pr.pronamespace +WHERE + pr.prokind = 'p'::char + AND pronamespace = {{scid}}::oid + AND pr.oid = {{fnid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_languages.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_languages.sql new file mode 100644 index 0000000..f81ddfb --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_languages.sql @@ -0,0 +1,4 @@ +SELECT + lanname as label, lanname as value +FROM + pg_language; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_oid.sql new file mode 100644 index 0000000..be98b53 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/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, pr.pronamespace AS nsp +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'::char + AND typname NOT IN ('trigger', 'event_trigger') + AND pr.proname = {{ name|qtLiteral }}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_out_types.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_out_types.sql new file mode 100644 index 0000000..64a1187 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_out_types.sql @@ -0,0 +1,6 @@ +SELECT + format_type(oid, NULL) AS out_arg_type +FROM + pg_type +WHERE + oid = {{ out_arg_oid }}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_schema.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_schema.sql new file mode 100644 index 0000000..127d4b9 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/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/functions/templates/procedure/pg/sql/11_plus/get_types.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_types.sql new file mode 100644 index 0000000..2a5582e --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/get_types.sql @@ -0,0 +1,20 @@ +SELECT + * +FROM + (SELECT + format_type(t.oid,NULL) AS typname, + CASE WHEN typelem > 0 THEN typelem ELSE t.oid END as elemoid, typlen, typtype, t.oid, nspname, + (SELECT COUNT(1) FROM pg_type t2 WHERE t2.typname = t.typname) > 1 AS isdup + FROM + pg_type t + JOIN + pg_namespace nsp ON typnamespace=nsp.oid + WHERE + (NOT (typname = 'unknown' AND nspname = 'pg_catalog')) + AND + ( + typtype IN ('b', 'c', 'd', 'e', 'p', 'r') + AND typname NOT IN ('any', 'trigger', 'language_handler', 'event_trigger') + ) + ) AS dummy +ORDER BY nspname <> 'pg_catalog', nspname <> 'public', nspname, 1; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/node.sql new file mode 100644 index 0000000..89dc768 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/node.sql @@ -0,0 +1,29 @@ +SELECT + pr.oid, + CASE WHEN + pg_catalog.pg_get_function_identity_arguments(pr.oid) <> '' + THEN + pr.proname || '(' || pg_catalog.pg_get_function_identity_arguments(pr.oid) || ')' + ELSE + pr.proname + END AS name, + lanname, pg_get_userbyid(proowner) AS funcowner, description +FROM + pg_proc pr +JOIN + pg_type typ ON typ.oid=prorettype +JOIN + pg_language lng ON lng.oid=prolang +LEFT OUTER JOIN + pg_description des ON (des.objoid=pr.oid AND des.classoid='pg_proc'::regclass) +WHERE + pr.prokind = 'p'::char +{% if fnid %} + AND pr.oid = {{ fnid|qtLiteral }} +{% endif %} +{% if scid %} + AND pronamespace = {{scid}}::oid +{% endif %} + AND typname NOT IN ('trigger', 'event_trigger') +ORDER BY + proname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/properties.sql new file mode 100644 index 0000000..79bea86 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/properties.sql @@ -0,0 +1,39 @@ +SELECT + pr.oid, pr.xmin, pr.*, pr.prosrc AS prosrc_c, + pr.proname AS name, pg_get_function_result(pr.oid) AS prorettypename, + typns.nspname AS typnsp, lanname, proargnames, oidvectortypes(proargtypes) AS proargtypenames, + pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals, + pronargdefaults, proconfig, pg_get_userbyid(proowner) AS funcowner, description, + (CASE WHEN + pg_catalog.pg_get_function_identity_arguments(pr.oid) <> '' + THEN + pr.proname || '(' || pg_catalog.pg_get_function_identity_arguments(pr.oid) || ')' + ELSE + pr.proname + END) AS name_with_args, + (SELECT + array_agg(provider || '=' || label) + FROM + pg_seclabel sl1 + WHERE + sl1.objoid=pr.oid) AS seclabels +FROM + pg_proc pr +JOIN + pg_type typ ON typ.oid=prorettype +JOIN + pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_language lng ON lng.oid=prolang +LEFT OUTER JOIN + pg_description des ON (des.objoid=pr.oid AND des.classoid='pg_proc'::regclass) +WHERE + pr.prokind = 'p' + AND typname NOT IN ('trigger', 'event_trigger') +{% if fnid %} + AND pr.oid = {{fnid}}::oid +{% else %} + AND pronamespace = {{scid}}::oid +{% endif %} +ORDER BY + proname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/stats.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/stats.sql new file mode 100644 index 0000000..2e276b6 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/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/functions/templates/procedure/pg/sql/11_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/update.sql new file mode 100644 index 0000000..33559a7 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/update.sql @@ -0,0 +1,107 @@ +{% import 'macros/functions/security.macros' as SECLABEL %} +{% import 'macros/functions/privilege.macros' as PRIVILEGE %} +{% import 'macros/functions/variable.macros' as VARIABLE %}{% if data %} +{% set name = o_data.name %} +{% if data.name %} +{% if data.name != o_data.name %} +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, o_data.name) }}{% if o_data.proargtypenames %}({{ o_data.proargtypenames }}){% endif %} + + RENAME TO {{ conn|qtIdent(data.name) }}; +{% set name = data.name %} +{% endif %} + +{% endif -%} +{% if data.change_func %} +CREATE OR REPLACE PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({% if data.arguments %}{% for p in data.arguments %}{% if p.argmode %}{{p.argmode}} {% endif %}{% if p.argname %}{{ conn|qtIdent(p.argname) }} {% endif %}{% if p.argtype %}{{ conn|qtTypeIdent(p.argtype) }}{% endif %}{% if p.argdefval %} DEFAULT {{p.argdefval}}{% endif %} +{% if not loop.last %}, {% endif %} +{% endfor %} +{% endif %} +) +{% if 'lanname' in data %} + LANGUAGE {{ data.lanname|qtLiteral }} {% else %} + LANGUAGE {{ o_data.lanname|qtLiteral }} + {% endif %} +{% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %}SECURITY DEFINER{% endif %} +{% if data.merged_variables %}{% for v in data.merged_variables %} + + SET {{ conn|qtIdent(v.name) }}={{ v.value|qtLiteral }}{% endfor -%} +{% endif %} + +AS {% if 'probin' in data or 'prosrc_c' in data %} +{% if 'probin' in data %}{{ data.probin|qtLiteral }}{% else %}{{ o_data.probin|qtLiteral }}{% endif %}, {% if 'prosrc_c' in data %}{{ data.prosrc_c|qtLiteral }}{% else %}{{ o_data.prosrc_c|qtLiteral }}{% endif %}{% elif 'prosrc' in data %} +$BODY${{ data.prosrc }}$BODY${% elif o_data.lanname == 'c' %} +{{ o_data.probin|qtLiteral }}, {{ o_data.prosrc_c|qtLiteral }}{% else %} +$BODY${{ o_data.prosrc }}$BODY${% endif -%}; +{% endif -%} +{% if data.funcowner %} + +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}{% if o_data.proargtypenames %}({{ o_data.proargtypenames }}){% endif %} + OWNER TO {{ data.funcowner }}; +{% endif -%} +{# The SQL generated below will change priviledges #} +{% if data.acl %} +{% if 'deleted' in data.acl %} +{% for priv in data.acl.deleted %} + +{{ PRIVILEGE.UNSETALL(conn, 'PROCEDURE', priv.grantee, name, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif -%} +{% if 'changed' in data.datacl %} +{% for priv in data.acl.changed %} + +{{ PRIVILEGE.UNSETALL(conn, 'PROCEDURE', priv.grantee, name, o_data.pronamespace, o_data.proargtypenames) }} + +{{ PRIVILEGE.SET(conn, 'PROCEDURE', priv.grantee, name, priv.without_grant, + priv.with_grant, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif -%} +{% if 'added' in data.acl %} +{% for priv in data.acl.added %} + +{{ PRIVILEGE.SET(conn, 'PROCEDURE', priv.grantee, name, priv.without_grant, priv.with_grant, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif %} +{% endif -%} +{% if data.change_func == False %} +{% if data.variables %} +{% if 'deleted' in data.variables and data.variables.deleted|length > 0 %} + +{{ VARIABLE.UNSET(conn, 'PROCEDURE', name, data.variables.deleted, o_data.pronamespace, o_data.proargtypenames) }} +{% endif -%} +{% if 'merged_variables' in data and data.merged_variables|length > 0 %} + +{{ VARIABLE.SET(conn, 'PROCEDURE', name, data.merged_variables, o_data.pronamespace, o_data.proargtypenames) }} +{% endif -%} +{% endif -%} +{% endif -%} +{% set seclabels = data.seclabels %} +{% if 'deleted' in seclabels and seclabels.deleted|length > 0 %} +{% for r in seclabels.deleted %} + +{{ SECLABEL.UNSET(conn, 'PROCEDURE', name, r.provider, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif -%} +{% if 'added' in seclabels and seclabels.added|length > 0 %} +{% for r in seclabels.added %} + +{{ SECLABEL.SET(conn, 'PROCEDURE', name, r.provider, r.label, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif -%} +{% if 'changed' in seclabels and seclabels.changed|length > 0 %} +{% for r in seclabels.changed %} + +{{ SECLABEL.SET(conn, 'PROCEDURE', name, r.provider, r.label, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif -%} +{% if data.description is defined and data.description != o_data.description%} + +COMMENT ON PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }} + IS {{ data.description|qtLiteral }}; +{% endif -%} +{% if data.pronamespace %} + +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }} + SET SCHEMA {{ conn|qtIdent(data.pronamespace) }}; +{% endif -%} + +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/variables.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/variables.sql new file mode 100644 index 0000000..5233c71 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/11_plus/variables.sql @@ -0,0 +1,6 @@ +SELECT + name, vartype, min_val, max_val, enumvals +FROM + pg_settings +WHERE + context in ('user', 'superuser'); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/acl.sql deleted file mode 100644 index 2e7aae5..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/acl.sql +++ /dev/null @@ -1,35 +0,0 @@ -SELECT - COALESCE(gt.rolname, 'PUBLIC') AS grantee, - g.rolname AS grantor, array_agg(privilege_type) AS privileges, - array_agg(is_grantable) AS grantable -FROM - (SELECT - d.grantee, d.grantor, d.is_grantable, - CASE d.privilege_type - WHEN 'CONNECT' THEN 'c' - WHEN 'CREATE' THEN 'C' - WHEN 'DELETE' THEN 'd' - WHEN 'EXECUTE' THEN 'X' - WHEN 'INSERT' THEN 'a' - WHEN 'REFERENCES' THEN 'x' - WHEN 'SELECT' THEN 'r' - WHEN 'TEMPORARY' THEN 'T' - WHEN 'TRIGGER' THEN 't' - WHEN 'TRUNCATE' THEN 'D' - WHEN 'UPDATE' THEN 'w' - WHEN 'USAGE' THEN 'U' - ELSE 'UNKNOWN' - END AS privilege_type - FROM - (SELECT - (d).grantee AS grantee, (d).grantor AS grantor, - (d).is_grantable AS is_grantable, - (d).privilege_type AS privilege_type - FROM - (SELECT aclexplode(db.proacl) AS d FROM pg_proc db - WHERE db.oid = {{fnid}}::OID) a - ) d - ) d - LEFT JOIN pg_catalog.pg_roles g ON (d.grantor = g.oid) - LEFT JOIN pg_catalog.pg_roles gt ON (d.grantee = gt.oid) -GROUP BY g.rolname, gt.rolname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/coll_stats.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/coll_stats.sql deleted file mode 100644 index 5924679..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/coll_stats.sql +++ /dev/null @@ -1,20 +0,0 @@ -SELECT - funcname AS {{ conn|qtIdent(_('Name')) }}, - 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 - schemaname = {{schema_name|qtLiteral}} - AND funcid IN ( - SELECT p.oid - FROM - pg_proc p - JOIN - pg_type typ ON typ.oid=p.prorettype - WHERE - p.prokind = 'p'::char - AND typname NOT IN ('trigger', 'event_trigger') - ) -ORDER BY funcname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/create.sql deleted file mode 100644 index 3c71640..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/create.sql +++ /dev/null @@ -1,50 +0,0 @@ -{% import 'macros/functions/security.macros' as SECLABEL %} -{% import 'macros/functions/privilege.macros' as PRIVILEGE %} -{% import 'macros/functions/variable.macros' as VARIABLE %} -{% set is_columns = [] %} -{% if data %} -{% if query_for == 'sql_panel' and func_def is defined %} -CREATE OR REPLACE PROCEDURE {{func_def}} -{% else %} -CREATE OR REPLACE PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}{% if data.arguments is defined %} -({% for p in data.arguments %}{% if p.argmode %}{{p.argmode}} {% endif %}{% if p.argname %}{{ conn|qtIdent(p.argname)}} {% endif %}{% if p.argtype %}{{ conn|qtTypeIdent(p.argtype) }}{% endif %}{% if p.argdefval %} DEFAULT {{p.argdefval}}{% endif %} -{% if not loop.last %}, {% endif %} -{% endfor -%} -{% endif %} -) -{% endif %} -LANGUAGE {{ data.lanname|qtLiteral }} -{% if data.prosecdef %}SECURITY DEFINER {% endif %} -{% if data.variables %}{% for v in data.variables %} - -SET {{ conn|qtIdent(v.name) }}={{ v.value|qtLiteral }}{% endfor -%} -{% endif %} - -AS {% if data.lanname == 'c' %} -{{ data.probin|qtLiteral }}, {{ data.prosrc_c|qtLiteral }} -{% else %} -$BODY${{ data.prosrc }}$BODY${% endif -%}; -{% if data.acl and not is_sql %} -{% for p in data.acl %} - -{{ PRIVILEGE.SET(conn, "PROCEDURE", p.grantee, data.name, p.without_grant, p.with_grant, data.pronamespace, data.func_args_without)}} -{% endfor %}{% endif %} -{% if data.revoke_all %} - -{{ PRIVILEGE.UNSETALL(conn, "PROCEDURE", "PUBLIC", data.name, data.pronamespace, data.func_args_without)}} -{% endif %} -{% if data.description %} - -COMMENT ON PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }} - IS {{ data.description|qtLiteral }}; -{% endif -%} -{% if data.seclabels %} -{% for r in data.seclabels %} -{% if r.label and r.provider %} - -{{ SECLABEL.SET(conn, 'PROCEDURE', data.name, r.provider, r.label, data.pronamespace, data.func_args_without) }} -{% endif %} -{% endfor %} -{% endif -%} - -{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/delete.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/delete.sql deleted file mode 100644 index b4fcdc2..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/delete.sql +++ /dev/null @@ -1,21 +0,0 @@ -{% if scid and fnid %} -SELECT - pr.proname as name, '(' || COALESCE(pg_catalog - .pg_get_function_identity_arguments(pr.oid), '') || ')' as func_args, - nspname -FROM - pg_proc pr -JOIN - pg_type typ ON typ.oid=prorettype -JOIN - pg_namespace nsp ON nsp.oid=pr.pronamespace -WHERE - pr.prokind = 'p'::char - AND pronamespace = {{scid}}::oid - AND typname NOT IN ('trigger', 'event_trigger') - AND pr.oid = {{fnid}}; -{% endif %} - -{% if name %} -DROP PROCEDURE {{ conn|qtIdent(nspname, name) }}; -{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_definition.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_definition.sql deleted file mode 100644 index 4c2e9d9..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_definition.sql +++ /dev/null @@ -1,15 +0,0 @@ -SELECT - pg_get_functiondef({{fnid}}::oid) AS func_def, - COALESCE(pg_catalog.pg_get_function_identity_arguments(pr.oid), '') as - func_with_identity_arguments, - nspname, - pr.proname as proname, - COALESCE(pg_catalog.pg_get_function_arguments(pr.oid), '') as func_args -FROM - pg_proc pr -JOIN - pg_namespace nsp ON nsp.oid=pr.pronamespace -WHERE - pr.prokind = 'p'::char - AND pronamespace = {{scid}}::oid - AND pr.oid = {{fnid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_languages.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_languages.sql deleted file mode 100644 index f81ddfb..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_languages.sql +++ /dev/null @@ -1,4 +0,0 @@ -SELECT - lanname as label, lanname as value -FROM - pg_language; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_oid.sql deleted file mode 100644 index be98b53..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/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, pr.pronamespace AS nsp -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'::char - AND typname NOT IN ('trigger', 'event_trigger') - AND pr.proname = {{ name|qtLiteral }}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_out_types.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_out_types.sql deleted file mode 100644 index 64a1187..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_out_types.sql +++ /dev/null @@ -1,6 +0,0 @@ -SELECT - format_type(oid, NULL) AS out_arg_type -FROM - pg_type -WHERE - oid = {{ out_arg_oid }}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_schema.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_schema.sql deleted file mode 100644 index 127d4b9..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/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/functions/templates/procedure/pg/sql/default/get_types.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_types.sql deleted file mode 100644 index 2a5582e..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/get_types.sql +++ /dev/null @@ -1,20 +0,0 @@ -SELECT - * -FROM - (SELECT - format_type(t.oid,NULL) AS typname, - CASE WHEN typelem > 0 THEN typelem ELSE t.oid END as elemoid, typlen, typtype, t.oid, nspname, - (SELECT COUNT(1) FROM pg_type t2 WHERE t2.typname = t.typname) > 1 AS isdup - FROM - pg_type t - JOIN - pg_namespace nsp ON typnamespace=nsp.oid - WHERE - (NOT (typname = 'unknown' AND nspname = 'pg_catalog')) - AND - ( - typtype IN ('b', 'c', 'd', 'e', 'p', 'r') - AND typname NOT IN ('any', 'trigger', 'language_handler', 'event_trigger') - ) - ) AS dummy -ORDER BY nspname <> 'pg_catalog', nspname <> 'public', nspname, 1; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/node.sql deleted file mode 100644 index 89dc768..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/node.sql +++ /dev/null @@ -1,29 +0,0 @@ -SELECT - pr.oid, - CASE WHEN - pg_catalog.pg_get_function_identity_arguments(pr.oid) <> '' - THEN - pr.proname || '(' || pg_catalog.pg_get_function_identity_arguments(pr.oid) || ')' - ELSE - pr.proname - END AS name, - lanname, pg_get_userbyid(proowner) AS funcowner, description -FROM - pg_proc pr -JOIN - pg_type typ ON typ.oid=prorettype -JOIN - pg_language lng ON lng.oid=prolang -LEFT OUTER JOIN - pg_description des ON (des.objoid=pr.oid AND des.classoid='pg_proc'::regclass) -WHERE - pr.prokind = 'p'::char -{% if fnid %} - AND pr.oid = {{ fnid|qtLiteral }} -{% endif %} -{% if scid %} - AND pronamespace = {{scid}}::oid -{% endif %} - AND typname NOT IN ('trigger', 'event_trigger') -ORDER BY - proname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/properties.sql deleted file mode 100644 index 79bea86..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/properties.sql +++ /dev/null @@ -1,39 +0,0 @@ -SELECT - pr.oid, pr.xmin, pr.*, pr.prosrc AS prosrc_c, - pr.proname AS name, pg_get_function_result(pr.oid) AS prorettypename, - typns.nspname AS typnsp, lanname, proargnames, oidvectortypes(proargtypes) AS proargtypenames, - pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals, - pronargdefaults, proconfig, pg_get_userbyid(proowner) AS funcowner, description, - (CASE WHEN - pg_catalog.pg_get_function_identity_arguments(pr.oid) <> '' - THEN - pr.proname || '(' || pg_catalog.pg_get_function_identity_arguments(pr.oid) || ')' - ELSE - pr.proname - END) AS name_with_args, - (SELECT - array_agg(provider || '=' || label) - FROM - pg_seclabel sl1 - WHERE - sl1.objoid=pr.oid) AS seclabels -FROM - pg_proc pr -JOIN - pg_type typ ON typ.oid=prorettype -JOIN - pg_namespace typns ON typns.oid=typ.typnamespace -JOIN - pg_language lng ON lng.oid=prolang -LEFT OUTER JOIN - pg_description des ON (des.objoid=pr.oid AND des.classoid='pg_proc'::regclass) -WHERE - pr.prokind = 'p' - AND typname NOT IN ('trigger', 'event_trigger') -{% if fnid %} - AND pr.oid = {{fnid}}::oid -{% else %} - AND pronamespace = {{scid}}::oid -{% endif %} -ORDER BY - proname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/stats.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/stats.sql deleted file mode 100644 index 2e276b6..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/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/functions/templates/procedure/pg/sql/default/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/update.sql deleted file mode 100644 index e1629e9..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/update.sql +++ /dev/null @@ -1,106 +0,0 @@ -{% import 'macros/functions/security.macros' as SECLABEL %} -{% import 'macros/functions/privilege.macros' as PRIVILEGE %}{% if data %} -{% set name = o_data.name %} -{% if data.name %} -{% if data.name != o_data.name %} -ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, o_data.name) }}{% if o_data.proargtypenames %}({{ o_data.proargtypenames }}){% endif %} - - RENAME TO {{ conn|qtIdent(data.name) }}; -{% set name = data.name %} -{% endif %} - -{% endif -%} -{% if data.change_func %} -CREATE OR REPLACE PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({% if data.arguments %}{% for p in data.arguments %}{% if p.argmode %}{{p.argmode}} {% endif %}{% if p.argname %}{{ conn|qtIdent(p.argname) }} {% endif %}{% if p.argtype %}{{ conn|qtTypeIdent(p.argtype) }}{% endif %}{% if p.argdefval %} DEFAULT {{p.argdefval}}{% endif %} -{% if not loop.last %}, {% endif %} -{% endfor %} -{% endif %} -) -{% if 'lanname' in data %} - LANGUAGE {{ data.lanname|qtLiteral }} {% else %} - LANGUAGE {{ o_data.lanname|qtLiteral }} - {% endif %} -{% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %}SECURITY DEFINER{% endif %} -{% if data.merged_variables %}{% for v in data.merged_variables %} - - SET {{ conn|qtIdent(v.name) }}={{ v.value|qtLiteral }}{% endfor -%} - {% endif %} - -AS {% if 'probin' in data or 'prosrc_c' in data %} -{% if 'probin' in data %}{{ data.probin|qtLiteral }}{% else %}{{ o_data.probin|qtLiteral }}{% endif %}, {% if 'prosrc_c' in data %}{{ data.prosrc_c|qtLiteral }}{% else %}{{ o_data.prosrc_c|qtLiteral }}{% endif %}{% elif 'prosrc' in data %} -$BODY${{ data.prosrc }}$BODY${% elif o_data.lanname == 'c' %} -{{ o_data.probin|qtLiteral }}, {{ o_data.prosrc_c|qtLiteral }}{% else %} -$BODY${{ o_data.prosrc }}$BODY${% endif -%}; -{% endif -%} -{% if data.funcowner %} - -ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}{% if o_data.proargtypenames %}({{ o_data.proargtypenames }}){% endif %} - OWNER TO {{ data.funcowner }}; -{% endif -%} -{# The SQL generated below will change priviledges #} -{% if data.acl %} -{% if 'deleted' in data.acl %} -{% for priv in data.acl.deleted %} - -{{ PRIVILEGE.UNSETALL(conn, 'PROCEDURE', priv.grantee, name, o_data.pronamespace, o_data.proargtypenames) }} -{% endfor %} -{% endif -%} -{% if 'changed' in data.datacl %} -{% for priv in data.acl.changed %} - -{{ PRIVILEGE.UNSETALL(conn, 'PROCEDURE', priv.grantee, name, o_data.pronamespace, o_data.proargtypenames) }} - -{{ PRIVILEGE.SET(conn, 'PROCEDURE', priv.grantee, name, priv.without_grant, - priv.with_grant, o_data.pronamespace, o_data.proargtypenames) }} -{% endfor %} -{% endif -%} -{% if 'added' in data.acl %} -{% for priv in data.acl.added %} - -{{ PRIVILEGE.SET(conn, 'PROCEDURE', priv.grantee, name, priv.without_grant, priv.with_grant, o_data.pronamespace, o_data.proargtypenames) }} -{% endfor %} -{% endif %} -{% endif -%} -{% if data.change_func == False %} -{% if data.variables %} -{% if 'deleted' in data.variables and data.variables.deleted|length > 0 %} - -{{ VARIABLE.UNSET(conn, 'FUNCTION', name, data.variables.deleted, o_data.pronamespace, o_data.proargtypenames) }} -{% endif -%} -{% if 'merged_variables' in data and data.merged_variables|length > 0 %} - -{{ VARIABLE.SET(conn, 'FUNCTION', name, data.merged_variables, o_data.pronamespace, o_data.proargtypenames) }} -{% endif -%} -{% endif -%} -{% endif -%} -{% set seclabels = data.seclabels %} -{% if 'deleted' in seclabels and seclabels.deleted|length > 0 %} -{% for r in seclabels.deleted %} - -{{ SECLABEL.UNSET(conn, 'PROCEDURE', name, r.provider, o_data.pronamespace, o_data.proargtypenames) }} -{% endfor %} -{% endif -%} -{% if 'added' in seclabels and seclabels.added|length > 0 %} -{% for r in seclabels.added %} - -{{ SECLABEL.SET(conn, 'PROCEDURE', name, r.provider, r.label, o_data.pronamespace, o_data.proargtypenames) }} -{% endfor %} -{% endif -%} -{% if 'changed' in seclabels and seclabels.changed|length > 0 %} -{% for r in seclabels.changed %} - -{{ SECLABEL.SET(conn, 'PROCEDURE', name, r.provider, r.label, o_data.pronamespace, o_data.proargtypenames) }} -{% endfor %} -{% endif -%} -{% if data.description is defined and data.description != o_data.description%} - -COMMENT ON PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }} - IS {{ data.description|qtLiteral }}; -{% endif -%} -{% if data.pronamespace %} - -ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }} - SET SCHEMA {{ conn|qtIdent(data.pronamespace) }}; -{% endif -%} - -{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/variables.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/variables.sql deleted file mode 100644 index 5233c71..0000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/pg/sql/default/variables.sql +++ /dev/null @@ -1,6 +0,0 @@ -SELECT - name, vartype, min_val, max_val, enumvals -FROM - pg_settings -WHERE - context in ('user', 'superuser'); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/11_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/11_plus/create.sql new file mode 100644 index 0000000..2d5b3cb --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/11_plus/create.sql @@ -0,0 +1,59 @@ +{% import 'macros/functions/security.macros' as SECLABEL %} +{% import 'macros/functions/privilege.macros' as PRIVILEGE %} +{% import 'macros/functions/variable.macros' as VARIABLE %} +{% set is_columns = [] %} +{% if data %} +{% if query_for == 'sql_panel' and func_def is defined %} +CREATE OR REPLACE PROCEDURE {{func_def}} +{% else %} +CREATE OR REPLACE PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}{% if data.arguments is defined %} +({% for p in data.arguments %}{% if p.argmode %}{{p.argmode}} {% endif %}{% if p.argname %}{{ conn|qtIdent(p.argname)}} {% endif %}{% if p.argtype %}{{ conn|qtTypeIdent(p.argtype) }}{% endif %}{% if p.argdefval %} DEFAULT {{p.argdefval}}{% endif %} +{% if not loop.last %}, {% endif %} +{% endfor -%} +{% endif %} +) +{% endif %} +LANGUAGE {{ data.lanname|qtLiteral }} + {% if data.prosecdef %}SECURITY DEFINER {% endif %} +{% if data.lanname == 'edbspl' %} +{{ data.provolatile }} {% if data.proleakproof %}LEAKPROOF {% endif %} +{% if data.proisstrict %}STRICT {% endif %} +{% if data.proparallel and (data.proparallel == 'r' or data.proparallel == 's') %} +{% if data.proparallel == 'r' %}PARALLEL RESTRICTED{% elif data.proparallel == 's' %}PARALLEL SAFE{% endif %}{% endif %}{% if data.procost %} + + COST {{data.procost}}{% endif %}{% if data.prorows and (data.prorows | int) > 0 %} + + ROWS {{data.prorows}}{% endif -%}{% if data.variables %}{% for v in data.variables %} + + SET {{ conn|qtIdent(v.name) }}={{ v.value|qtLiteral }}{% endfor -%} +{% endif %} +{% endif %} + +AS {% if data.lanname == 'c' %} +{{ data.probin|qtLiteral }}, {{ data.prosrc_c|qtLiteral }} +{% else %} +$BODY${{ data.prosrc }}$BODY${% endif -%}; +{% if data.acl and not is_sql %} +{% for p in data.acl %} + +{{ PRIVILEGE.SET(conn, "PROCEDURE", p.grantee, data.name, p.without_grant, p.with_grant, data.pronamespace, data.func_args_without)}} +{% endfor %}{% endif %} +{% if data.revoke_all %} + +{{ PRIVILEGE.UNSETALL(conn, "PROCEDURE", "PUBLIC", data.name, data.pronamespace, data.func_args_without)}} +{% endif %} +{% if data.description %} + +COMMENT ON PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }} + IS {{ data.description|qtLiteral }}; +{% endif -%} +{% if data.seclabels %} +{% for r in data.seclabels %} +{% if r.label and r.provider %} + +{{ SECLABEL.SET(conn, 'PROCEDURE', data.name, r.provider, r.label, data.pronamespace, data.func_args_without) }} +{% endif %} +{% endfor %} +{% endif -%} + +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/11_plus/delete.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/11_plus/delete.sql index b4fcdc2..3835410 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/11_plus/delete.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/11_plus/delete.sql @@ -17,5 +17,5 @@ WHERE {% endif %} {% if name %} -DROP PROCEDURE {{ conn|qtIdent(nspname, name) }}; +DROP PROCEDURE {{ conn|qtIdent(nspname, name) }}{{func_args}}{% if cascade %} CASCADE{% endif %}; {% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/11_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/11_plus/update.sql new file mode 100644 index 0000000..1c0ad8b --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/11_plus/update.sql @@ -0,0 +1,115 @@ +{% import 'macros/functions/security.macros' as SECLABEL %} +{% import 'macros/functions/privilege.macros' as PRIVILEGE %} +{% import 'macros/functions/variable.macros' as VARIABLE %}{% if data %} +{% set name = o_data.name %} +{% if data.name %} +{% if data.name != o_data.name %} +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, o_data.name) }}{% if o_data.proargtypenames %}({{ o_data.proargtypenames }}){% endif %} + + RENAME TO {{ conn|qtIdent(data.name) }}; +{% set name = data.name %} +{% endif %} + +{% endif -%} +{% if data.change_func %} +CREATE OR REPLACE PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({% if data.arguments %}{% for p in data.arguments %}{% if p.argmode %}{{p.argmode}} {% endif %}{% if p.argname %}{{ conn|qtIdent(p.argname) }} {% endif %}{% if p.argtype %}{{ conn|qtTypeIdent(p.argtype) }}{% endif %}{% if p.argdefval %} DEFAULT {{p.argdefval}}{% endif %} +{% if not loop.last %}, {% endif %} +{% endfor %} +{% endif %} +) +{% if 'lanname' in data %} + LANGUAGE {{ data.lanname|qtLiteral }} {% else %} + LANGUAGE {{ o_data.lanname|qtLiteral }} + {% endif %} +{% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %}SECURITY DEFINER{% endif %} +{% if data.lanname == 'edbspl' %} +{% if ('proleakproof' in data and data.proleakproof) or ('proleakproof' not in data and o_data.proleakproof) %} LEAKPROOF{% else %} NOT LEAKPROOF{% endif %} + {% if ('proisstrict' in data and data.proisstrict) or ('proisstrict' not in data and o_data.proisstrict) %} STRICT{% endif %} + + {% if 'proparallel' in data and data.proparallel %}PARALLEL {{ data.proparallel }}{% elif 'proparallel' not in data and o_data.proparallel %}PARALLEL {{ o_data.proparallel }}{% endif %} + + {% if data.procost %}COST {{data.procost}}{% elif o_data.procost %}COST {{o_data.procost}}{% endif %}{% if data.prorows %} + + ROWS {{data.prorows}}{% elif data.prorows is not defined and o_data.prorows and o_data.prorows != '0' %} ROWS {{o_data.prorows}}{% endif -%}{% if data.merged_variables %}{% for v in data.merged_variables %} + + SET {{ conn|qtIdent(v.name) }}={{ v.value|qtLiteral }}{% endfor -%} +{% endif %} +{% endif %} + +AS {% if 'probin' in data or 'prosrc_c' in data %} +{% if 'probin' in data %}{{ data.probin|qtLiteral }}{% else %}{{ o_data.probin|qtLiteral }}{% endif %}, {% if 'prosrc_c' in data %}{{ data.prosrc_c|qtLiteral }}{% else %}{{ o_data.prosrc_c|qtLiteral }}{% endif %}{% elif 'prosrc' in data %} +$BODY${{ data.prosrc }}$BODY${% elif o_data.lanname == 'c' %} +{{ o_data.probin|qtLiteral }}, {{ o_data.prosrc_c|qtLiteral }}{% else %} +$BODY${{ o_data.prosrc }}$BODY${% endif -%}; +{% endif -%} +{% if data.funcowner %} + +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}{% if o_data.proargtypenames %}({{ o_data.proargtypenames }}){% endif %} + OWNER TO {{ data.funcowner }}; +{% endif -%} +{# The SQL generated below will change priviledges #} +{% if data.acl %} +{% if 'deleted' in data.acl %} +{% for priv in data.acl.deleted %} + +{{ PRIVILEGE.UNSETALL(conn, 'PROCEDURE', priv.grantee, name, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif -%} +{% if 'changed' in data.datacl %} +{% for priv in data.acl.changed %} + +{{ PRIVILEGE.UNSETALL(conn, 'PROCEDURE', priv.grantee, name, o_data.pronamespace, o_data.proargtypenames) }} + +{{ PRIVILEGE.SET(conn, 'PROCEDURE', priv.grantee, name, priv.without_grant, priv.with_grant, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif -%} +{% if 'added' in data.acl %} +{% for priv in data.acl.added %} + +{{ PRIVILEGE.SET(conn, 'PROCEDURE', priv.grantee, name, priv.without_grant, priv.with_grant, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif %} +{% endif -%} +{% if data.change_func == False %} +{% if data.variables %} +{% if 'deleted' in data.variables and data.variables.deleted|length > 0 %} + +{{ VARIABLE.UNSET(conn, 'PROCEDURE', name, data.variables.deleted, o_data.pronamespace, o_data.proargtypenames) }} +{% endif -%} +{% if 'merged_variables' in data and data.merged_variables|length > 0 %} + +{{ VARIABLE.SET(conn, 'PROCEDURE', name, data.merged_variables, o_data.pronamespace, o_data.proargtypenames) }} +{% endif -%} +{% endif -%} +{% endif -%} +{% set seclabels = data.seclabels %} +{% if 'deleted' in seclabels and seclabels.deleted|length > 0 %} +{% for r in seclabels.deleted %} + +{{ SECLABEL.UNSET(conn, 'PROCEDURE', name, r.provider, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif -%} +{% if 'added' in seclabels and seclabels.added|length > 0 %} +{% for r in seclabels.added %} + +{{ SECLABEL.SET(conn, 'PROCEDURE', name, r.provider, r.label, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif -%} +{% if 'changed' in seclabels and seclabels.changed|length > 0 %} +{% for r in seclabels.changed %} + +{{ SECLABEL.SET(conn, 'PROCEDURE', name, r.provider, r.label, o_data.pronamespace, o_data.proargtypenames) }} +{% endfor %} +{% endif -%} +{% if data.description is defined and data.description != o_data.description%} + +COMMENT ON PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }} + IS {{ data.description|qtLiteral }}; +{% endif -%} +{% if data.pronamespace %} + +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }} + SET SCHEMA {{ conn|qtIdent(data.pronamespace) }}; +{% endif -%} + +{% endif %}