diff --git a/docs/en_US/images/procedure_definition.png b/docs/en_US/images/procedure_definition.png index 8d40d6b534e..581f34bea85 100644 Binary files a/docs/en_US/images/procedure_definition.png and b/docs/en_US/images/procedure_definition.png differ diff --git a/docs/en_US/procedure_dialog.rst b/docs/en_US/procedure_dialog.rst index 161c53edb46..47540b76650 100644 --- a/docs/en_US/procedure_dialog.rst +++ b/docs/en_US/procedure_dialog.rst @@ -36,6 +36,9 @@ Use the fields in the *Definition* tab to define the procedure: * Use the drop-down listbox next to *Language* to select a language. The default is *edbspl*. +* Use the drop-down listbox next to *Depends on extensions* to select the extension that this procedure + depends on (for example, edbspl). If set, dropping the extension will automatically drop the + procedure as well. * Use the fields in the *Arguments* section to define an argument. Click *Add* to set parameters and values for the argument: * Use the drop-down listbox next to *Data type* to select a data type. 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 dc233ba6e5c..a0f8a10e137 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 @@ -1171,7 +1171,10 @@ def _get_sql_for_edit_mode(self, data, parallel_dict, all_ids_dict, old_data['proparallel'] = \ parallel_dict[old_data['proparallel']] - if self.node_type == 'function': + if self.node_type in ('function', 'procedure') and ( + old_data.get('dependsonextensions') is None or + data.get('dependsonextensions') is None + ): old_data['dependsonextensions'] = \ old_data.get('dependsonextensions') or [] data['dependsonextensions'] = \ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.ui.js index c1e35ba90c2..1fcf533e4e3 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.ui.js @@ -288,8 +288,7 @@ export default class FunctionSchema extends BaseUISchema { placeholder: gettext('Select the Depends on extensions...'), }, min_version: 130000, - mode: ['create', 'edit', 'properties'], - visible: obj.isVisible + mode: ['create', 'edit', 'properties'] },{ id: 'probin', label: gettext('Object file'), cell: 'string', type: 'text', group: gettext('Definition'), deps: ['lanname'], visible: 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 7eb34183bc4..7661c86c095 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 @@ -92,6 +92,7 @@ define('pgadmin.node.procedure', [ ); }, getSchema: function(treeNodeInfo, itemNodeData) { + let nodeObj = pgBrowser.Nodes['extension']; return new FunctionSchema( (privileges)=>getNodePrivilegeRoleSchema(this, treeNodeInfo, itemNodeData, privileges), ()=>getNodeVariableSchema(this, treeNodeInfo, itemNodeData, false, false), @@ -101,6 +102,16 @@ define('pgadmin.node.procedure', [ cacheLevel: 'database' } ), + extensionsList:()=>getNodeAjaxOptions('nodes', nodeObj, treeNodeInfo, itemNodeData, { cacheLevel: 'server'}, + (data)=>{ + let res = []; + if (data && _.isArray(data)) { + _.each(data, function(d) { + res.push({label: d.label, value: d.label, data: d}); + }); + } + return res; + }), getTypes: ()=>getNodeAjaxOptions('get_types', this, treeNodeInfo, itemNodeData), getLanguage: ()=>getNodeAjaxOptions('get_languages', this, treeNodeInfo, itemNodeData), getSupportFunctions: ()=>getNodeAjaxOptions('get_support_functions', this, treeNodeInfo, itemNodeData, { diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/13_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/13_plus/create.sql new file mode 100644 index 00000000000..04f20fe2dbf --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/13_plus/create.sql @@ -0,0 +1,66 @@ +{% import 'macros/functions/security.macros' as SECLABEL %} +{% import 'macros/functions/privilege.macros' as PRIVILEGE %} +{% import 'macros/functions/variable.macros' as VARIABLE %} +{% set is_columns = [] %} +{% set exclude_quoting = ['search_path'] %} +{% if data %} +{% if query_for == 'sql_panel' and func_def is defined %} +CREATE OR REPLACE PROCEDURE {{func_def}} +{% else %} +CREATE{% if add_replace_clause %} OR REPLACE{% endif %} 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 %}{{ p.argtype }}{% endif %}{% if p.argdefval %} DEFAULT {{p.argdefval}}{% endif %} +{% if not loop.last %}, {% endif %} +{% endfor -%} +{% endif %} +) +{% endif %} +LANGUAGE {{ data.lanname|qtLiteral(conn) }}{% if data.prosecdef %} + + SECURITY DEFINER {% endif %} +{% if data.variables %}{% for v in data.variables %} + + SET {{ conn|qtIdent(v.name) }}={% if v.name in exclude_quoting %}{{ v.value }}{% else %}{{ v.value|qtLiteral(conn) }}{% endif %}{% endfor -%} +{% endif %} + +AS {% if data.lanname == 'c' %} +{{ data.probin|qtLiteral(conn) }}, {{ data.prosrc_c|qtLiteral(conn) }} +{% else %} +$BODY${{ data.prosrc }}$BODY${% endif -%}; + +{% if data.funcowner %} +ALTER PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}({{data.func_args_without}}) + OWNER TO {{ conn|qtIdent(data.funcowner) }}; +{% endif -%} + +{% if data.dependsonextensions %} +{% for ext in data.dependsonextensions %} + +ALTER PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}({{data.func_args_without}}) + DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% endfor %} +{% 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) }}({{data.func_args_without}}) + IS {{ data.description|qtLiteral(conn) }}; +{% 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/procedures/pg/sql/13_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/13_plus/properties.sql new file mode 100644 index 00000000000..4f1ba466502 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/13_plus/properties.sql @@ -0,0 +1,53 @@ +SELECT + pr.oid, pr.xmin, + CASE WHEN pr.prokind = 'w' THEN true ELSE false END AS proiswindow, + pr.prosrc, pr.prosrc AS prosrc_c, pr.pronamespace, pr.prolang, pr.procost, pr.prorows, pr.prokind, + pr.prosecdef, pr.proleakproof, pr.proisstrict, pr.proretset, pr.provolatile, pr.proparallel, + pr.pronargs, pr.prorettype, pr.proallargtypes, pr.proargmodes, pr.probin, pr.proacl, + pr.proname, pr.proname AS name, pg_catalog.pg_get_function_result(pr.oid) AS prorettypename, + typns.nspname AS typnsp, lanname, proargnames, pg_catalog.oidvectortypes(proargtypes) AS proargtypenames, + pg_catalog.pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals, + pr.pronargdefaults, proconfig, pg_catalog.pg_get_userbyid(proowner) AS funcowner, description, + ( + SELECT array_agg(DISTINCT e.extname) + FROM pg_depend d + JOIN pg_extension e ON d.refobjid = e.oid + WHERE d.objid = pr.oid + ) AS dependsonextensions, + ( + WITH name_with_args_tab AS (SELECT pg_catalog.pg_get_function_identity_arguments(pr.oid) AS val) + SELECT CASE WHEN + val <> '' + THEN + pr.proname || '(' || val || ')' + ELSE + pr.proname::text + END + FROM name_with_args_tab + ) AS name_with_args, + (SELECT + pg_catalog.array_agg(provider || '=' || label) + FROM + pg_catalog.pg_seclabel sl1 + WHERE + sl1.objoid=pr.oid) AS seclabels +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +LEFT OUTER JOIN + pg_catalog.pg_description des ON (des.objoid=pr.oid AND des.classoid='pg_proc'::regclass and des.objsubid = 0) +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/procedures/pg/sql/13_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/13_plus/update.sql new file mode 100644 index 00000000000..c2d004b82f1 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/13_plus/update.sql @@ -0,0 +1,128 @@ +{% 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 %} +{% set exclude_quoting = ['search_path'] %} +{% 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 %}{{ 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(conn) }} {% else %} + LANGUAGE {{ o_data.lanname|qtLiteral(conn) }} + {% 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) }}={% if v.name in exclude_quoting %}{{ v.value }}{% else %}{{ v.value|qtLiteral(conn) }}{% endif %}{% endfor -%} +{% endif %} + +AS {% if (data.lanname == 'c' or o_data.lanname == 'c') and ('probin' in data or 'prosrc_c' in data) %} +{% if 'probin' in data %}{{ data.probin|qtLiteral(conn) }}{% else %}{{ o_data.probin|qtLiteral(conn) }}{% endif %}, {% if 'prosrc_c' in data %}{{ data.prosrc_c|qtLiteral(conn) }}{% else %}{{ o_data.prosrc_c|qtLiteral(conn) }}{% endif %}{% elif 'prosrc' in data %} +$BODY${{ data.prosrc }}$BODY${% elif o_data.lanname == 'c' %} +{{ o_data.probin|qtLiteral(conn) }}, {{ o_data.prosrc_c|qtLiteral(conn) }}{% 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 {{ conn|qtIdent(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.acl %} +{% for priv in data.acl.changed %} + +{% if priv.grantee != priv.old_grantee %} +{{ PRIVILEGE.UNSETALL(conn, 'PROCEDURE', priv.old_grantee, name, o_data.pronamespace, o_data.proargtypenames) }} +{% else %} +{{ PRIVILEGE.UNSETALL(conn, 'PROCEDURE', priv.grantee, name, o_data.pronamespace, o_data.proargtypenames) }} +{% endif %} + +{{ 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) }}({{o_data.proargtypenames }}) + IS {{ data.description|qtLiteral(conn) }}; +{% endif -%} +{% if data.pronamespace %} + +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }} + SET SCHEMA {{ conn|qtIdent(data.pronamespace) }}; +{% endif -%} + +{% set old_exts = (o_data.dependsonextensions or []) | list %} +{% set new_exts = data.dependsonextensions if 'dependsonextensions' in data else None %} + +{% if new_exts is not none and old_exts != new_exts %} +{% for ext in (old_exts + new_exts) | unique %} + +{% if ext in new_exts and ext not in old_exts %} +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({{ o_data.proargtypenames }}) + DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% elif ext in old_exts and ext not in new_exts %} +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({{ o_data.proargtypenames }}) + NO DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% endif %} +{% endfor %} +{% endif %} + +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/create.sql index 2be6c82b172..e38b9a58f7f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/create.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/create.sql @@ -35,6 +35,14 @@ ALTER PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}({{data.func_arg OWNER TO {{ conn|qtIdent(data.funcowner) }}; {% endif -%} +{% if data.dependsonextensions %} +{% for ext in data.dependsonextensions %} + +ALTER PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}({{data.func_args_without}}) + DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% endfor %} +{% endif %} + {% if data.acl and not is_sql %} {% for p in data.acl %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/properties.sql index 4dad586d565..6cbdaf6d99b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/properties.sql @@ -10,6 +10,12 @@ SELECT pg_catalog.pg_get_function_sqlbody(pr.oid) AS prosrc_sql, CASE WHEN pr.prosqlbody IS NOT NULL THEN true ELSE false END as is_pure_sql, pr.pronargdefaults, proconfig, pg_catalog.pg_get_userbyid(proowner) AS funcowner, description, + ( + SELECT array_agg(DISTINCT e.extname) + FROM pg_depend d + JOIN pg_extension e ON d.refobjid = e.oid + WHERE d.objid = pr.oid + ) AS dependsonextensions, ( WITH name_with_args_tab AS (SELECT pg_catalog.pg_get_function_identity_arguments(pr.oid) AS val) SELECT CASE WHEN diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/update.sql index d5701a02331..95accc3e330 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/update.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/update.sql @@ -111,4 +111,20 @@ ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }} SET SCHEMA {{ conn|qtIdent(data.pronamespace) }}; {% endif -%} +{% set old_exts = (o_data.dependsonextensions or []) | list %} +{% set new_exts = data.dependsonextensions if 'dependsonextensions' in data else None %} + +{% if new_exts is not none and old_exts != new_exts %} +{% for ext in (old_exts + new_exts) | unique %} + +{% if ext in new_exts and ext not in old_exts %} +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({{ o_data.proargtypenames }}) + DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% elif ext in old_exts and ext not in new_exts %} +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({{ o_data.proargtypenames }}) + NO DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% endif %} +{% endfor %} +{% endif %} + {% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/13_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/13_plus/create.sql new file mode 100644 index 00000000000..04f20fe2dbf --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/13_plus/create.sql @@ -0,0 +1,66 @@ +{% import 'macros/functions/security.macros' as SECLABEL %} +{% import 'macros/functions/privilege.macros' as PRIVILEGE %} +{% import 'macros/functions/variable.macros' as VARIABLE %} +{% set is_columns = [] %} +{% set exclude_quoting = ['search_path'] %} +{% if data %} +{% if query_for == 'sql_panel' and func_def is defined %} +CREATE OR REPLACE PROCEDURE {{func_def}} +{% else %} +CREATE{% if add_replace_clause %} OR REPLACE{% endif %} 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 %}{{ p.argtype }}{% endif %}{% if p.argdefval %} DEFAULT {{p.argdefval}}{% endif %} +{% if not loop.last %}, {% endif %} +{% endfor -%} +{% endif %} +) +{% endif %} +LANGUAGE {{ data.lanname|qtLiteral(conn) }}{% if data.prosecdef %} + + SECURITY DEFINER {% endif %} +{% if data.variables %}{% for v in data.variables %} + + SET {{ conn|qtIdent(v.name) }}={% if v.name in exclude_quoting %}{{ v.value }}{% else %}{{ v.value|qtLiteral(conn) }}{% endif %}{% endfor -%} +{% endif %} + +AS {% if data.lanname == 'c' %} +{{ data.probin|qtLiteral(conn) }}, {{ data.prosrc_c|qtLiteral(conn) }} +{% else %} +$BODY${{ data.prosrc }}$BODY${% endif -%}; + +{% if data.funcowner %} +ALTER PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}({{data.func_args_without}}) + OWNER TO {{ conn|qtIdent(data.funcowner) }}; +{% endif -%} + +{% if data.dependsonextensions %} +{% for ext in data.dependsonextensions %} + +ALTER PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}({{data.func_args_without}}) + DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% endfor %} +{% 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) }}({{data.func_args_without}}) + IS {{ data.description|qtLiteral(conn) }}; +{% 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/procedures/ppas/sql/13_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/13_plus/properties.sql new file mode 100644 index 00000000000..4f1ba466502 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/13_plus/properties.sql @@ -0,0 +1,53 @@ +SELECT + pr.oid, pr.xmin, + CASE WHEN pr.prokind = 'w' THEN true ELSE false END AS proiswindow, + pr.prosrc, pr.prosrc AS prosrc_c, pr.pronamespace, pr.prolang, pr.procost, pr.prorows, pr.prokind, + pr.prosecdef, pr.proleakproof, pr.proisstrict, pr.proretset, pr.provolatile, pr.proparallel, + pr.pronargs, pr.prorettype, pr.proallargtypes, pr.proargmodes, pr.probin, pr.proacl, + pr.proname, pr.proname AS name, pg_catalog.pg_get_function_result(pr.oid) AS prorettypename, + typns.nspname AS typnsp, lanname, proargnames, pg_catalog.oidvectortypes(proargtypes) AS proargtypenames, + pg_catalog.pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals, + pr.pronargdefaults, proconfig, pg_catalog.pg_get_userbyid(proowner) AS funcowner, description, + ( + SELECT array_agg(DISTINCT e.extname) + FROM pg_depend d + JOIN pg_extension e ON d.refobjid = e.oid + WHERE d.objid = pr.oid + ) AS dependsonextensions, + ( + WITH name_with_args_tab AS (SELECT pg_catalog.pg_get_function_identity_arguments(pr.oid) AS val) + SELECT CASE WHEN + val <> '' + THEN + pr.proname || '(' || val || ')' + ELSE + pr.proname::text + END + FROM name_with_args_tab + ) AS name_with_args, + (SELECT + pg_catalog.array_agg(provider || '=' || label) + FROM + pg_catalog.pg_seclabel sl1 + WHERE + sl1.objoid=pr.oid) AS seclabels +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +LEFT OUTER JOIN + pg_catalog.pg_description des ON (des.objoid=pr.oid AND des.classoid='pg_proc'::regclass and des.objsubid = 0) +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/procedures/ppas/sql/13_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/13_plus/update.sql new file mode 100644 index 00000000000..c2d004b82f1 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/13_plus/update.sql @@ -0,0 +1,128 @@ +{% 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 %} +{% set exclude_quoting = ['search_path'] %} +{% 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 %}{{ 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(conn) }} {% else %} + LANGUAGE {{ o_data.lanname|qtLiteral(conn) }} + {% 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) }}={% if v.name in exclude_quoting %}{{ v.value }}{% else %}{{ v.value|qtLiteral(conn) }}{% endif %}{% endfor -%} +{% endif %} + +AS {% if (data.lanname == 'c' or o_data.lanname == 'c') and ('probin' in data or 'prosrc_c' in data) %} +{% if 'probin' in data %}{{ data.probin|qtLiteral(conn) }}{% else %}{{ o_data.probin|qtLiteral(conn) }}{% endif %}, {% if 'prosrc_c' in data %}{{ data.prosrc_c|qtLiteral(conn) }}{% else %}{{ o_data.prosrc_c|qtLiteral(conn) }}{% endif %}{% elif 'prosrc' in data %} +$BODY${{ data.prosrc }}$BODY${% elif o_data.lanname == 'c' %} +{{ o_data.probin|qtLiteral(conn) }}, {{ o_data.prosrc_c|qtLiteral(conn) }}{% 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 {{ conn|qtIdent(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.acl %} +{% for priv in data.acl.changed %} + +{% if priv.grantee != priv.old_grantee %} +{{ PRIVILEGE.UNSETALL(conn, 'PROCEDURE', priv.old_grantee, name, o_data.pronamespace, o_data.proargtypenames) }} +{% else %} +{{ PRIVILEGE.UNSETALL(conn, 'PROCEDURE', priv.grantee, name, o_data.pronamespace, o_data.proargtypenames) }} +{% endif %} + +{{ 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) }}({{o_data.proargtypenames }}) + IS {{ data.description|qtLiteral(conn) }}; +{% endif -%} +{% if data.pronamespace %} + +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }} + SET SCHEMA {{ conn|qtIdent(data.pronamespace) }}; +{% endif -%} + +{% set old_exts = (o_data.dependsonextensions or []) | list %} +{% set new_exts = data.dependsonextensions if 'dependsonextensions' in data else None %} + +{% if new_exts is not none and old_exts != new_exts %} +{% for ext in (old_exts + new_exts) | unique %} + +{% if ext in new_exts and ext not in old_exts %} +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({{ o_data.proargtypenames }}) + DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% elif ext in old_exts and ext not in new_exts %} +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({{ o_data.proargtypenames }}) + NO DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% endif %} +{% endfor %} +{% endif %} + +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/create.sql index f0f23945bbe..64b9ff86f0c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/create.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/create.sql @@ -43,6 +43,14 @@ ALTER PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}({{data.func_arg OWNER TO {{ conn|qtIdent(data.funcowner) }}; {% endif -%} +{% if data.dependsonextensions %} +{% for ext in data.dependsonextensions %} + +ALTER PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}({{data.func_args_without}}) + DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% endfor %} +{% endif %} + {% if data.acl and not is_sql %} {% for p in data.acl %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/properties.sql index a1a81dcf5ba..594e4769d5f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/properties.sql @@ -8,6 +8,12 @@ SELECT typns.nspname AS typnsp, lanname, proargnames, pg_catalog.oidvectortypes(proargtypes) AS proargtypenames, pg_catalog.pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals, pr.pronargdefaults, proconfig, pg_catalog.pg_get_userbyid(proowner) AS funcowner, description, + ( + SELECT array_agg(DISTINCT e.extname) + FROM pg_depend d + JOIN pg_extension e ON d.refobjid = e.oid + WHERE d.objid = pr.oid + ) AS dependsonextensions, pg_catalog.pg_get_function_sqlbody(pr.oid) AS prosrc_sql, CASE WHEN pr.prosqlbody IS NOT NULL THEN true ELSE false END as is_pure_sql, ( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/update.sql index 8de573c55ce..307fa18ed32 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/update.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/update.sql @@ -121,4 +121,20 @@ ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }} SET SCHEMA {{ conn|qtIdent(data.pronamespace) }}; {% endif -%} +{% set old_exts = (o_data.dependsonextensions or []) | list %} +{% set new_exts = data.dependsonextensions if 'dependsonextensions' in data else None %} + +{% if new_exts is not none and old_exts != new_exts %} +{% for ext in (old_exts + new_exts) | unique %} + +{% if ext in new_exts and ext not in old_exts %} +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({{ o_data.proargtypenames }}) + DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% elif ext in old_exts and ext not in new_exts %} +ALTER PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}({{ o_data.proargtypenames }}) + NO DEPENDS ON EXTENSION {{ conn|qtIdent(ext) }}; +{% endif %} +{% endfor %} +{% endif %} + {% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_func_remove_partial_pri.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_func_remove_partial_pri.msql new file mode 100644 index 00000000000..4fda4373313 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_func_remove_partial_pri.msql @@ -0,0 +1 @@ +REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_func_remove_partial_pri.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_func_remove_partial_pri.sql new file mode 100644 index 00000000000..d31d790cd11 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_func_remove_partial_pri.sql @@ -0,0 +1,23 @@ +-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#() + +-- DROP FUNCTION IF EXISTS public."Function2_$%{}[]()&*^!@""'`\/#"(); + +CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"( + ) + RETURNS character varying + LANGUAGE 'plpgsql' + COST 100 + VOLATILE PARALLEL UNSAFE + SET enable_sort='true' +AS $BODY$ +begin +select '1'; +end +$BODY$; + +ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() + OWNER TO postgres; + +GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO postgres; + +REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_add_priv.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_add_priv.msql new file mode 100644 index 00000000000..9f6362a8a5d --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_add_priv.msql @@ -0,0 +1,3 @@ +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO postgres; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_add_priv.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_add_priv.sql new file mode 100644 index 00000000000..8472d26f032 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_add_priv.sql @@ -0,0 +1,23 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + i1 integer) +LANGUAGE 'plpgsql' + SET application_name='pgadmin' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO postgres; + +COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + IS 'some comment'; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_change_grantee_priv.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_change_grantee_priv.msql index 67a549ead4b..c5055f4c59f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_change_grantee_priv.msql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_change_grantee_priv.msql @@ -1,13 +1,3 @@ -CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(IN i1 integer) - LANGUAGE 'plpgsql' - - SET application_name='pgadmin' -AS $BODY$ -begin -select 1; -end; -$BODY$; - REVOKE ALL ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) FROM postgres; -GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_delete_priv.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_delete_priv.msql new file mode 100644 index 00000000000..b1662bf7f1a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_delete_priv.msql @@ -0,0 +1 @@ +REVOKE ALL ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) FROM PUBLIC; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_delete_priv.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_delete_priv.sql new file mode 100644 index 00000000000..0c429dac9fb --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_delete_priv.sql @@ -0,0 +1,23 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + i1 integer) +LANGUAGE 'plpgsql' + SET application_name='pgadmin' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO postgres; + +REVOKE ALL ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) FROM PUBLIC; + +COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + IS 'some comment'; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_procedure.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_procedure.msql new file mode 100644 index 00000000000..390e7b822c8 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_procedure.msql @@ -0,0 +1,10 @@ +CREATE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_function.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_function.json index 217330ad9a0..61f39447433 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_function.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_function.json @@ -234,7 +234,9 @@ } ] } - } + }, + "expected_sql_file": "alter_func_remove_partial_pri.sql", + "expected_msql_file": "alter_func_remove_partial_pri.msql" }, { "type": "alter", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_procedures.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_procedures.json index cf0996aabd9..7a3d54d6468 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_procedures.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_procedures.json @@ -5,6 +5,7 @@ "name": "Create procedure", "endpoint": "NODE-procedure.obj", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql", "data": { "name": "Proc1_$%{}[]()&*^!@\"'`\\/#", "acl": [], @@ -24,22 +25,27 @@ "proleakproof": false, "probin": "$libdir/" }, - "expected_sql_file": "create_procedure.sql" - }, { + "expected_sql_file": "create_procedure.sql", + "expected_msql_file": "create_procedure.msql" + }, + { "type": "alter", "name": "Alter procedure comment", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "description": "some comment" }, "expected_sql_file": "alter_proc_comment.sql", "expected_msql_file": "alter_proc_comment_msql.sql" - }, { + }, + { "type": "alter", "name": "Alter procedure param", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "variables": { "added": [{"name": "application_name", "value": "pgadmin"}] @@ -53,6 +59,7 @@ "name": "Alter procedure add privileges", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "acl": { "added": [ @@ -80,13 +87,16 @@ } ] } - } + }, + "expected_sql_file": "alter_proc_add_priv.sql", + "expected_msql_file": "alter_proc_add_priv.msql" }, { "type": "alter", "name": "Alter procedure delete privileges", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "acl": { "deleted": [ @@ -103,13 +113,16 @@ } ] } - } + }, + "expected_sql_file": "alter_proc_delete_priv.sql", + "expected_msql_file": "alter_proc_delete_priv.msql" }, { "type": "alter", "name": "Alter procedure change privileges", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "acl": { "changed": [ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/alter_proc_no_depends.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/alter_proc_no_depends.msql new file mode 100644 index 00000000000..b7e7249418d --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/alter_proc_no_depends.msql @@ -0,0 +1,2 @@ +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + NO DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/alter_proc_no_depends.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/alter_proc_no_depends.sql new file mode 100644 index 00000000000..632073e31b9 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/alter_proc_no_depends.sql @@ -0,0 +1,18 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/create_procedure_on_depends.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/create_procedure_on_depends.msql new file mode 100644 index 00000000000..d6bb2b07557 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/create_procedure_on_depends.msql @@ -0,0 +1,16 @@ +CREATE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/create_procedure_on_depends.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/create_procedure_on_depends.sql new file mode 100644 index 00000000000..ddb2b7eb669 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/create_procedure_on_depends.sql @@ -0,0 +1,21 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/test_function.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/test_function.json index 857f7d6ce87..944d1fbcf8f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/test_function.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/test_function.json @@ -9,7 +9,8 @@ "name": "postgres_fdw", "version": "", "relocatable": true - } + }, + "store_object_id": true }, { "type": "create", @@ -76,6 +77,15 @@ "data": { } }, + { + "type": "delete", + "name": "Drop Extension", + "endpoint": "NODE-extension.delete", + "data": { + "ids": [""] + }, + "preprocess_data": true + }, { "type": "create", "name": "Create function with all options.", @@ -310,7 +320,9 @@ } ] } - } + }, + "expected_sql_file": "alter_func_remove_partial_pri.sql", + "expected_msql_file": "alter_func_remove_partial_pri.msql" }, { "type": "alter", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/test_procedures.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/test_procedures.json new file mode 100644 index 00000000000..b95698ac881 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/13_plus/test_procedures.json @@ -0,0 +1,224 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Extension", + "endpoint": "NODE-extension.obj", + "sql_endpoint": "NODE-extension.sql_id", + "data": { + "name": "postgres_fdw", + "version": "", + "relocatable": true + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create procedure with extensions.", + "endpoint": "NODE-procedure.obj", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql", + "data": { + "name": "Proc1_$%{}[]()&*^!@\"'`\\/#", + "acl": [], + "arguments": [{"argtype": "integer", "argmode": "IN", "argname": "i1", "argdefval": ""}], + "funcowner": "postgres", + "lanname": "plpgsql", + "options": [], + "pronamespace": 2200, + "prosrc": "begin\nselect 1;\nend;", + "seclabels": [], + "variables": [], + "schema": "public", + "provolatile": null, + "proisstrict": false, + "proparallel": null, + "procost": null, + "proleakproof": false, + "probin": "$libdir/", + "dependsonextensions": ["plpgsql", "postgres_fdw"] + }, + "expected_sql_file": "create_procedure_on_depends.sql", + "expected_msql_file": "create_procedure_on_depends.msql" + }, + { + "type": "alter", + "name": "Alter procedure with NO DEPENDS ON", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "dependsonextensions": ["plpgsql"] + }, + "expected_sql_file": "alter_proc_no_depends.sql", + "expected_msql_file": "alter_proc_no_depends.msql" + }, + { + "type": "delete", + "name": "Drop procedure", + "endpoint": "NODE-procedure.delete_id", + "data": { + } + }, + { + "type": "delete", + "name": "Drop Extension", + "endpoint": "NODE-extension.delete", + "data": { + "ids": [""] + }, + "preprocess_data": true + }, + { + "type": "create", + "name": "Create procedure", + "endpoint": "NODE-procedure.obj", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql", + "data": { + "name": "Proc1_$%{}[]()&*^!@\"'`\\/#", + "acl": [], + "arguments": [{"argtype": "integer", "argmode": "IN", "argname": "i1", "argdefval": ""}], + "funcowner": "postgres", + "lanname": "plpgsql", + "options": [], + "pronamespace": 2200, + "prosrc": "begin\nselect 1;\nend;", + "seclabels": [], + "variables": [], + "schema": "public", + "provolatile": null, + "proisstrict": false, + "proparallel": null, + "procost": null, + "proleakproof": false, + "probin": "$libdir/" + }, + "expected_sql_file": "create_procedure.sql", + "expected_msql_file": "create_procedure.msql" + }, + { + "type": "alter", + "name": "Alter procedure comment", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "description": "some comment" + }, + "expected_sql_file": "alter_proc_comment.sql", + "expected_msql_file": "alter_proc_comment_msql.sql" + }, + { + "type": "alter", + "name": "Alter procedure param", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "variables": { + "added": [{"name": "application_name", "value": "pgadmin"}] + } + }, + "expected_sql_file": "alter_proc_param.sql", + "expected_msql_file": "alter_proc_param_msql.sql" + }, + { + "type": "alter", + "name": "Alter procedure add privileges", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "acl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege": true, + "privilege_type": "X", + "with_grant": false + } + ] + }, + { + "grantee": "postgres", + "grantor": "postgres", + "privileges": [ + { + "privilege": true, + "privilege_type": "X", + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_proc_add_priv.sql", + "expected_msql_file": "alter_proc_add_priv.msql" + }, + { + "type": "alter", + "name": "Alter procedure delete privileges", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "acl": { + "deleted": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege": true, + "privilege_type": "X", + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_proc_delete_priv.sql", + "expected_msql_file": "alter_proc_delete_priv.msql" + }, + { + "type": "alter", + "name": "Alter procedure change privileges", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "acl": { + "changed": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "old_grantee": "postgres", + "privileges": [ + { + "privilege": true, + "privilege_type": "X", + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_proc_change_grantee_priv.sql", + "expected_msql_file": "alter_proc_change_grantee_priv.msql" + }, + { + "type": "delete", + "name": "Drop procedure", + "endpoint": "NODE-procedure.delete_id", + "data": { + } + } + ] +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_add_priv.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_add_priv.msql new file mode 100644 index 00000000000..9f6362a8a5d --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_add_priv.msql @@ -0,0 +1,3 @@ +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO postgres; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_add_priv.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_add_priv.sql new file mode 100644 index 00000000000..6d2d05f8f78 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_add_priv.sql @@ -0,0 +1,22 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + IN i1 integer) +LANGUAGE 'plpgsql' + SET application_name='pgadmin' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO postgres; + +COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + IS 'some comment'; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_delete_priv.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_delete_priv.msql new file mode 100644 index 00000000000..b1662bf7f1a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_delete_priv.msql @@ -0,0 +1 @@ +REVOKE ALL ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) FROM PUBLIC; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_delete_priv.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_delete_priv.sql new file mode 100644 index 00000000000..54ed1a4ce52 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_delete_priv.sql @@ -0,0 +1,22 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + IN i1 integer) +LANGUAGE 'plpgsql' + SET application_name='pgadmin' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO postgres; + +REVOKE ALL ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) FROM PUBLIC; + +COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + IS 'some comment'; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_no_depends.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_no_depends.msql new file mode 100644 index 00000000000..b7e7249418d --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_no_depends.msql @@ -0,0 +1,2 @@ +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + NO DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_no_depends.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_no_depends.sql new file mode 100644 index 00000000000..c5ecff1e222 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/alter_proc_no_depends.sql @@ -0,0 +1,17 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_atomic_func.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_atomic_func.sql index 175b4b6aabe..3218799f080 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_atomic_func.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_atomic_func.sql @@ -14,4 +14,4 @@ BEGIN ATOMIC END; ALTER FUNCTION public."Function4_$%{}[]()&*^!@""'`\/#"() - OWNER TO postgres; + OWNER TO postgres; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_atomic_proc.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_atomic_proc.msql index 6d6399cb510..15e27782825 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_atomic_proc.msql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_atomic_proc.msql @@ -1,4 +1,4 @@ -CREATE PROCEDURE public."Proc3_$%{}[]()&*^!@"'`\/#"() +CREATE PROCEDURE public."Proc3_$%{}[]()&*^!@""'`\/#"() LANGUAGE 'sql' SET application_name='demo' @@ -6,5 +6,8 @@ begin atomic select 1; end; -COMMENT ON PROCEDURE public."Proc3_$%{}[]()&*^!@"'`\/#"() +ALTER PROCEDURE public."Proc3_$%{}[]()&*^!@""'`\/#"() + OWNER TO postgres; + +COMMENT ON PROCEDURE public."Proc3_$%{}[]()&*^!@""'`\/#"() IS 'demo comments'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_procedure.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_procedure.msql new file mode 100644 index 00000000000..10f1d3687f9 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_procedure.msql @@ -0,0 +1,9 @@ +CREATE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_procedure_on_depends.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_procedure_on_depends.msql new file mode 100644 index 00000000000..fc7d54c28a0 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_procedure_on_depends.msql @@ -0,0 +1,15 @@ +CREATE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_procedure_on_depends.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_procedure_on_depends.sql new file mode 100644 index 00000000000..82cf5aa3487 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/create_procedure_on_depends.sql @@ -0,0 +1,20 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO postgres; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/test_function.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/test_function.json index cfa30eb685d..39c720ecd29 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/test_function.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/test_function.json @@ -9,7 +9,8 @@ "name": "postgres_fdw", "version": "", "relocatable": true - } + }, + "store_object_id": true }, { "type": "create", @@ -76,6 +77,15 @@ "data": { } }, + { + "type": "delete", + "name": "Drop Extension", + "endpoint": "NODE-extension.delete", + "data": { + "ids": [""] + }, + "preprocess_data": true + }, { "type": "create", "name": "Create function with all options.", @@ -310,7 +320,9 @@ } ] } - } + }, + "expected_sql_file": "alter_func_remove_partial_pri.sql", + "expected_msql_file": "alter_func_remove_partial_pri.msql" }, { "type": "alter", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/test_procedures.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/test_procedures.json index 00c37d4e13d..67c1976d5bc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/test_procedures.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/14_plus/test_procedures.json @@ -1,10 +1,80 @@ { "scenarios": [ + { + "type": "create", + "name": "Create Extension", + "endpoint": "NODE-extension.obj", + "sql_endpoint": "NODE-extension.sql_id", + "data": { + "name": "postgres_fdw", + "version": "", + "relocatable": true + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create procedure with extensions.", + "endpoint": "NODE-procedure.obj", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql", + "data": { + "name": "Proc1_$%{}[]()&*^!@\"'`\\/#", + "acl": [], + "arguments": [{"argtype": "integer", "argmode": "IN", "argname": "i1", "argdefval": ""}], + "funcowner": "postgres", + "lanname": "plpgsql", + "options": [], + "pronamespace": 2200, + "prosrc": "begin\nselect 1;\nend;", + "seclabels": [], + "variables": [], + "schema": "public", + "provolatile": null, + "proisstrict": false, + "proparallel": null, + "procost": null, + "proleakproof": false, + "probin": "$libdir/", + "dependsonextensions": ["plpgsql", "postgres_fdw"] + }, + "expected_sql_file": "create_procedure_on_depends.sql", + "expected_msql_file": "create_procedure_on_depends.msql" + }, + { + "type": "alter", + "name": "Alter procedure with NO DEPENDS ON", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "dependsonextensions": ["plpgsql"] + }, + "expected_sql_file": "alter_proc_no_depends.sql", + "expected_msql_file": "alter_proc_no_depends.msql" + }, + { + "type": "delete", + "name": "Drop procedure", + "endpoint": "NODE-procedure.delete_id", + "data": { + } + }, + { + "type": "delete", + "name": "Drop Extension", + "endpoint": "NODE-extension.delete", + "data": { + "ids": [""] + }, + "preprocess_data": true + }, { "type": "create", "name": "Create procedure", "endpoint": "NODE-procedure.obj", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql", "data": { "name": "Proc1_$%{}[]()&*^!@\"'`\\/#", "acl": [], @@ -24,12 +94,14 @@ "proleakproof": false, "probin": "$libdir/" }, - "expected_sql_file": "create_procedure.sql" + "expected_sql_file": "create_procedure.sql", + "expected_msql_file": "create_procedure.msql" }, { "type": "alter", "name": "Alter procedure comment", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "description": "some comment" }, @@ -40,6 +112,7 @@ "name": "Alter procedure param", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "variables": { "added": [{"name": "application_name", "value": "pgadmin"}] @@ -53,6 +126,7 @@ "name": "Alter procedure add privileges", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "acl": { "added": [ @@ -80,13 +154,16 @@ } ] } - } + }, + "expected_sql_file": "alter_proc_add_priv.sql", + "expected_msql_file": "alter_proc_add_priv.msql" }, { "type": "alter", "name": "Alter procedure delete privileges", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "acl": { "deleted": [ @@ -103,13 +180,16 @@ } ] } - } + }, + "expected_sql_file": "alter_proc_delete_priv.sql", + "expected_msql_file": "alter_proc_delete_priv.msql" }, { "type": "alter", "name": "Alter procedure change privileges", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "acl": { "changed": [ @@ -143,6 +223,7 @@ "name": "Create procedure (atomic)", "endpoint": "NODE-procedure.obj", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql", "data": { "name":"Proc3_$%{}[]()&*^!@\"'`\\/#", "funcowner":"postgres", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_func_remove_partial_pri.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_func_remove_partial_pri.msql new file mode 100644 index 00000000000..4fda4373313 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_func_remove_partial_pri.msql @@ -0,0 +1 @@ +REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_func_remove_partial_pri.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_func_remove_partial_pri.sql new file mode 100644 index 00000000000..a4ce502c135 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_func_remove_partial_pri.sql @@ -0,0 +1,23 @@ +-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#() + +-- DROP FUNCTION IF EXISTS public."Function2_$%{}[]()&*^!@""'`\/#"(); + +CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"( + ) + RETURNS character varying + LANGUAGE 'plpgsql' + COST 100 + VOLATILE SECURITY DEFINER PARALLEL UNSAFE + SET enable_sort='true' +AS $BODY$ +begin +select '1'; +end +$BODY$; + +ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() + OWNER TO enterprisedb; + +GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO enterprisedb; + +REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_parameter.msql index 900e3a9cd03..0b48852ba37 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_parameter.msql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_parameter.msql @@ -2,12 +2,13 @@ CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"() RETURNS character varying LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER - + PARALLEL UNSAFE COST 100 + SET application_name='appname' SET enable_sort='true' AS $BODY$ begin select '2'; end -$BODY$; +$BODY$; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_add_priv.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_add_priv.msql new file mode 100644 index 00000000000..23bc0f422af --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_add_priv.msql @@ -0,0 +1,3 @@ +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO enterprisedb; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_add_priv.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_add_priv.sql new file mode 100644 index 00000000000..0deb3c0f07f --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_add_priv.sql @@ -0,0 +1,23 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + i1 integer) +LANGUAGE 'plpgsql' + SET application_name='pgadmin' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO enterprisedb; + +COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + IS 'some comment'; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_change_grantee_priv.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_change_grantee_priv.msql index 5577b14cc47..be3dbd0a66a 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_change_grantee_priv.msql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_change_grantee_priv.msql @@ -1,13 +1,3 @@ -CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(IN i1 integer) - LANGUAGE 'plpgsql' - - SET application_name='pgadmin' -AS $BODY$ -begin -select 1; -end; -$BODY$; - REVOKE ALL ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) FROM enterprisedb; -GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_delete_priv.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_delete_priv.msql new file mode 100644 index 00000000000..b1662bf7f1a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_delete_priv.msql @@ -0,0 +1 @@ +REVOKE ALL ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) FROM PUBLIC; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_delete_priv.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_delete_priv.sql new file mode 100644 index 00000000000..6595b00c849 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_delete_priv.sql @@ -0,0 +1,23 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + i1 integer) +LANGUAGE 'plpgsql' + SET application_name='pgadmin' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO enterprisedb; + +REVOKE ALL ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) FROM PUBLIC; + +COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + IS 'some comment'; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_procedure.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_procedure.msql new file mode 100644 index 00000000000..96271e0e22c --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_procedure.msql @@ -0,0 +1,10 @@ +CREATE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/test_function.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/test_function.json index 25f346a0444..98649f2287f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/test_function.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/test_function.json @@ -246,7 +246,9 @@ } ] } - } + }, + "expected_sql_file": "alter_func_remove_partial_pri.sql", + "expected_msql_file": "alter_func_remove_partial_pri.msql" }, { "type": "alter", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/alter_proc_no_depends.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/alter_proc_no_depends.msql new file mode 100644 index 00000000000..b7e7249418d --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/alter_proc_no_depends.msql @@ -0,0 +1,2 @@ +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + NO DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/alter_proc_no_depends.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/alter_proc_no_depends.sql new file mode 100644 index 00000000000..3290c13f158 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/alter_proc_no_depends.sql @@ -0,0 +1,18 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/create_procedure_on_depends.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/create_procedure_on_depends.msql new file mode 100644 index 00000000000..b826da50ac1 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/create_procedure_on_depends.msql @@ -0,0 +1,16 @@ +CREATE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/create_procedure_on_depends.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/create_procedure_on_depends.sql new file mode 100644 index 00000000000..b715b914e92 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/create_procedure_on_depends.sql @@ -0,0 +1,21 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/test_function.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/test_function.json index 2ab43d30b4c..5f5c3b59a44 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/test_function.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/test_function.json @@ -9,7 +9,8 @@ "name": "postgres_fdw", "version": "", "relocatable": true - } + }, + "store_object_id": true }, { "type": "create", @@ -76,6 +77,15 @@ "data": { } }, + { + "type": "delete", + "name": "Drop Extension", + "endpoint": "NODE-extension.delete", + "data": { + "ids": [""] + }, + "preprocess_data": true + }, { "type": "create", "name": "Create function with all options.", @@ -202,7 +212,8 @@ ] } }, - "expected_sql_file": "alter_function_add_parameter.sql" + "expected_sql_file": "alter_function_add_parameter.sql", + "expected_msql_file": "alter_function_add_parameter.msql" }, { "type": "alter", @@ -322,7 +333,9 @@ } ] } - } + }, + "expected_sql_file": "alter_func_remove_partial_pri.sql", + "expected_msql_file": "alter_func_remove_partial_pri.msql" }, { "type": "alter", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/test_procedures.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/test_procedures.json new file mode 100644 index 00000000000..a5449a5bc00 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/13_plus/test_procedures.json @@ -0,0 +1,155 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create procedure", + "endpoint": "NODE-procedure.obj", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql", + "data": { + "name": "Proc1_$%{}[]()&*^!@\"'`\\/#", + "acl": [], + "arguments": [{"argtype": "integer", "argmode": "IN", "argname": "i1", "argdefval": ""}], + "funcowner": "enterprisedb", + "lanname": "plpgsql", + "options": [], + "pronamespace": 2200, + "prosrc": "begin\nselect 1;\nend;", + "seclabels": [], + "variables": [], + "schema": "public", + "provolatile": null, + "proisstrict": false, + "proparallel": null, + "procost": null, + "proleakproof": false, + "probin": "$libdir/" + }, + "expected_sql_file": "create_procedure.sql", + "expected_msql_file": "create_procedure.msql" + }, + { + "type": "alter", + "name": "Alter procedure comment", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "description": "some comment" + }, + "expected_sql_file": "alter_proc_comment.sql", + "expected_msql_file": "alter_proc_comment_msql.sql" + }, + { + "type": "alter", + "name": "Alter procedure param", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "variables": { + "added": [{"name": "application_name", "value": "pgadmin"}] + } + }, + "expected_sql_file": "alter_proc_param.sql", + "expected_msql_file": "alter_proc_param_msql.sql" + }, + { + "type": "alter", + "name": "Alter procedure add privileges", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "acl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [ + { + "privilege": true, + "privilege_type": "X", + "with_grant": false + } + ] + }, + { + "grantee": "enterprisedb", + "grantor": "enterprisedb", + "privileges": [ + { + "privilege": true, + "privilege_type": "X", + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_proc_add_priv.sql", + "expected_msql_file": "alter_proc_add_priv.msql" + }, + { + "type": "alter", + "name": "Alter procedure delete privileges", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "acl": { + "deleted": [ + { + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [ + { + "privilege": true, + "privilege_type": "X", + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_proc_delete_priv.sql", + "expected_msql_file": "alter_proc_delete_priv.msql" + }, + { + "type": "alter", + "name": "Alter procedure change privileges", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "acl": { + "changed": [ + { + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "old_grantee": "enterprisedb", + "privileges": [ + { + "privilege": true, + "privilege_type": "X", + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_proc_change_grantee_priv.sql", + "expected_msql_file": "alter_proc_change_grantee_priv.msql" + }, + { + "type": "delete", + "name": "Drop procedure", + "endpoint": "NODE-procedure.delete_id", + "data": { + } + } + ] +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_add_priv.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_add_priv.msql new file mode 100644 index 00000000000..23bc0f422af --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_add_priv.msql @@ -0,0 +1,3 @@ +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO enterprisedb; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_add_priv.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_add_priv.sql new file mode 100644 index 00000000000..4d0cb5e0fb0 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_add_priv.sql @@ -0,0 +1,22 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + IN i1 integer) +LANGUAGE 'plpgsql' + SET application_name='pgadmin' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO PUBLIC; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO enterprisedb; + +COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + IS 'some comment'; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_delete_priv.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_delete_priv.msql new file mode 100644 index 00000000000..b1662bf7f1a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_delete_priv.msql @@ -0,0 +1 @@ +REVOKE ALL ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) FROM PUBLIC; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_delete_priv.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_delete_priv.sql new file mode 100644 index 00000000000..c7bf30cb3aa --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_delete_priv.sql @@ -0,0 +1,22 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + IN i1 integer) +LANGUAGE 'plpgsql' + SET application_name='pgadmin' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; + +GRANT EXECUTE ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) TO enterprisedb; + +REVOKE ALL ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) FROM PUBLIC; + +COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + IS 'some comment'; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_no_depends.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_no_depends.msql new file mode 100644 index 00000000000..b7e7249418d --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_no_depends.msql @@ -0,0 +1,2 @@ +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + NO DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_no_depends.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_no_depends.sql new file mode 100644 index 00000000000..d755deb7c39 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/alter_proc_no_depends.sql @@ -0,0 +1,17 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_atomic_proc.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_atomic_proc.msql index 6d6399cb510..c11fd60d0a5 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_atomic_proc.msql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_atomic_proc.msql @@ -1,4 +1,4 @@ -CREATE PROCEDURE public."Proc3_$%{}[]()&*^!@"'`\/#"() +CREATE PROCEDURE public."Proc3_$%{}[]()&*^!@""'`\/#"() LANGUAGE 'sql' SET application_name='demo' @@ -6,5 +6,8 @@ begin atomic select 1; end; -COMMENT ON PROCEDURE public."Proc3_$%{}[]()&*^!@"'`\/#"() - IS 'demo comments'; +ALTER PROCEDURE public."Proc3_$%{}[]()&*^!@""'`\/#"() + OWNER TO enterprisedb; + +COMMENT ON PROCEDURE public."Proc3_$%{}[]()&*^!@""'`\/#"() + IS 'demo comments'; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_procedure.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_procedure.msql new file mode 100644 index 00000000000..c71cd0996b8 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_procedure.msql @@ -0,0 +1,9 @@ +CREATE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_procedure_on_depends.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_procedure_on_depends.msql new file mode 100644 index 00000000000..74578465663 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_procedure_on_depends.msql @@ -0,0 +1,15 @@ +CREATE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_procedure_on_depends.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_procedure_on_depends.sql new file mode 100644 index 00000000000..8571364c2be --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/create_procedure_on_depends.sql @@ -0,0 +1,20 @@ +-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer) + +-- DROP PROCEDURE IF EXISTS public."Proc1_$%{}[]()&*^!@""'`\/#"(integer); + +CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( + IN i1 integer) +LANGUAGE 'plpgsql' +AS $BODY$ +begin +select 1; +end; +$BODY$; +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + OWNER TO enterprisedb; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION plpgsql; + +ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer) + DEPENDS ON EXTENSION postgres_fdw; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/test_function.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/test_function.json index 135b9cece0b..03ac4022308 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/test_function.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/test_function.json @@ -9,7 +9,8 @@ "name": "postgres_fdw", "version": "", "relocatable": true - } + }, + "store_object_id": true }, { "type": "create", @@ -76,6 +77,15 @@ "data": { } }, + { + "type": "delete", + "name": "Drop Extension", + "endpoint": "NODE-extension.delete", + "data": { + "ids": [""] + }, + "preprocess_data": true + }, { "type": "create", "name": "Create function with all options.", @@ -202,7 +212,8 @@ ] } }, - "expected_sql_file": "alter_function_add_parameter.sql" + "expected_sql_file": "alter_function_add_parameter.sql", + "expected_msql_file": "alter_function_add_parameter.msql" }, { "type": "alter", @@ -322,7 +333,9 @@ } ] } - } + }, + "expected_sql_file": "alter_func_remove_partial_pri.sql", + "expected_msql_file": "alter_func_remove_partial_pri.msql" }, { "type": "alter", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/test_procedures.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/test_procedures.json index 708d1d80e7e..e65f8d6f513 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/test_procedures.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/14_plus/test_procedures.json @@ -1,10 +1,80 @@ { "scenarios": [ + { + "type": "create", + "name": "Create Extension", + "endpoint": "NODE-extension.obj", + "sql_endpoint": "NODE-extension.sql_id", + "data": { + "name": "postgres_fdw", + "version": "", + "relocatable": true + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create procedure with extensions.", + "endpoint": "NODE-procedure.obj", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql", + "data": { + "name": "Proc1_$%{}[]()&*^!@\"'`\\/#", + "acl": [], + "arguments": [{"argtype": "integer", "argmode": "IN", "argname": "i1", "argdefval": ""}], + "funcowner": "enterprisedb", + "lanname": "plpgsql", + "options": [], + "pronamespace": 2200, + "prosrc": "begin\nselect 1;\nend;", + "seclabels": [], + "variables": [], + "schema": "public", + "provolatile": null, + "proisstrict": false, + "proparallel": null, + "procost": null, + "proleakproof": false, + "probin": "$libdir/", + "dependsonextensions": ["plpgsql", "postgres_fdw"] + }, + "expected_sql_file": "create_procedure_on_depends.sql", + "expected_msql_file": "create_procedure_on_depends.msql" + }, + { + "type": "alter", + "name": "Alter procedure with NO DEPENDS ON", + "endpoint": "NODE-procedure.obj_id", + "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", + "data": { + "dependsonextensions": ["plpgsql"] + }, + "expected_sql_file": "alter_proc_no_depends.sql", + "expected_msql_file": "alter_proc_no_depends.msql" + }, + { + "type": "delete", + "name": "Drop procedure", + "endpoint": "NODE-procedure.delete_id", + "data": { + } + }, + { + "type": "delete", + "name": "Drop Extension", + "endpoint": "NODE-extension.delete", + "data": { + "ids": [""] + }, + "preprocess_data": true + }, { "type": "create", "name": "Create procedure", "endpoint": "NODE-procedure.obj", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql", "data": { "name": "Proc1_$%{}[]()&*^!@\"'`\\/#", "acl": [], @@ -24,22 +94,27 @@ "proleakproof": false, "probin": "$libdir/" }, - "expected_sql_file": "create_procedure.sql" - }, { + "expected_sql_file": "create_procedure.sql", + "expected_msql_file": "create_procedure.msql" + }, + { "type": "alter", "name": "Alter procedure comment", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "description": "some comment" }, "expected_sql_file": "alter_proc_comment.sql", "expected_msql_file": "alter_proc_comment_msql.sql" - }, { + }, + { "type": "alter", "name": "Alter procedure param", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "variables": { "added": [{"name": "application_name", "value": "pgadmin"}] @@ -53,6 +128,7 @@ "name": "Alter procedure add privileges", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "acl": { "added": [ @@ -80,13 +156,16 @@ } ] } - } + }, + "expected_sql_file": "alter_proc_add_priv.sql", + "expected_msql_file": "alter_proc_add_priv.msql" }, { "type": "alter", "name": "Alter procedure delete privileges", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "acl": { "deleted": [ @@ -103,13 +182,16 @@ } ] } - } + }, + "expected_sql_file": "alter_proc_delete_priv.sql", + "expected_msql_file": "alter_proc_delete_priv.msql" }, { "type": "alter", "name": "Alter procedure change privileges", "endpoint": "NODE-procedure.obj_id", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql_id", "data": { "acl": { "changed": [ @@ -143,6 +225,7 @@ "name": "Create procedure (atomic)", "endpoint": "NODE-procedure.obj", "sql_endpoint": "NODE-procedure.sql_id", + "msql_endpoint": "NODE-procedure.msql", "data": { "name":"Proc3_$%{}[]()&*^!@\"'`\\/#", "funcowner":"enterprisedb", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_add.py index 6bd46c5e7fc..184a71636b6 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_add.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_add.py @@ -62,6 +62,7 @@ def runTest(self): "prosrc": "BEGIN RAISE EXCEPTION 'command % is disabled'," " tg_tag; END;", "seclabels": [], + "dependsonextensions": ["plpgsql"], "variables": [ { "name": "enable_sort", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_put.py index 45567773946..e0565afc218 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_put.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_put.py @@ -43,7 +43,8 @@ def runTest(self): proc_id = proc_info[0] data = { "description": "This is procedure update comment", - "id": proc_id + "id": proc_id, + "dependsonextensions": ["plpgsql"] } put_response = self.tester.put(