[pgAdmin][RM4554] RE-SQL for trigger functions

Aditya Toshniwal <[email protected]>
Newsgroups gmane.comp.db.postgresql.pgadmin.devel
Message-ID <CAM9w-_n2sym_R1-dvL_+iMgMoEggj2FxJTO9iXmyw9sHWQQjMw@mail.gmail.com>
Hi Hackers,

Attached is the patch to add RE-SQL test cases for trigger functions.
I've also fixed few spacing issues here and there in SQLs generated.

This patch also includes fix for https://redmine.postgresql.org/issues/4565

Kindly review.

-- 
Thanks and Regards,
Aditya Toshniwal
Software Engineer | EnterpriseDB India | Pune
"Don't Complain about Heat, Plant a TREE"
RM4554_4565.patch (application/octet-stream, 51.5 KB)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/create.sql
index bcfc8f36..4e11befb 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/create.sql
@@ -4,16 +4,16 @@
 {% set is_columns = [] %}
 {% if data %}
 CREATE FUNCTION {{ conn|qtIdent(data.pronamespace, data.name) }}({% if data.proargnames %}{{data.proargnames}}{% endif %})
-    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }} {% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
+    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }}{% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
 
     LANGUAGE {{ data.lanname|qtLiteral }}
 {% if data.procost %}
     COST {{data.procost}}
 {% endif %}
-    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %}LEAKPROOF {% else %}NOT LEAKPROOF {% endif %}
-{% if data.proisstrict %}STRICT {% endif %}
-{% if data.prosecdef %}SECURITY DEFINER {% endif %}
-{% if data.proiswindow %}WINDOW{% endif %}
+    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %}{% endif %}{% if data.proleakproof %} LEAKPROOF{% else %} NOT LEAKPROOF{% endif %}
+{% if data.proisstrict %} STRICT{% endif %}
+{% if data.prosecdef %} SECURITY DEFINER{% endif %}
+{% if data.proiswindow %} WINDOW{% endif %}
 {% if data.prorows and (data.prorows | int) > 0 %}
 
     ROWS {{data.prorows}}{% endif -%}{% if data.variables %}{% for v in data.variables %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/properties.sql
index 09d78662..c96beb61 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/properties.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/properties.sql
@@ -1,5 +1,7 @@
 SELECT
-    pr.oid, pr.xmin, pr.*, pr.prosrc AS prosrc_c,
+    pr.oid, pr.xmin,
+    CASE WHEN pr.prokind = 'w' THEN true ELSE false END AS proiswindow,
+    pr.*, pr.prosrc AS prosrc_c,
     pr.proname AS name, pg_get_function_result(pr.oid) AS prorettypename,
     typns.nspname AS typnsp, lanname, proargnames, oidvectortypes(proargtypes) AS proargtypenames,
     pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals,
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/update.sql
index 413be62e..15c6a27c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/update.sql
@@ -17,7 +17,7 @@ CREATE OR REPLACE FUNCTION {{ conn|qtIdent(o_data.pronamespace, name) }}()
 {% if 'lanname' in data %}
     LANGUAGE {{ data.lanname|qtLiteral }} {% else %}
     LANGUAGE {{ o_data.lanname|qtLiteral }}
-    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }} {% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
+    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }}{% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
 {% if ('proleakproof' in data and data.proleakproof) or ('proleakproof' not in data and o_data.proleakproof) %} LEAKPROOF{% elif 'proleakproof' in data and not data.proleakproof %} NOT LEAKPROOF{% endif %}
 {% if ('proisstrict' in data and data.proisstrict) or ('proisstrict' not in data and o_data.proisstrict) %} STRICT{% endif %}
 {% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %} SECURITY DEFINER{% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.2_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.2_plus/create.sql
index af87cfe9..4ad59d53 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.2_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.2_plus/create.sql
@@ -4,16 +4,15 @@
 {% set is_columns = [] %}
 {% if data %}
 CREATE FUNCTION {{ conn|qtIdent(data.pronamespace, data.name) }}()
-    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }} {% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
+    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }}{% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
 
     LANGUAGE {{ data.lanname|qtLiteral }}
 {% if data.procost %}
     COST {{data.procost}}
 {% endif %}
-    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %}LEAKPROOF {% else %}NOT LEAKPROOF {% endif %}
-{% if data.proisstrict %}STRICT {% endif %}
-{% if data.prosecdef %}SECURITY DEFINER {% endif %}
-{% if data.proiswindow %}WINDOW{% endif %}
+    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %}{% endif %}{% if data.proleakproof %} LEAKPROOF{% else %} NOT LEAKPROOF{% endif %}{% if data.proisstrict %} STRICT{% endif %}
+{% if data.prosecdef %} SECURITY DEFINER{% endif %}
+{% if data.proiswindow %} WINDOW{% endif %}
 {% if data.prorows and (data.prorows | int) > 0 %}
 
     ROWS {{data.prorows}}{% endif -%}{% if data.variables %}{% for v in data.variables %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.2_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.2_plus/update.sql
index 64fca849..f73ee96d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.2_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.2_plus/update.sql
@@ -16,8 +16,8 @@ CREATE OR REPLACE FUNCTION {{ conn|qtIdent(o_data.pronamespace, name) }}()
 {% if 'lanname' in data %}
     LANGUAGE {{ data.lanname|qtLiteral }} {% else %}
     LANGUAGE {{ o_data.lanname|qtLiteral }}
-    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }} {% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
-{% if ('proleakproof' in data and data.proleakproof) or ('proleakproof' not in data and o_data.proleakproof) %} LEAKPROOF{% elif 'proleakproof' in data and not data.proleakproof %}NOT LEAKPROOF{% endif %}
+    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }}{% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
+{% if ('proleakproof' in data and data.proleakproof) or ('proleakproof' not in data and o_data.proleakproof) %} LEAKPROOF{% elif 'proleakproof' in data and not data.proleakproof %} NOT LEAKPROOF{% endif %}
 {% if ('proisstrict' in data and data.proisstrict) or ('proisstrict' not in data and o_data.proisstrict) %} STRICT{% endif %}
 {% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %} SECURITY DEFINER{% endif %}
 {% if ('proiswindow' in data and data.proiswindow) or ('proiswindow' not in data and o_data.proiswindow) %} WINDOW{% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.5_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.5_plus/create.sql
index bcfc8f36..4e11befb 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.5_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.5_plus/create.sql
@@ -4,16 +4,16 @@
 {% set is_columns = [] %}
 {% if data %}
 CREATE FUNCTION {{ conn|qtIdent(data.pronamespace, data.name) }}({% if data.proargnames %}{{data.proargnames}}{% endif %})
-    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }} {% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
+    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }}{% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
 
     LANGUAGE {{ data.lanname|qtLiteral }}
 {% if data.procost %}
     COST {{data.procost}}
 {% endif %}
-    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %}LEAKPROOF {% else %}NOT LEAKPROOF {% endif %}
-{% if data.proisstrict %}STRICT {% endif %}
-{% if data.prosecdef %}SECURITY DEFINER {% endif %}
-{% if data.proiswindow %}WINDOW{% endif %}
+    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %}{% endif %}{% if data.proleakproof %} LEAKPROOF{% else %} NOT LEAKPROOF{% endif %}
+{% if data.proisstrict %} STRICT{% endif %}
+{% if data.prosecdef %} SECURITY DEFINER{% endif %}
+{% if data.proiswindow %} WINDOW{% endif %}
 {% if data.prorows and (data.prorows | int) > 0 %}
 
     ROWS {{data.prorows}}{% endif -%}{% if data.variables %}{% for v in data.variables %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.5_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.5_plus/update.sql
index 413be62e..15c6a27c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.5_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/9.5_plus/update.sql
@@ -17,7 +17,7 @@ CREATE OR REPLACE FUNCTION {{ conn|qtIdent(o_data.pronamespace, name) }}()
 {% if 'lanname' in data %}
     LANGUAGE {{ data.lanname|qtLiteral }} {% else %}
     LANGUAGE {{ o_data.lanname|qtLiteral }}
-    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }} {% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
+    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }}{% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
 {% if ('proleakproof' in data and data.proleakproof) or ('proleakproof' not in data and o_data.proleakproof) %} LEAKPROOF{% elif 'proleakproof' in data and not data.proleakproof %} NOT LEAKPROOF{% endif %}
 {% if ('proisstrict' in data and data.proisstrict) or ('proisstrict' not in data and o_data.proisstrict) %} STRICT{% endif %}
 {% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %} SECURITY DEFINER{% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/create.sql
index e3d0cc20..5e17fca0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/create.sql
@@ -4,13 +4,13 @@
 {% set is_columns = [] %}
 {% if data %}
 CREATE FUNCTION {{ conn|qtIdent(data.pronamespace, data.name) }}()
-    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }} {% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
+    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }}{% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
 
     LANGUAGE {{ data.lanname|qtLiteral }}
 {% if data.procost %}
     COST {{data.procost}}
 {% endif %}
-    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proisstrict %}STRICT {% endif %}{% if data.prosecdef %}SECURITY DEFINER {% endif %}{% if data.proiswindow %}WINDOW{% endif -%}
+    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %}{% endif %}{% if data.proisstrict %} STRICT{% endif %}{% if data.prosecdef %} SECURITY DEFINER{% endif %}{% if data.proiswindow %} WINDOW{% endif -%}
 {% if data.prorows and (data.prorows | int) > 0 %}
 
     ROWS {{data.prorows}}{% endif -%}{% if data.variables %}{% for v in data.variables %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/update.sql
index b741ebf1..aa13079e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/update.sql
@@ -16,7 +16,7 @@ CREATE OR REPLACE FUNCTION {{ conn|qtIdent(o_data.pronamespace, name) }}()
 {% if 'lanname' in data %}
     LANGUAGE {{ data.lanname|qtLiteral }} {% else %}
     LANGUAGE {{ o_data.lanname|qtLiteral }}
-    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }} {% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
+    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }}{% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
 {% if ('proisstrict' in data and data.proisstrict) or ('proisstrict' not in data and o_data.proisstrict) %} STRICT{% endif %}
 {% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %} SECURITY DEFINER{% endif %}
 {% if ('proiswindow' in data and data.proiswindow) or ('proiswindow' not in data and o_data.proiswindow) %} WINDOW{% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/11_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/11_plus/properties.sql
index 7de1ef21..38d7445e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/11_plus/properties.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/11_plus/properties.sql
@@ -1,5 +1,7 @@
 SELECT
-    pr.oid, pr.xmin, pr.*, pr.prosrc AS prosrc_c,
+    pr.oid, pr.xmin,
+    CASE WHEN pr.prokind = 'w' THEN true ELSE false END AS proiswindow,
+    pr.*, pr.prosrc AS prosrc_c,
     pr.proname AS name, pg_get_function_result(pr.oid) AS prorettypename,
     typns.nspname AS typnsp, lanname, proargnames, oidvectortypes(proargtypes) AS proargtypenames,
     pg_get_expr(proargdefaults, 'pg_catalog.pg_class'::regclass) AS proargdefaultvals,
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.2_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.2_plus/create.sql
index 3c850616..c94d86e1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.2_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.2_plus/create.sql
@@ -4,16 +4,16 @@
 {% set is_columns = [] %}
 {% if data %}
 CREATE FUNCTION {{ conn|qtIdent(data.pronamespace, data.name) }}()
-    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }} {% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
+    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }}{% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
 
     LANGUAGE {{ data.lanname|qtLiteral }}
 {% if data.procost %}
     COST {{data.procost}}
 {% endif %}
-    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %} LEAKPROOF {% else %} NOT LEAKPROOF {% endif %}
-{% if data.proisstrict %}STRICT {% endif %}
-{% if data.prosecdef %}SECURITY DEFINER {% endif %}
-{% if data.proiswindow %}WINDOW{% endif %}
+    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %}{% endif %}{% if data.proleakproof %} LEAKPROOF{% else %} NOT LEAKPROOF{% endif %}
+{% if data.proisstrict %} STRICT{% endif %}
+{% if data.prosecdef %} SECURITY DEFINER{% endif %}
+{% if data.proiswindow %} WINDOW{% endif %}
 {% if data.prorows and (data.prorows | int) > 0 %}
 
     ROWS {{data.prorows}}{% endif -%}{% if data.variables %}{% for v in data.variables %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.2_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.2_plus/update.sql
index e54a4847..764184ee 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.2_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.2_plus/update.sql
@@ -16,7 +16,7 @@ CREATE OR REPLACE FUNCTION {{ conn|qtIdent(o_data.pronamespace, name) }}()
 {% if 'lanname' in data %}
     LANGUAGE {{ data.lanname|qtLiteral }} {% else %}
     LANGUAGE {{ o_data.lanname|qtLiteral }}
-    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }} {% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
+    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }}{% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
 {% if ('proleakproof' in data and data.proleakproof) or ('proleakproof' not in data and o_data.proleakproof) %} LEAKPROOF{% elif 'proleakproof' in data and not data.proleakproof %} NOT LEAKPROOF{% endif %}
 {% if ('proisstrict' in data and data.proisstrict) or ('proisstrict' not in data and o_data.proisstrict) %} STRICT{% endif %}
 {% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %} SECURITY DEFINER{% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.5_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.5_plus/create.sql
index a679f740..54c843aa 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.5_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.5_plus/create.sql
@@ -4,16 +4,16 @@
 {% set is_columns = [] %}
 {% if data %}
 CREATE FUNCTION {{ conn|qtIdent(data.pronamespace, data.name) }}()
-    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }} {% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
+    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }}{% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
 
     LANGUAGE {{ data.lanname|qtLiteral }}
 {% if data.procost %}
     COST {{data.procost}}
 {% endif %}
-    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %}LEAKPROOF {% else %}NOT LEAKPROOF {% endif %}
-{% if data.proisstrict %}STRICT {% endif %}
-{% if data.prosecdef %}SECURITY DEFINER {% endif %}
-{% if data.proiswindow %}WINDOW{% endif %}
+    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %}{% endif %}{% if data.proleakproof %} LEAKPROOF{% else %} NOT LEAKPROOF{% endif %}
+{% if data.proisstrict %} STRICT{% endif %}
+{% if data.prosecdef %} SECURITY DEFINER{% endif %}
+{% if data.proiswindow %} WINDOW{% endif %}
 {% if data.prorows and (data.prorows | int) > 0 %}
 
     ROWS {{data.prorows}}{% endif -%}{% if data.variables %}{% for v in data.variables %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.5_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.5_plus/update.sql
index 11c54cf9..cc0bba44 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.5_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/9.5_plus/update.sql
@@ -17,7 +17,7 @@ CREATE OR REPLACE FUNCTION {{ conn|qtIdent(o_data.pronamespace, name) }}()
 {% if 'lanname' in data %}
     LANGUAGE {{ data.lanname|qtLiteral }} {% else %}
     LANGUAGE {{ o_data.lanname|qtLiteral }}
-    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }} {% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
+    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }}{% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
 {% if ('proleakproof' in data and data.proleakproof) or ('proleakproof' not in data and o_data.proleakproof) %} LEAKPROOF{% elif 'proleakproof' in data and not data.proleakproof %} NOT LEAKPROOF{% endif %}
 {% if ('proisstrict' in data and data.proisstrict) or ('proisstrict' not in data and o_data.proisstrict) %} STRICT{% endif %}
 {% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %} SECURITY DEFINER{% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/create.sql
index e3d0cc20..5e17fca0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/create.sql
@@ -4,13 +4,13 @@
 {% set is_columns = [] %}
 {% if data %}
 CREATE FUNCTION {{ conn|qtIdent(data.pronamespace, data.name) }}()
-    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }} {% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
+    RETURNS{% if data.proretset and data.prorettypename.startswith('SETOF ') %} {{ data.prorettypename }}{% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
 
     LANGUAGE {{ data.lanname|qtLiteral }}
 {% if data.procost %}
     COST {{data.procost}}
 {% endif %}
-    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proisstrict %}STRICT {% endif %}{% if data.prosecdef %}SECURITY DEFINER {% endif %}{% if data.proiswindow %}WINDOW{% endif -%}
+    {% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %}{% endif %}{% if data.proisstrict %} STRICT{% endif %}{% if data.prosecdef %} SECURITY DEFINER{% endif %}{% if data.proiswindow %} WINDOW{% endif -%}
 {% if data.prorows and (data.prorows | int) > 0 %}
 
     ROWS {{data.prorows}}{% endif -%}{% if data.variables %}{% for v in data.variables %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/update.sql
index 93e89e9a..2b775446 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/update.sql
@@ -16,7 +16,7 @@ CREATE OR REPLACE FUNCTION {{ conn|qtIdent(o_data.pronamespace, name) }}()
 {% if 'lanname' in data %}
     LANGUAGE {{ data.lanname|qtLiteral }} {% else %}
     LANGUAGE {{ o_data.lanname|qtLiteral }}
-    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }} {% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
+    {% endif %}{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }}{% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %}
 {% if ('proisstrict' in data and data.proisstrict) or ('proisstrict' not in data and o_data.proisstrict) %} STRICT{% endif %}
 {% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %} SECURITY DEFINER{% endif %}
 {% if ('proiswindow' in data and data.proiswindow) or ('proiswindow' not in data and o_data.proiswindow) %} WINDOW{% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/alter_ptrig_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/alter_ptrig_comment.sql
new file mode 100644
index 00000000..ff4a22ca
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/alter_ptrig_comment.sql
@@ -0,0 +1,18 @@
+-- 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/default/alter_ptrig_set_1.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/alter_ptrig_set_1.sql
new file mode 100644
index 00000000..52d62517
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/alter_ptrig_set_1.sql
@@ -0,0 +1,18 @@
+-- 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/default/alter_ptrig_set_2.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/alter_ptrig_set_2.sql
new file mode 100644
index 00000000..35894811
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/alter_ptrig_set_2.sql
@@ -0,0 +1,19 @@
+-- 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'
+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/default/alter_ptrig_set_3.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/alter_ptrig_set_3.sql
new file mode 100644
index 00000000..567bb20b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/alter_ptrig_set_3.sql
@@ -0,0 +1,20 @@
+-- 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 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/default/create_event_trigger_full.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/create_event_trigger_full.sql
new file mode 100644
index 00000000..332ff12b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/create_event_trigger_full.sql
@@ -0,0 +1,24 @@
+-- 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/default/create_plain_trigger.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/create_plain_trigger.sql
new file mode 100644
index 00000000..27ebbb1f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/create_plain_trigger.sql
@@ -0,0 +1,15 @@
+-- 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/default/create_plain_trigger_full.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/create_plain_trigger_full.sql
new file mode 100644
index 00000000..6c2b4364
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/create_plain_trigger_full.sql
@@ -0,0 +1,24 @@
+-- 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'
+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/default/test_trigger_functions.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/test_trigger_functions.json
new file mode 100644
index 00000000..61612704
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/pg/default/test_trigger_functions.json
@@ -0,0 +1,182 @@
+{
+  "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",
+      "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",
+      "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"
+          }]
+        }
+      },
+      "expected_sql_file": "alter_ptrig_set_2.sql"
+    }, {
+      "type": "alter",
+      "name": "Alter trigger function Set 3",
+      "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
+          }]
+        }
+      },
+      "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"
+        }],
+        "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/default/alter_ptrig_comment.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/alter_ptrig_comment.sql
new file mode 100644
index 00000000..670d92f6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/alter_ptrig_comment.sql
@@ -0,0 +1,18 @@
+-- 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/default/alter_ptrig_set_1.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/alter_ptrig_set_1.sql
new file mode 100644
index 00000000..d8e799fd
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/alter_ptrig_set_1.sql
@@ -0,0 +1,18 @@
+-- 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/default/alter_ptrig_set_2.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/alter_ptrig_set_2.sql
new file mode 100644
index 00000000..99a411ed
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/alter_ptrig_set_2.sql
@@ -0,0 +1,19 @@
+-- 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'
+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/default/alter_ptrig_set_3.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/alter_ptrig_set_3.sql
new file mode 100644
index 00000000..570470dc
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/alter_ptrig_set_3.sql
@@ -0,0 +1,20 @@
+-- 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 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/default/create_event_trigger_full.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/create_event_trigger_full.sql
new file mode 100644
index 00000000..09ed2323
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/create_event_trigger_full.sql
@@ -0,0 +1,20 @@
+-- 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;
+
+COMMENT ON FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
+    IS 'some comment';
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/create_plain_trigger.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/create_plain_trigger.sql
new file mode 100644
index 00000000..c06e1b6c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/create_plain_trigger.sql
@@ -0,0 +1,15 @@
+-- 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/default/create_plain_trigger_full.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/create_plain_trigger_full.sql
new file mode 100644
index 00000000..623b5b59
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/create_plain_trigger_full.sql
@@ -0,0 +1,20 @@
+-- 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'
+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/default/test_trigger_functions.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/test_trigger_functions.json
new file mode 100644
index 00000000..61e80e85
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/ppas/default/test_trigger_functions.json
@@ -0,0 +1,162 @@
+{
+  "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"
+          }]
+        }
+      },
+      "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": {
+          "changed": [{
+            "name": "application_name",
+            "value": "appname2"
+          }],
+          "added": [{
+            "name": "array_nulls",
+            "value": true
+          }]
+        }
+      },
+      "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": [],
+        "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"
+        }],
+        "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": [],
+        "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": {
+      }
+    }
+  ]
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.