[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": {
+ }
+ }
+ ]
+}