public inbox for [email protected]
help / color / mirror / Atom feed[pgAdmin][RM5395]: [Housekeeping]-Add RE-SQL/MSQL test cases for Functions
2+ messages / 2 participants
[nested] [flat]
* [pgAdmin][RM5395]: [Housekeeping]-Add RE-SQL/MSQL test cases for Functions
@ 2020-10-05 12:54 Nikhil Mohite <[email protected]>
2020-10-06 12:07 ` Re: [pgAdmin][RM5395]: [Housekeeping]-Add RE-SQL/MSQL test cases for Functions Akshay Joshi <[email protected]>
0 siblings, 1 reply; 2+ messages in thread
From: Nikhil Mohite @ 2020-10-05 12:54 UTC (permalink / raw)
To: pgadmin-hackers
Hi Team,
I have added a few more RE-SQL/MSQL test cases as per RM-5395
<https://redmine.postgresql.org/issues/5395;.
PFA patch.
--
*Thanks & Regards,*
*Nikhil Mohite*
*Software Engineer.*
*EDB Postgres* <https://www.enterprisedb.com/;
*Mob.No: +91-7798364578.*
Attachments:
[application/octet-stream] RM_5395.patch (178.7K, 3-RM_5395.patch)
download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/pg/sql/12_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/pg/sql/12_plus/create.sql
index 565b86f..ae886d4 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/pg/sql/12_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/pg/sql/12_plus/create.sql
@@ -32,8 +32,7 @@ CREATE{% if query_type is defined %}{{' OR REPLACE'}}{% endif %} FUNCTION {{ con
ROWS {{data.prorows}}{% endif %}
{% if data.prosupportfunc %}SUPPORT {{ data.prosupportfunc }}{% 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 }}{% endif %}{% endfor %}
+SET {{ conn|qtIdent(v.name) }}={% if v.name in exclude_quoting %}{{ v.value }}{% else %}{{ v.value|qtLiteral }}{% endif %}{% endfor %}
{% endif %}
AS {% if data.lanname == 'c' %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/12_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/12_plus/create.sql
index 99b64e3..605fdf0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/12_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/12_plus/create.sql
@@ -19,17 +19,16 @@ CREATE{% if query_type is defined %}{{' OR REPLACE'}}{% endif %} FUNCTION {{ con
LANGUAGE {{ data.lanname|qtLiteral }}
{% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %}LEAKPROOF {% endif %}
{% if data.proisstrict %}STRICT {% endif %}
-{% if data.prosecdef %}SECURITY DEFINER {% endif %}
-{% if data.proiswindow %}WINDOW {% endif %}
+{% if data.prosecdef %}SECURITY DEFINER{% endif %}
+{% if data.proiswindow %} WINDOW{% endif %}
{% if data.proparallel and (data.proparallel == 'r' or data.proparallel == 's' or data.proparallel == 'u') %}
-{% if data.proparallel == 'r' %} PARALLEL RESTRICTED{% elif data.proparallel == 's' %} PARALLEL SAFE {% elif data.proparallel == 'u' %} PARALLEL UNSAFE{% endif %}{% endif %}
+{% if data.proparallel == 'r' %} PARALLEL RESTRICTED{% elif data.proparallel == 's' %} PARALLEL SAFE{% elif data.proparallel == 'u' %} PARALLEL UNSAFE{% endif %}{% endif %}
{% if data.procost %}
COST {{data.procost}}{% endif %}{% if data.prorows and (data.prorows | int) > 0 %}
ROWS {{data.prorows}}{% endif %}
-
- {% if data.prosupportfunc %}SUPPORT {{ data.prosupportfunc }}{% endif -%}{% if data.variables %}{% for v in data.variables %}
+{% if data.prosupportfunc %}SUPPORT {{ data.prosupportfunc }}{% 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 }}{% endif %}{% endfor %}
{% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/9.6_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/9.6_plus/create.sql
index fd2383b..f59520e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/9.6_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/9.6_plus/create.sql
@@ -19,10 +19,10 @@ CREATE{% if query_type is defined %}{{' OR REPLACE'}}{% endif %} FUNCTION {{ con
LANGUAGE {{ data.lanname|qtLiteral }}
{% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %}LEAKPROOF {% endif %}
{% if data.proisstrict %}STRICT {% endif %}
-{% if data.prosecdef %}SECURITY DEFINER {% endif %}
-{% if data.proiswindow %}WINDOW {% endif %}
+{% if data.prosecdef %}SECURITY DEFINER{% endif %}
+{% if data.proiswindow %} WINDOW{% endif %}
{% if data.proparallel and (data.proparallel == 'r' or data.proparallel == 's' or data.proparallel == 'u') %}
-{% if data.proparallel == 'r' %} PARALLEL RESTRICTED{% elif data.proparallel == 's' %} PARALLEL SAFE {% elif data.proparallel == 'u' %} PARALLEL UNSAFE{% endif %}{% endif %}
+{% if data.proparallel == 'r' %} PARALLEL RESTRICTED{% elif data.proparallel == 's' %} PARALLEL SAFE{% elif data.proparallel == 'u' %} PARALLEL UNSAFE{% endif %}{% endif %}
{% if data.procost %}
COST {{data.procost}}{% endif %}{% if data.prorows and (data.prorows | int) > 0 %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/default/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/default/acl.sql
index ebbbe7d..822e53b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/default/acl.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/default/acl.sql
@@ -32,4 +32,5 @@ FROM
) d
LEFT JOIN pg_catalog.pg_roles g ON (d.grantor = g.oid)
LEFT JOIN pg_catalog.pg_roles gt ON (d.grantee = gt.oid)
-GROUP BY g.rolname, gt.rolname;
+GROUP BY g.rolname, gt.rolname
+ORDER BY grantee
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_acl.msql
new file mode 100644
index 0000000..82ce0c5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_acl.msql
@@ -0,0 +1 @@
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_acl.sql
new file mode 100644
index 0000000..100b8f0
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_acl.sql
@@ -0,0 +1,25 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION 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;
+
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO PUBLIC;
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_parameter.msql
new file mode 100644
index 0000000..ae35deb
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_parameter.msql
@@ -0,0 +1,13 @@
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE
+ PARALLEL UNSAFE
+ COST 100
+ SET application_name='appname'
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_parameter.sql
new file mode 100644
index 0000000..a34ddda
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_add_parameter.sql
@@ -0,0 +1,21 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE PARALLEL UNSAFE
+ SET application_name='appname'
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_comment.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_comment.msql
new file mode 100644
index 0000000..12b3a14
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_comment.msql
@@ -0,0 +1,2 @@
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_comment.sql
new file mode 100644
index 0000000..f87e09b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_comment.sql
@@ -0,0 +1,23 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_acl.msql
new file mode 100644
index 0000000..1393bd7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_acl.msql
@@ -0,0 +1,3 @@
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_acl.sql
new file mode 100644
index 0000000..b189ba6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_acl.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION 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;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_parameter.msql
new file mode 100644
index 0000000..f215838
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_parameter.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RESET application_name;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_parameter.sql
new file mode 100644
index 0000000..cd8074e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_delete_parameter.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_rename.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_rename.msql
new file mode 100644
index 0000000..8ddfca7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_rename.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ RENAME TO "Function3_$%{}[]()&*^!@""'`\/#";
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_rename.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_rename.sql
new file mode 100644
index 0000000..a5c051d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/alter_function_rename.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function.msql
new file mode 100644
index 0000000..8492738
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function.msql
@@ -0,0 +1,15 @@
+CREATE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(IN param character varying DEFAULT '1')
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL UNSAFE
+ SET enable_sort=true
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function.sql
new file mode 100644
index 0000000..e05adf5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function.sql
@@ -0,0 +1,21 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO postgres;
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function_for_alter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function_for_alter.msql
new file mode 100644
index 0000000..bfb27b3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function_for_alter.msql
@@ -0,0 +1,15 @@
+CREATE 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;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function_for_alter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function_for_alter.sql
new file mode 100644
index 0000000..b189ba6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/create_function_for_alter.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION 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;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/test_function.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/test_function.json
new file mode 100644
index 0000000..43c034d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/11_plus/test_function.json
@@ -0,0 +1,260 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create function with all options.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function1_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proretset": false,
+ "proisstrict": true,
+ "prosecdef": true,
+ "proiswindow": true,
+ "proparallel": "u",
+ "procost": "100",
+ "prorows": "0",
+ "proleakproof": true,
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function.sql",
+ "expected_msql_file": "create_function.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function comment",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "description": "Some comment"
+ },
+ "expected_sql_file": "alter_function_comment.sql",
+ "expected_msql_file": "alter_function_comment.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for alter.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function rename.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name":"Function3_$%{}[]()&*^!@\"'`\\/#"
+ },
+ "expected_sql_file": "alter_function_rename.sql",
+ "expected_msql_file": "alter_function_rename.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function code and add parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "prosrc": "begin\nselect '2';\nend\n",
+ "variables": {
+ "added": [
+ {
+ "name": "application_name",
+ "value": "appname"
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_parameter.sql",
+ "expected_msql_file": "alter_function_add_parameter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function delete parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "variables": {
+ "deleted": [
+ {
+ "name": "application_name",
+ "value": true
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_parameter.sql",
+ "expected_msql_file": "alter_function_delete_parameter.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for acl.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "added": [
+ {
+ "grantee": "postgres",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_acl.sql",
+ "expected_msql_file": "alter_function_add_acl.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "deleted": [
+ {
+ "grantee": "PUBLIC",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ },
+ {
+ "grantee": "postgres",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_acl.sql",
+ "expected_msql_file": "alter_function_delete_acl.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ }
+ ]
+}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_acl.msql
new file mode 100644
index 0000000..82ce0c5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_acl.msql
@@ -0,0 +1 @@
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_acl.sql
new file mode 100644
index 0000000..100b8f0
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_acl.sql
@@ -0,0 +1,25 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION 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;
+
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO PUBLIC;
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_parameter.msql
new file mode 100644
index 0000000..2102c33
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_parameter.msql
@@ -0,0 +1,14 @@
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE
+ PARALLEL UNSAFE
+ COST 100
+
+ SET application_name='appname'
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_parameter.sql
new file mode 100644
index 0000000..a66d0c7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_add_parameter.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE PARALLEL UNSAFE
+ SET application_name='appname'SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_comment.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_comment.msql
new file mode 100644
index 0000000..12b3a14
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_comment.msql
@@ -0,0 +1,2 @@
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_comment.sql
new file mode 100644
index 0000000..f87e09b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_comment.sql
@@ -0,0 +1,23 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_acl.msql
new file mode 100644
index 0000000..1393bd7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_acl.msql
@@ -0,0 +1,3 @@
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_acl.sql
new file mode 100644
index 0000000..b189ba6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_acl.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION 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;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_parameter.msql
new file mode 100644
index 0000000..f215838
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_parameter.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RESET application_name;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_parameter.sql
new file mode 100644
index 0000000..cd8074e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_delete_parameter.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_rename.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_rename.msql
new file mode 100644
index 0000000..8ddfca7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_rename.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ RENAME TO "Function3_$%{}[]()&*^!@""'`\/#";
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_rename.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_rename.sql
new file mode 100644
index 0000000..a5c051d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_function_rename.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_comment.sql
new file mode 100644
index 0000000..86eae9a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_comment.sql
@@ -0,0 +1,15 @@
+-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer)
+
+-- DROP PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer);
+
+CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(
+ i1 integer)
+LANGUAGE 'plpgsql'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer)
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_comment_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_comment_msql.sql
new file mode 100644
index 0000000..d48fca1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_comment_msql.sql
@@ -0,0 +1,2 @@
+COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer)
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_param.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_param.sql
new file mode 100644
index 0000000..4a8b0b1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_param.sql
@@ -0,0 +1,16 @@
+-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer)
+
+-- DROP PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer);
+
+CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(
+ i1 integer)
+LANGUAGE 'plpgsql'
+ SET application_name='pgadmin'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer)
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_param_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_param_msql.sql
new file mode 100644
index 0000000..52c0f9c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_proc_param_msql.sql
@@ -0,0 +1,2 @@
+ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer)
+ SET application_name=pgadmin;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_comment.sql
new file mode 100644
index 0000000..5f2e770
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_comment.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 100
+ VOLATILE NOT LEAKPROOF
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_set_1.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_set_1.sql
new file mode 100644
index 0000000..bf48852
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_set_1.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 100
+ STABLE LEAKPROOF STRICT SECURITY DEFINER
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_set_2.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_set_2.sql
new file mode 100644
index 0000000..c14baa2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_set_2.sql
@@ -0,0 +1,22 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 123
+ IMMUTABLE LEAKPROOF STRICT SECURITY DEFINER
+ SET application_name='appname'
+ SET search_path=public, pg_temp
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_set_3.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_set_3.sql
new file mode 100644
index 0000000..7caebc3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/alter_ptrig_set_3.sql
@@ -0,0 +1,23 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 123
+ IMMUTABLE LEAKPROOF STRICT SECURITY DEFINER
+ SET application_name='appname2'
+ SET search_path=public, pg_catalog
+ SET array_nulls='true'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_event_trigger_full.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_event_trigger_full.sql
new file mode 100644
index 0000000..1bdbb6e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_event_trigger_full.sql
@@ -0,0 +1,26 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS SETOF event_trigger
+ LANGUAGE 'plpgsql'
+ COST 1234
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
+ ROWS 4321
+ SET application_name='appname'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+GRANT EXECUTE ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() TO postgres WITH GRANT OPTION;
+
+REVOKE ALL ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function.msql
new file mode 100644
index 0000000..8492738
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function.msql
@@ -0,0 +1,15 @@
+CREATE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(IN param character varying DEFAULT '1')
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL UNSAFE
+ SET enable_sort=true
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function.sql
new file mode 100644
index 0000000..e05adf5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function.sql
@@ -0,0 +1,21 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO postgres;
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function_for_alter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function_for_alter.msql
new file mode 100644
index 0000000..bfb27b3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function_for_alter.msql
@@ -0,0 +1,15 @@
+CREATE 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;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function_for_alter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function_for_alter.sql
new file mode 100644
index 0000000..b189ba6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_function_for_alter.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION 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;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_plain_trigger.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_plain_trigger.sql
new file mode 100644
index 0000000..191e59c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_plain_trigger.sql
@@ -0,0 +1,17 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 100
+ VOLATILE NOT LEAKPROOF
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_plain_trigger_full.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_plain_trigger_full.sql
new file mode 100644
index 0000000..3a51119
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_plain_trigger_full.sql
@@ -0,0 +1,27 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS SETOF trigger
+ LANGUAGE 'plpgsql'
+ COST 1234
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
+ ROWS 4321
+ SET application_name='appname'
+ SET search_path=public, pg_temp
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+GRANT EXECUTE ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() TO postgres WITH GRANT OPTION;
+
+REVOKE ALL ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_procedure.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_procedure.sql
new file mode 100644
index 0000000..c6b6482
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/create_procedure.sql
@@ -0,0 +1,12 @@
+-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer)
+
+-- DROP PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer);
+
+CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(
+ i1 integer)
+LANGUAGE 'plpgsql'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
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
new file mode 100644
index 0000000..43c034d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_function.json
@@ -0,0 +1,260 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create function with all options.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function1_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proretset": false,
+ "proisstrict": true,
+ "prosecdef": true,
+ "proiswindow": true,
+ "proparallel": "u",
+ "procost": "100",
+ "prorows": "0",
+ "proleakproof": true,
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function.sql",
+ "expected_msql_file": "create_function.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function comment",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "description": "Some comment"
+ },
+ "expected_sql_file": "alter_function_comment.sql",
+ "expected_msql_file": "alter_function_comment.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for alter.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function rename.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name":"Function3_$%{}[]()&*^!@\"'`\\/#"
+ },
+ "expected_sql_file": "alter_function_rename.sql",
+ "expected_msql_file": "alter_function_rename.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function code and add parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "prosrc": "begin\nselect '2';\nend\n",
+ "variables": {
+ "added": [
+ {
+ "name": "application_name",
+ "value": "appname"
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_parameter.sql",
+ "expected_msql_file": "alter_function_add_parameter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function delete parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "variables": {
+ "deleted": [
+ {
+ "name": "application_name",
+ "value": true
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_parameter.sql",
+ "expected_msql_file": "alter_function_delete_parameter.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for acl.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "added": [
+ {
+ "grantee": "postgres",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_acl.sql",
+ "expected_msql_file": "alter_function_add_acl.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "deleted": [
+ {
+ "grantee": "PUBLIC",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ },
+ {
+ "grantee": "postgres",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_acl.sql",
+ "expected_msql_file": "alter_function_delete_acl.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ }
+ ]
+}
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
new file mode 100644
index 0000000..dc9a445
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_procedures.json
@@ -0,0 +1,58 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create procedure",
+ "endpoint": "NODE-procedure.obj",
+ "sql_endpoint": "NODE-procedure.sql_id",
+ "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"
+ }, {
+ "type": "alter",
+ "name": "Alter procedure comment",
+ "endpoint": "NODE-procedure.obj_id",
+ "sql_endpoint": "NODE-procedure.sql_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",
+ "data": {
+ "variables": {
+ "added": [{"name": "application_name", "value": "pgadmin"}]
+ }
+ },
+ "expected_sql_file": "alter_proc_param.sql",
+ "expected_msql_file": "alter_proc_param_msql.sql"
+ }, {
+ "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/12_plus/test_trigger_functions.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_trigger_functions.json
new file mode 100644
index 0000000..a2e9fc7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/12_plus/test_trigger_functions.json
@@ -0,0 +1,191 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create trigger function",
+ "endpoint": "NODE-trigger_function.obj",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "name": "Trig1_$%{}[]()&*^!@\"'`\\/#",
+ "acl": [],
+ "args": [],
+ "funcowner": "postgres",
+ "lanname": "plpgsql",
+ "options": [],
+ "pronamespace": 2200,
+ "prorettypename": "trigger",
+ "prosrc": "begin\nselect 1;\nend;",
+ "seclabels": [],
+ "variables": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_plain_trigger.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function comment",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "description": "some comment"
+ },
+ "expected_sql_file": "alter_ptrig_comment.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function Set 1 - Strict, Leakproof, Security of definer, Volatility",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "proisstrict": true,
+ "proleakproof": true,
+ "prosecdef": true,
+ "provolatile": "s"
+ },
+ "expected_sql_file": "alter_ptrig_set_1.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function Set 2 - Cost, Volatility, Add Param",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "procost": "123",
+ "provolatile": "i",
+ "variables": {
+ "added": [{
+ "name": "application_name",
+ "value": "appname"
+ },{
+ "name": "search_path",
+ "value": "public, pg_temp"
+ }]
+ }
+ },
+ "expected_sql_file": "alter_ptrig_set_2.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function Set 3 - Add Param, Change Param",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "variables": {
+ "added": [{
+ "name": "application_name",
+ "value": "appname2"
+ }],
+ "changed": [{
+ "name": "array_nulls",
+ "value": true
+ },{
+ "name": "search_path",
+ "value": "public, pg_catalog"
+ }]
+ }
+ },
+ "expected_sql_file": "alter_ptrig_set_3.sql"
+ }, {
+ "type": "delete",
+ "name": "Drop trigger function",
+ "endpoint": "NODE-trigger_function.delete_id",
+ "data": {
+ }
+ }, {
+ "type": "create",
+ "name": "Create full fledged trigger function",
+ "endpoint": "NODE-trigger_function.obj",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "name": "Trig1_$%{}[]()&*^!@\"'`\\/#",
+ "acl": [{
+ "grantee": "postgres",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege": true,
+ "privilege_type": "X",
+ "with_grant": true
+ }
+ ]
+ }],
+ "args": [],
+ "description": "some comment",
+ "funcowner": "postgres",
+ "lanname": "plpgsql",
+ "options": [],
+ "procost": "1234",
+ "proisstrict": true,
+ "proiswindow": true,
+ "proleakproof": true,
+ "pronamespace": 2200,
+ "proretset": true,
+ "prorettypename": "trigger",
+ "prorows": "4321",
+ "prosecdef": true,
+ "provolatile": "s",
+ "prosrc": "begin\nselect 1;\nend;",
+ "seclabels": [],
+ "variables": [{
+ "name": "application_name",
+ "value": "appname"
+ },{
+ "name": "search_path",
+ "value": "public, pg_temp"
+ }],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_plain_trigger_full.sql"
+ }, {
+ "type": "delete",
+ "name": "Drop full fledged trigger function",
+ "endpoint": "NODE-trigger_function.delete_id",
+ "data": {
+ }
+ }, {
+ "type": "create",
+ "name": "Create full fledged event trigger function",
+ "endpoint": "NODE-trigger_function.obj",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "name": "Trig1_$%{}[]()&*^!@\"'`\\/#",
+ "acl": [{
+ "grantee": "postgres",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege": true,
+ "privilege_type": "X",
+ "with_grant": true
+ }
+ ]
+ }],
+ "args": [],
+ "description": "some comment",
+ "funcowner": "postgres",
+ "lanname": "plpgsql",
+ "options": [],
+ "procost": "1234",
+ "proisstrict": true,
+ "proiswindow": true,
+ "proleakproof": true,
+ "pronamespace": 2200,
+ "proretset": true,
+ "prorettypename": "event_trigger",
+ "prorows": "4321",
+ "prosecdef": true,
+ "provolatile": "s",
+ "prosrc": "begin\nselect 1;\nend;",
+ "seclabels": [],
+ "variables": [{
+ "name": "application_name",
+ "value": "appname"
+ }],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_event_trigger_full.sql"
+ }, {
+ "type": "delete",
+ "name": "Drop full fledged event trigger function",
+ "endpoint": "NODE-trigger_function.delete_id",
+ "data": {
+ }
+ }
+ ]
+}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_acl.msql
new file mode 100644
index 0000000..82ce0c5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_acl.msql
@@ -0,0 +1 @@
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_acl.sql
new file mode 100644
index 0000000..100b8f0
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_acl.sql
@@ -0,0 +1,25 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION 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;
+
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO PUBLIC;
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_parameter.msql
new file mode 100644
index 0000000..ae35deb
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_parameter.msql
@@ -0,0 +1,13 @@
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE
+ PARALLEL UNSAFE
+ COST 100
+ SET application_name='appname'
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_parameter.sql
new file mode 100644
index 0000000..a34ddda
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_add_parameter.sql
@@ -0,0 +1,21 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE PARALLEL UNSAFE
+ SET application_name='appname'
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_comment.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_comment.msql
new file mode 100644
index 0000000..12b3a14
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_comment.msql
@@ -0,0 +1,2 @@
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_comment.sql
new file mode 100644
index 0000000..f87e09b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_comment.sql
@@ -0,0 +1,23 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_acl.msql
new file mode 100644
index 0000000..1393bd7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_acl.msql
@@ -0,0 +1,3 @@
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_acl.sql
new file mode 100644
index 0000000..b189ba6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_acl.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION 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;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_parameter.msql
new file mode 100644
index 0000000..f215838
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_parameter.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RESET application_name;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_parameter.sql
new file mode 100644
index 0000000..cd8074e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_delete_parameter.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_rename.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_rename.msql
new file mode 100644
index 0000000..8ddfca7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_rename.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ RENAME TO "Function3_$%{}[]()&*^!@""'`\/#";
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_rename.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_rename.sql
new file mode 100644
index 0000000..a5c051d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_function_rename.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_comment.sql
new file mode 100644
index 0000000..5f2e770
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_comment.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 100
+ VOLATILE NOT LEAKPROOF
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_set_1.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_set_1.sql
new file mode 100644
index 0000000..bf48852
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_set_1.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 100
+ STABLE LEAKPROOF STRICT SECURITY DEFINER
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_set_2.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_set_2.sql
new file mode 100644
index 0000000..c14baa2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_set_2.sql
@@ -0,0 +1,22 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 123
+ IMMUTABLE LEAKPROOF STRICT SECURITY DEFINER
+ SET application_name='appname'
+ SET search_path=public, pg_temp
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_set_3.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_set_3.sql
new file mode 100644
index 0000000..7caebc3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/alter_ptrig_set_3.sql
@@ -0,0 +1,23 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 123
+ IMMUTABLE LEAKPROOF STRICT SECURITY DEFINER
+ SET application_name='appname2'
+ SET search_path=public, pg_catalog
+ SET array_nulls='true'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_event_trigger_full.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_event_trigger_full.sql
new file mode 100644
index 0000000..1bdbb6e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_event_trigger_full.sql
@@ -0,0 +1,26 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS SETOF event_trigger
+ LANGUAGE 'plpgsql'
+ COST 1234
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
+ ROWS 4321
+ SET application_name='appname'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+GRANT EXECUTE ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() TO postgres WITH GRANT OPTION;
+
+REVOKE ALL ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function.msql
new file mode 100644
index 0000000..8492738
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function.msql
@@ -0,0 +1,15 @@
+CREATE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(IN param character varying DEFAULT '1')
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL UNSAFE
+ SET enable_sort=true
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function.sql
new file mode 100644
index 0000000..e05adf5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function.sql
@@ -0,0 +1,21 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+
+ COST 100
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL UNSAFE
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO postgres;
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function_for_alter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function_for_alter.msql
new file mode 100644
index 0000000..bfb27b3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function_for_alter.msql
@@ -0,0 +1,15 @@
+CREATE 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;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function_for_alter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function_for_alter.sql
new file mode 100644
index 0000000..b189ba6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_function_for_alter.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION 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;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_plain_trigger.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_plain_trigger.sql
new file mode 100644
index 0000000..191e59c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_plain_trigger.sql
@@ -0,0 +1,17 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 100
+ VOLATILE NOT LEAKPROOF
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_plain_trigger_full.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_plain_trigger_full.sql
new file mode 100644
index 0000000..3a51119
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/create_plain_trigger_full.sql
@@ -0,0 +1,27 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS SETOF trigger
+ LANGUAGE 'plpgsql'
+ COST 1234
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
+ ROWS 4321
+ SET application_name='appname'
+ SET search_path=public, pg_temp
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO postgres;
+
+GRANT EXECUTE ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() TO postgres WITH GRANT OPTION;
+
+REVOKE ALL ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/test_function.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/test_function.json
new file mode 100644
index 0000000..43c034d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/test_function.json
@@ -0,0 +1,260 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create function with all options.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function1_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proretset": false,
+ "proisstrict": true,
+ "prosecdef": true,
+ "proiswindow": true,
+ "proparallel": "u",
+ "procost": "100",
+ "prorows": "0",
+ "proleakproof": true,
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function.sql",
+ "expected_msql_file": "create_function.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function comment",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "description": "Some comment"
+ },
+ "expected_sql_file": "alter_function_comment.sql",
+ "expected_msql_file": "alter_function_comment.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for alter.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function rename.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name":"Function3_$%{}[]()&*^!@\"'`\\/#"
+ },
+ "expected_sql_file": "alter_function_rename.sql",
+ "expected_msql_file": "alter_function_rename.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function code and add parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "prosrc": "begin\nselect '2';\nend\n",
+ "variables": {
+ "added": [
+ {
+ "name": "application_name",
+ "value": "appname"
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_parameter.sql",
+ "expected_msql_file": "alter_function_add_parameter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function delete parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "variables": {
+ "deleted": [
+ {
+ "name": "application_name",
+ "value": true
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_parameter.sql",
+ "expected_msql_file": "alter_function_delete_parameter.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for acl.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "added": [
+ {
+ "grantee": "postgres",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_acl.sql",
+ "expected_msql_file": "alter_function_add_acl.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "deleted": [
+ {
+ "grantee": "PUBLIC",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ },
+ {
+ "grantee": "postgres",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_acl.sql",
+ "expected_msql_file": "alter_function_delete_acl.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ }
+ ]
+}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/test_trigger_functions.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/test_trigger_functions.json
new file mode 100644
index 0000000..a2e9fc7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/9.5_plus/test_trigger_functions.json
@@ -0,0 +1,191 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create trigger function",
+ "endpoint": "NODE-trigger_function.obj",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "name": "Trig1_$%{}[]()&*^!@\"'`\\/#",
+ "acl": [],
+ "args": [],
+ "funcowner": "postgres",
+ "lanname": "plpgsql",
+ "options": [],
+ "pronamespace": 2200,
+ "prorettypename": "trigger",
+ "prosrc": "begin\nselect 1;\nend;",
+ "seclabels": [],
+ "variables": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_plain_trigger.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function comment",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "description": "some comment"
+ },
+ "expected_sql_file": "alter_ptrig_comment.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function Set 1 - Strict, Leakproof, Security of definer, Volatility",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "proisstrict": true,
+ "proleakproof": true,
+ "prosecdef": true,
+ "provolatile": "s"
+ },
+ "expected_sql_file": "alter_ptrig_set_1.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function Set 2 - Cost, Volatility, Add Param",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "procost": "123",
+ "provolatile": "i",
+ "variables": {
+ "added": [{
+ "name": "application_name",
+ "value": "appname"
+ },{
+ "name": "search_path",
+ "value": "public, pg_temp"
+ }]
+ }
+ },
+ "expected_sql_file": "alter_ptrig_set_2.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function Set 3 - Add Param, Change Param",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "variables": {
+ "added": [{
+ "name": "application_name",
+ "value": "appname2"
+ }],
+ "changed": [{
+ "name": "array_nulls",
+ "value": true
+ },{
+ "name": "search_path",
+ "value": "public, pg_catalog"
+ }]
+ }
+ },
+ "expected_sql_file": "alter_ptrig_set_3.sql"
+ }, {
+ "type": "delete",
+ "name": "Drop trigger function",
+ "endpoint": "NODE-trigger_function.delete_id",
+ "data": {
+ }
+ }, {
+ "type": "create",
+ "name": "Create full fledged trigger function",
+ "endpoint": "NODE-trigger_function.obj",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "name": "Trig1_$%{}[]()&*^!@\"'`\\/#",
+ "acl": [{
+ "grantee": "postgres",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege": true,
+ "privilege_type": "X",
+ "with_grant": true
+ }
+ ]
+ }],
+ "args": [],
+ "description": "some comment",
+ "funcowner": "postgres",
+ "lanname": "plpgsql",
+ "options": [],
+ "procost": "1234",
+ "proisstrict": true,
+ "proiswindow": true,
+ "proleakproof": true,
+ "pronamespace": 2200,
+ "proretset": true,
+ "prorettypename": "trigger",
+ "prorows": "4321",
+ "prosecdef": true,
+ "provolatile": "s",
+ "prosrc": "begin\nselect 1;\nend;",
+ "seclabels": [],
+ "variables": [{
+ "name": "application_name",
+ "value": "appname"
+ },{
+ "name": "search_path",
+ "value": "public, pg_temp"
+ }],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_plain_trigger_full.sql"
+ }, {
+ "type": "delete",
+ "name": "Drop full fledged trigger function",
+ "endpoint": "NODE-trigger_function.delete_id",
+ "data": {
+ }
+ }, {
+ "type": "create",
+ "name": "Create full fledged event trigger function",
+ "endpoint": "NODE-trigger_function.obj",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "name": "Trig1_$%{}[]()&*^!@\"'`\\/#",
+ "acl": [{
+ "grantee": "postgres",
+ "grantor": "postgres",
+ "privileges": [
+ {
+ "privilege": true,
+ "privilege_type": "X",
+ "with_grant": true
+ }
+ ]
+ }],
+ "args": [],
+ "description": "some comment",
+ "funcowner": "postgres",
+ "lanname": "plpgsql",
+ "options": [],
+ "procost": "1234",
+ "proisstrict": true,
+ "proiswindow": true,
+ "proleakproof": true,
+ "pronamespace": 2200,
+ "proretset": true,
+ "prorettypename": "event_trigger",
+ "prorows": "4321",
+ "prosecdef": true,
+ "provolatile": "s",
+ "prosrc": "begin\nselect 1;\nend;",
+ "seclabels": [],
+ "variables": [{
+ "name": "application_name",
+ "value": "appname"
+ }],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_event_trigger_full.sql"
+ }, {
+ "type": "delete",
+ "name": "Drop full fledged event trigger function",
+ "endpoint": "NODE-trigger_function.delete_id",
+ "data": {
+ }
+ }
+ ]
+}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_acl.msql
new file mode 100644
index 0000000..f5f875c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_acl.msql
@@ -0,0 +1,3 @@
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO PUBLIC;
+
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_acl.sql
new file mode 100644
index 0000000..3ddfbc5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_acl.sql
@@ -0,0 +1,24 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ 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 PUBLIC;
+
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO enterprisedb;
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_parameter.msql
new file mode 100644
index 0000000..900e3a9
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_parameter.msql
@@ -0,0 +1,13 @@
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER
+
+ COST 100
+ SET application_name='appname'
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_parameter.sql
new file mode 100644
index 0000000..87425c5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_add_parameter.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+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$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_comment.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_comment.msql
new file mode 100644
index 0000000..12b3a14
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_comment.msql
@@ -0,0 +1,2 @@
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_comment.sql
new file mode 100644
index 0000000..4831da8
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_comment.sql
@@ -0,0 +1,22 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL SAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO enterprisedb;
+
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_acl.msql
new file mode 100644
index 0000000..13bb67b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_acl.msql
@@ -0,0 +1,3 @@
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_acl.sql
new file mode 100644
index 0000000..312b0f3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_acl.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_parameter.msql
new file mode 100644
index 0000000..f215838
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_parameter.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RESET application_name;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_parameter.sql
new file mode 100644
index 0000000..442b90b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_delete_parameter.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_rename.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_rename.msql
new file mode 100644
index 0000000..8ddfca7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_rename.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ RENAME TO "Function3_$%{}[]()&*^!@""'`\/#";
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_rename.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_rename.sql
new file mode 100644
index 0000000..6dbfd64
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/alter_function_rename.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function.msql
new file mode 100644
index 0000000..05b6182
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function.msql
@@ -0,0 +1,14 @@
+CREATE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(IN param character varying DEFAULT '1')
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL SAFE
+ COST 100
+ SET enable_sort=true
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function.sql
new file mode 100644
index 0000000..0fd7edb
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL SAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function_for_alter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function_for_alter.msql
new file mode 100644
index 0000000..8016eb1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function_for_alter.msql
@@ -0,0 +1,14 @@
+CREATE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort=true
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function_for_alter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function_for_alter.sql
new file mode 100644
index 0000000..312b0f3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/create_function_for_alter.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/test_function.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/test_function.json
new file mode 100644
index 0000000..a78dc56
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/11_plus/test_function.json
@@ -0,0 +1,272 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create function with all options.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function1_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "enterprisedb",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proretset": false,
+ "proisstrict": true,
+ "prosecdef": true,
+ "proiswindow": true,
+ "proparallel": "s",
+ "procost": "100",
+ "prorows": "0",
+ "proleakproof": true,
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function.sql",
+ "expected_msql_file": "create_function.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function comment",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "description": "Some comment"
+ },
+ "expected_sql_file": "alter_function_comment.sql",
+ "expected_msql_file": "alter_function_comment.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for alter.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "enterprisedb",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "prosecdef": true,
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function rename.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function3_$%{}[]()&*^!@\"'`\\/#"
+ },
+ "expected_sql_file": "alter_function_rename.sql",
+ "expected_msql_file": "alter_function_rename.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function code and add parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "prosrc": "begin\nselect '2';\nend\n",
+ "variables": {
+ "added": [
+ {
+ "name": "application_name",
+ "value": "appname"
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_parameter.sql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function delete parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "variables": {
+ "deleted": [
+ {
+ "name": "application_name",
+ "value": true
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_parameter.sql",
+ "expected_msql_file": "alter_function_delete_parameter.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for acl.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "enterprisedb",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "prosecdef": true,
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "added": [
+ {
+ "grantee": "PUBLIC",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ },
+ {
+ "grantee": "enterprisedb",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_acl.sql",
+ "expected_msql_file": "alter_function_add_acl.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "deleted": [
+ {
+ "grantee": "PUBLIC",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ },
+ {
+ "grantee": "enterprisedb",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_acl.sql",
+ "expected_msql_file": "alter_function_delete_acl.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ }
+ ]
+}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_acl.msql
new file mode 100644
index 0000000..f5f875c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_acl.msql
@@ -0,0 +1,3 @@
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO PUBLIC;
+
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_acl.sql
new file mode 100644
index 0000000..3ddfbc5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_acl.sql
@@ -0,0 +1,24 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ 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 PUBLIC;
+
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO enterprisedb;
+
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
new file mode 100644
index 0000000..900e3a9
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_parameter.msql
@@ -0,0 +1,13 @@
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER
+
+ COST 100
+ SET application_name='appname'
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_parameter.sql
new file mode 100644
index 0000000..87425c5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_add_parameter.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+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$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_comment.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_comment.msql
new file mode 100644
index 0000000..12b3a14
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_comment.msql
@@ -0,0 +1,2 @@
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_comment.sql
new file mode 100644
index 0000000..4831da8
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_comment.sql
@@ -0,0 +1,22 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL SAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO enterprisedb;
+
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_acl.msql
new file mode 100644
index 0000000..13bb67b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_acl.msql
@@ -0,0 +1,3 @@
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_acl.sql
new file mode 100644
index 0000000..312b0f3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_acl.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_parameter.msql
new file mode 100644
index 0000000..f215838
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_parameter.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RESET application_name;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_parameter.sql
new file mode 100644
index 0000000..442b90b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_delete_parameter.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_rename.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_rename.msql
new file mode 100644
index 0000000..8ddfca7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_rename.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ RENAME TO "Function3_$%{}[]()&*^!@""'`\/#";
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_rename.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_rename.sql
new file mode 100644
index 0000000..6dbfd64
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_function_rename.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_comment.sql
new file mode 100644
index 0000000..86eae9a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_comment.sql
@@ -0,0 +1,15 @@
+-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer)
+
+-- DROP PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer);
+
+CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(
+ i1 integer)
+LANGUAGE 'plpgsql'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer)
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_comment_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_comment_msql.sql
new file mode 100644
index 0000000..d48fca1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_comment_msql.sql
@@ -0,0 +1,2 @@
+COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer)
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_param.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_param.sql
new file mode 100644
index 0000000..4a8b0b1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_param.sql
@@ -0,0 +1,16 @@
+-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer)
+
+-- DROP PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer);
+
+CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(
+ i1 integer)
+LANGUAGE 'plpgsql'
+ SET application_name='pgadmin'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+COMMENT ON PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer)
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_param_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_param_msql.sql
new file mode 100644
index 0000000..52c0f9c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_proc_param_msql.sql
@@ -0,0 +1,2 @@
+ALTER PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer)
+ SET application_name=pgadmin;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_comment.sql
new file mode 100644
index 0000000..477d572
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_comment.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 100
+ VOLATILE NOT LEAKPROOF
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_set_1.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_set_1.sql
new file mode 100644
index 0000000..91f3b18
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_set_1.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 100
+ STABLE LEAKPROOF STRICT SECURITY DEFINER
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_set_2.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_set_2.sql
new file mode 100644
index 0000000..7c7b337
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_set_2.sql
@@ -0,0 +1,22 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 123
+ IMMUTABLE LEAKPROOF STRICT SECURITY DEFINER
+ SET application_name='appname'
+ SET search_path=public, pg_temp
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_set_3.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_set_3.sql
new file mode 100644
index 0000000..f5de419
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/alter_ptrig_set_3.sql
@@ -0,0 +1,23 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 123
+ IMMUTABLE LEAKPROOF STRICT SECURITY DEFINER
+ SET application_name='appname2'
+ SET search_path=public, pg_catalog
+ SET array_nulls='true'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_event_trigger_full.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_event_trigger_full.sql
new file mode 100644
index 0000000..c9dc3d5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_event_trigger_full.sql
@@ -0,0 +1,26 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS SETOF event_trigger
+ LANGUAGE 'plpgsql'
+ COST 1234
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
+ ROWS 4321
+ SET application_name='appname'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
+
+GRANT EXECUTE ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() TO enterprisedb WITH GRANT OPTION;
+
+REVOKE ALL ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function.msql
new file mode 100644
index 0000000..05b6182
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function.msql
@@ -0,0 +1,14 @@
+CREATE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(IN param character varying DEFAULT '1')
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL SAFE
+ COST 100
+ SET enable_sort=true
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function.sql
new file mode 100644
index 0000000..0fd7edb
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL SAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function_for_alter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function_for_alter.msql
new file mode 100644
index 0000000..8016eb1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function_for_alter.msql
@@ -0,0 +1,14 @@
+CREATE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort=true
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function_for_alter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function_for_alter.sql
new file mode 100644
index 0000000..312b0f3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_function_for_alter.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_plain_trigger.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_plain_trigger.sql
new file mode 100644
index 0000000..99e66f5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_plain_trigger.sql
@@ -0,0 +1,17 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS trigger
+ LANGUAGE 'plpgsql'
+ COST 100
+ VOLATILE NOT LEAKPROOF
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_plain_trigger_full.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_plain_trigger_full.sql
new file mode 100644
index 0000000..d278a44
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_plain_trigger_full.sql
@@ -0,0 +1,27 @@
+-- FUNCTION: public.Trig1_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"();
+
+CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ RETURNS SETOF trigger
+ LANGUAGE 'plpgsql'
+ COST 1234
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
+ ROWS 4321
+ SET application_name='appname'
+ SET search_path=public, pg_temp
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
+
+ALTER FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
+
+GRANT EXECUTE ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() TO enterprisedb WITH GRANT OPTION;
+
+REVOKE ALL ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+ IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_procedure.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_procedure.sql
new file mode 100644
index 0000000..c6b6482
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/create_procedure.sql
@@ -0,0 +1,12 @@
+-- PROCEDURE: public.Proc1_$%{}[]()&*^!@"'`\/#(integer)
+
+-- DROP PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(integer);
+
+CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(
+ i1 integer)
+LANGUAGE 'plpgsql'
+AS $BODY$
+begin
+select 1;
+end;
+$BODY$;
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
new file mode 100644
index 0000000..a78dc56
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/test_function.json
@@ -0,0 +1,272 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create function with all options.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function1_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "enterprisedb",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proretset": false,
+ "proisstrict": true,
+ "prosecdef": true,
+ "proiswindow": true,
+ "proparallel": "s",
+ "procost": "100",
+ "prorows": "0",
+ "proleakproof": true,
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function.sql",
+ "expected_msql_file": "create_function.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function comment",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "description": "Some comment"
+ },
+ "expected_sql_file": "alter_function_comment.sql",
+ "expected_msql_file": "alter_function_comment.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for alter.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "enterprisedb",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "prosecdef": true,
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function rename.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function3_$%{}[]()&*^!@\"'`\\/#"
+ },
+ "expected_sql_file": "alter_function_rename.sql",
+ "expected_msql_file": "alter_function_rename.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function code and add parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "prosrc": "begin\nselect '2';\nend\n",
+ "variables": {
+ "added": [
+ {
+ "name": "application_name",
+ "value": "appname"
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_parameter.sql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function delete parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "variables": {
+ "deleted": [
+ {
+ "name": "application_name",
+ "value": true
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_parameter.sql",
+ "expected_msql_file": "alter_function_delete_parameter.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for acl.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "enterprisedb",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "prosecdef": true,
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "added": [
+ {
+ "grantee": "PUBLIC",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ },
+ {
+ "grantee": "enterprisedb",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_acl.sql",
+ "expected_msql_file": "alter_function_add_acl.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "deleted": [
+ {
+ "grantee": "PUBLIC",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ },
+ {
+ "grantee": "enterprisedb",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_acl.sql",
+ "expected_msql_file": "alter_function_delete_acl.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ }
+ ]
+}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/test_procedures.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/test_procedures.json
new file mode 100644
index 0000000..870f400
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/test_procedures.json
@@ -0,0 +1,58 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create procedure",
+ "endpoint": "NODE-procedure.obj",
+ "sql_endpoint": "NODE-procedure.sql_id",
+ "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"
+ }, {
+ "type": "alter",
+ "name": "Alter procedure comment",
+ "endpoint": "NODE-procedure.obj_id",
+ "sql_endpoint": "NODE-procedure.sql_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",
+ "data": {
+ "variables": {
+ "added": [{"name": "application_name", "value": "pgadmin"}]
+ }
+ },
+ "expected_sql_file": "alter_proc_param.sql",
+ "expected_msql_file": "alter_proc_param_msql.sql"
+ }, {
+ "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/12_plus/test_trigger_functions.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/test_trigger_functions.json
new file mode 100644
index 0000000..cc11820
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/12_plus/test_trigger_functions.json
@@ -0,0 +1,191 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create trigger function",
+ "endpoint": "NODE-trigger_function.obj",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "name": "Trig1_$%{}[]()&*^!@\"'`\\/#",
+ "acl": [],
+ "args": [],
+ "funcowner": "enterprisedb",
+ "lanname": "plpgsql",
+ "options": [],
+ "pronamespace": 2200,
+ "prorettypename": "trigger",
+ "prosrc": "begin\nselect 1;\nend;",
+ "seclabels": [],
+ "variables": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_plain_trigger.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function comment",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "description": "some comment"
+ },
+ "expected_sql_file": "alter_ptrig_comment.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function Set 1 - Strict, Leakproof, Security of definer, Volatility",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "proisstrict": true,
+ "proleakproof": true,
+ "prosecdef": true,
+ "provolatile": "s"
+ },
+ "expected_sql_file": "alter_ptrig_set_1.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function Set 2 - Cost, Volatility, Add Param",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "procost": "123",
+ "provolatile": "i",
+ "variables": {
+ "added": [{
+ "name": "application_name",
+ "value": "appname"
+ },{
+ "name": "search_path",
+ "value": "public, pg_temp"
+ }]
+ }
+ },
+ "expected_sql_file": "alter_ptrig_set_2.sql"
+ }, {
+ "type": "alter",
+ "name": "Alter trigger function Set 3 - Add Param, Change Param",
+ "endpoint": "NODE-trigger_function.obj_id",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "variables": {
+ "added": [{
+ "name": "application_name",
+ "value": "appname2"
+ }],
+ "changed": [{
+ "name": "array_nulls",
+ "value": true
+ },{
+ "name": "search_path",
+ "value": "public, pg_catalog"
+ }]
+ }
+ },
+ "expected_sql_file": "alter_ptrig_set_3.sql"
+ }, {
+ "type": "delete",
+ "name": "Drop trigger function",
+ "endpoint": "NODE-trigger_function.delete_id",
+ "data": {
+ }
+ }, {
+ "type": "create",
+ "name": "Create full fledged trigger function",
+ "endpoint": "NODE-trigger_function.obj",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "name": "Trig1_$%{}[]()&*^!@\"'`\\/#",
+ "acl": [{
+ "grantee": "enterprisedb",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege": true,
+ "privilege_type": "X",
+ "with_grant": true
+ }
+ ]
+ }],
+ "args": [],
+ "description": "some comment",
+ "funcowner": "enterprisedb",
+ "lanname": "plpgsql",
+ "options": [],
+ "procost": "1234",
+ "proisstrict": true,
+ "proiswindow": true,
+ "proleakproof": true,
+ "pronamespace": 2200,
+ "proretset": true,
+ "prorettypename": "trigger",
+ "prorows": "4321",
+ "prosecdef": true,
+ "provolatile": "s",
+ "prosrc": "begin\nselect 1;\nend;",
+ "seclabels": [],
+ "variables": [{
+ "name": "application_name",
+ "value": "appname"
+ },{
+ "name": "search_path",
+ "value": "public, pg_temp"
+ }],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_plain_trigger_full.sql"
+ }, {
+ "type": "delete",
+ "name": "Drop full fledged trigger function",
+ "endpoint": "NODE-trigger_function.delete_id",
+ "data": {
+ }
+ }, {
+ "type": "create",
+ "name": "Create full fledged event trigger function",
+ "endpoint": "NODE-trigger_function.obj",
+ "sql_endpoint": "NODE-trigger_function.sql_id",
+ "data": {
+ "name": "Trig1_$%{}[]()&*^!@\"'`\\/#",
+ "acl": [{
+ "grantee": "enterprisedb",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege": true,
+ "privilege_type": "X",
+ "with_grant": true
+ }
+ ]
+ }],
+ "args": [],
+ "description": "some comment",
+ "funcowner": "enterprisedb",
+ "lanname": "plpgsql",
+ "options": [],
+ "procost": "1234",
+ "proisstrict": true,
+ "proiswindow": true,
+ "proleakproof": true,
+ "pronamespace": 2200,
+ "proretset": true,
+ "prorettypename": "event_trigger",
+ "prorows": "4321",
+ "prosecdef": true,
+ "provolatile": "s",
+ "prosrc": "begin\nselect 1;\nend;",
+ "seclabels": [],
+ "variables": [{
+ "name": "application_name",
+ "value": "appname"
+ }],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_event_trigger_full.sql"
+ }, {
+ "type": "delete",
+ "name": "Drop full fledged event trigger function",
+ "endpoint": "NODE-trigger_function.delete_id",
+ "data": {
+ }
+ }
+ ]
+}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_acl.msql
new file mode 100644
index 0000000..f5f875c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_acl.msql
@@ -0,0 +1,3 @@
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO PUBLIC;
+
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_acl.sql
new file mode 100644
index 0000000..fa9d2c3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_acl.sql
@@ -0,0 +1,24 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER
+ COST 100
+ 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 PUBLIC;
+
+GRANT EXECUTE ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() TO enterprisedb;
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_parameter.msql
new file mode 100644
index 0000000..900e3a9
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_parameter.msql
@@ -0,0 +1,13 @@
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER
+
+ COST 100
+ SET application_name='appname'
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_parameter.sql
new file mode 100644
index 0000000..95274fe
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_add_parameter.sql
@@ -0,0 +1,20 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER
+ COST 100
+ SET application_name='appname'
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_comment.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_comment.msql
new file mode 100644
index 0000000..12b3a14
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_comment.msql
@@ -0,0 +1,2 @@
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_comment.sql
new file mode 100644
index 0000000..6cdd8d6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_comment.sql
@@ -0,0 +1,22 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO enterprisedb;
+
+COMMENT ON FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ IS 'Some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_acl.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_acl.msql
new file mode 100644
index 0000000..13bb67b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_acl.msql
@@ -0,0 +1,3 @@
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM PUBLIC;
+
+REVOKE ALL ON FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"() FROM enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_acl.sql
new file mode 100644
index 0000000..78941cc
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_acl.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_parameter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_parameter.msql
new file mode 100644
index 0000000..f215838
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_parameter.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ RESET application_name;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_parameter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_parameter.sql
new file mode 100644
index 0000000..bb15167
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_delete_parameter.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '2';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_rename.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_rename.msql
new file mode 100644
index 0000000..8ddfca7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_rename.msql
@@ -0,0 +1,2 @@
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ RENAME TO "Function3_$%{}[]()&*^!@""'`\/#";
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_rename.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_rename.sql
new file mode 100644
index 0000000..07f562e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/alter_function_rename.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function3_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function3_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function.msql
new file mode 100644
index 0000000..05b6182
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function.msql
@@ -0,0 +1,14 @@
+CREATE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(IN param character varying DEFAULT '1')
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW PARALLEL SAFE
+ COST 100
+ SET enable_sort=true
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function.sql
new file mode 100644
index 0000000..c741bde
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function1_$%{}[]()&*^!@"'`\/#(character varying)
+
+-- DROP FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying);
+
+CREATE OR REPLACE FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(
+ param character varying DEFAULT '1'::character varying)
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function1_$%{}[]()&*^!@""'`\/#"(character varying)
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function_for_alter.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function_for_alter.msql
new file mode 100644
index 0000000..8016eb1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function_for_alter.msql
@@ -0,0 +1,14 @@
+CREATE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER PARALLEL UNSAFE
+ COST 100
+ SET enable_sort=true
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function_for_alter.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function_for_alter.sql
new file mode 100644
index 0000000..78941cc
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/create_function_for_alter.sql
@@ -0,0 +1,19 @@
+-- FUNCTION: public.Function2_$%{}[]()&*^!@"'`\/#()
+
+-- DROP FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"();
+
+CREATE OR REPLACE FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"(
+ )
+RETURNS character varying
+ LANGUAGE 'plpgsql'
+ VOLATILE SECURITY DEFINER
+ COST 100
+ SET enable_sort='true'
+AS $BODY$
+begin
+select '1';
+end
+$BODY$;
+
+ALTER FUNCTION public."Function2_$%{}[]()&*^!@""'`\/#"()
+ OWNER TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/test_function.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/test_function.json
new file mode 100644
index 0000000..a78dc56
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/9.6_plus/test_function.json
@@ -0,0 +1,272 @@
+{
+ "scenarios": [
+ {
+ "type": "create",
+ "name": "Create function with all options.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function1_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "enterprisedb",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proretset": false,
+ "proisstrict": true,
+ "prosecdef": true,
+ "proiswindow": true,
+ "proparallel": "s",
+ "procost": "100",
+ "prorows": "0",
+ "proleakproof": true,
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function.sql",
+ "expected_msql_file": "create_function.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function comment",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "description": "Some comment"
+ },
+ "expected_sql_file": "alter_function_comment.sql",
+ "expected_msql_file": "alter_function_comment.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for alter.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "enterprisedb",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "prosecdef": true,
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function rename.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function3_$%{}[]()&*^!@\"'`\\/#"
+ },
+ "expected_sql_file": "alter_function_rename.sql",
+ "expected_msql_file": "alter_function_rename.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function code and add parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "prosrc": "begin\nselect '2';\nend\n",
+ "variables": {
+ "added": [
+ {
+ "name": "application_name",
+ "value": "appname"
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_parameter.sql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function delete parameters.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "variables": {
+ "deleted": [
+ {
+ "name": "application_name",
+ "value": true
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_parameter.sql",
+ "expected_msql_file": "alter_function_delete_parameter.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ },
+ {
+ "type": "create",
+ "name": "Create function for acl.",
+ "endpoint": "NODE-function.obj",
+ "msql_endpoint": "NODE-function.msql",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "name": "Function2_$%{}[]()&*^!@\"'`\\/#",
+ "funcowner": "enterprisedb",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "plpgsql",
+ "provolatile": "v",
+ "proparallel": "u",
+ "prosecdef": true,
+ "arguments": [],
+ "procost": "100",
+ "prosrc": "begin\nselect '1';\nend",
+ "probin": "$libdir/",
+ "options": [],
+ "variables": [
+ {
+ "name": "enable_sort",
+ "value": true
+ }
+ ],
+ "seclabels": [],
+ "acl": [],
+ "schema": "public"
+ },
+ "expected_sql_file": "create_function_for_alter.sql",
+ "expected_msql_file": "create_function_for_alter.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "added": [
+ {
+ "grantee": "PUBLIC",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ },
+ {
+ "grantee": "enterprisedb",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_add_acl.sql",
+ "expected_msql_file": "alter_function_add_acl.msql"
+ },
+ {
+ "type": "alter",
+ "name": "Alter function add acl.",
+ "endpoint": "NODE-function.obj_id",
+ "msql_endpoint": "NODE-function.msql_id",
+ "sql_endpoint": "NODE-function.sql_id",
+ "data": {
+ "acl": {
+ "deleted": [
+ {
+ "grantee": "PUBLIC",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ },
+ {
+ "grantee": "enterprisedb",
+ "grantor": "enterprisedb",
+ "privileges": [
+ {
+ "privilege_type": "X",
+ "privilege": true,
+ "with_grant": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "expected_sql_file": "alter_function_delete_acl.sql",
+ "expected_msql_file": "alter_function_delete_acl.msql"
+ },
+ {
+ "type": "delete",
+ "name": "Drop function",
+ "endpoint": "NODE-function.delete_id",
+ "data": {
+ }
+ }
+ ]
+}
^ permalink raw reply [nested|flat] 2+ messages in thread
* Re: [pgAdmin][RM5395]: [Housekeeping]-Add RE-SQL/MSQL test cases for Functions
2020-10-05 12:54 [pgAdmin][RM5395]: [Housekeeping]-Add RE-SQL/MSQL test cases for Functions Nikhil Mohite <[email protected]>
@ 2020-10-06 12:07 ` Akshay Joshi <[email protected]>
0 siblings, 0 replies; 2+ messages in thread
From: Akshay Joshi @ 2020-10-06 12:07 UTC (permalink / raw)
To: Nikhil Mohite <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied. Modified the behavior and also updated test cases
accordingly.
On Mon, Oct 5, 2020 at 6:24 PM Nikhil Mohite <[email protected]>
wrote:
> Hi Team,
>
> I have added a few more RE-SQL/MSQL test cases as per RM-5395
> <https://redmine.postgresql.org/issues/5395;.
> PFA patch.
>
> --
> *Thanks & Regards,*
> *Nikhil Mohite*
> *Software Engineer.*
> *EDB Postgres* <https://www.enterprisedb.com/;
> *Mob.No: +91-7798364578.*
>
--
*Thanks & Regards*
*Akshay Joshi*
*pgAdmin Hacker | Sr. Software Architect*
*EDB Postgres <http://edbpostgres.com>*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 2+ messages in thread
end of thread, other threads:[~2020-10-06 12:07 UTC | newest]
Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2020-10-05 12:54 [pgAdmin][RM5395]: [Housekeeping]-Add RE-SQL/MSQL test cases for Functions Nikhil Mohite <[email protected]>
2020-10-06 12:07 ` Akshay Joshi <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox