From c345adaa528571583a9e4df9c62785dfcbb5316d Mon Sep 17 00:00:00 2001 From: Murtuza Zabuawala Date: Wed, 9 Nov 2016 15:00:35 +0000 Subject: [PATCH] Properly format arguments passed by triggers to functions. Fixes #1912 --- .../trigger/sql/9.1_plus/properties.sql | 2 +- .../schemas/tables/triggers/__init__.py | 34 +++++++++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/properties.sql index 535627bbe..76f0a252b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/properties.sql @@ -3,7 +3,7 @@ SELECT t.oid,t.tgname AS name, t.xmin, t.*, relname, CASE WHEN relkind = 'r' THE COALESCE(substring(pg_get_triggerdef(t.oid), 'WHEN (.*) EXECUTE PROCEDURE'), substring(pg_get_triggerdef(t.oid), 'WHEN (.*) \\$trigger')) AS whenclause, -- We need to convert tgargs column bytea datatype to array datatype - (string_to_array(encode(tgargs, 'escape'), '\000')::text[])[1:tgnargs] AS tgargs, + (string_to_array(encode(tgargs, 'escape'), '\000')::text[])[1:tgnargs] AS custom_tgargs, {% if datlastsysoid %} (CASE WHEN t.oid <= {{ datlastsysoid}}::oid THEN true ElSE false END) AS is_sys_trigger, {% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py index 20337c162..97855ec24 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py @@ -470,6 +470,20 @@ class TriggerView(PGChildNodeView): return data + def _format_args(self, args): + """ + This function will format arguments. + + Args: + args: Arguments + + Returns: + Formated arguments for function + """ + formatted_args = ["'{0}'".format(arg) for arg in args] + return ', '.join(formatted_args) + + @check_precondition def properties(self, gid, sid, did, scid, tid, trid): """ @@ -523,10 +537,10 @@ class TriggerView(PGChildNodeView): 'tfunctions' in result['rows'][0]: data['tfunction'] = result['rows'][0]['tfunctions'] - if data['tgnargs'] > 1: - # We know that trigger has more than 1 arguments, let's join them - # and convert it as string - data['tgargs'] = ', '.join(data['tgargs']) + if data['custom_tgargs'] > 1: + # We know that trigger has more than 1 argument, let's join them + # and convert it to string + data['tgargs'] = self._format_args(data['custom_tgargs']) if len(data['tgattr']) > 1: columns = ', '.join(data['tgattr'].split(' ')) @@ -770,9 +784,9 @@ class TriggerView(PGChildNodeView): self.trigger_name = data['name'] self.lanname = old_data['lanname'] - if old_data['tgnargs'] > 1: - # We know that trigger has more than 1 arguments, let's join them - old_data['tgargs'] = ', '.join(old_data['tgargs']) + if len(old_data['custom_tgargs']) > 1: + # We know that trigger has more than 1 argument, let's join them + old_data['tgargs'] = self._format_args(old_data['custom_tgargs']) if len(old_data['tgattr']) > 1: columns = ', '.join(old_data['tgattr'].split(' ')) @@ -827,9 +841,9 @@ class TriggerView(PGChildNodeView): data['schema'] = self.schema data['table'] = self.table - if data['tgnargs'] > 1: - # We know that trigger has more than 1 arguments, let's join them - data['tgargs'] = ', '.join(data['tgargs']) + if len(data['custom_tgargs']) > 1: + # We know that trigger has more than 1 argument, let's join them + data['tgargs'] = self._format_args(data['custom_tgargs']) if len(data['tgattr']) > 1: columns = ', '.join(data['tgattr'].split(' '))