Hi, Le 24/09/2010 21:26, Christopher A Hotchkiss a écrit : > To Who It May Concern, > I am using the new 1.12 pgAdmin on Windows XP SP3 and I have notice two > display inaccuracies when connecting to a Postgres 9 database. > > For example when creating the following trigger: > > CREATE TRIGGER c_aud_trg > BEFORE INSERT OR UPDATE OR DELETE > ON ca > FOR EACH ROW > EXECUTE PROCEDURE c_aud_trg_trfunc(); > > It will get created correctly (checking with pgdump based on suggestions from > the pgsql list). > > However it will be displayed as: > CREATE TRIGGER c_aud_trg > BEFORE INSERT OR UPDATE > ON ca > FOR EACH ROW > EXECUTE PROCEDURE c_aud_trg_func(E'\\x'); > > If that same trigger is dropped and re-added using what is in the database, > the following shows up: > CREATE TRIGGER c_aud_trg > BEFORE INSERT OR UPDATE > ON ca > FOR EACH ROW > EXECUTE PROCEDURE c_aud_trg_func(E'\\x5c7800'); >
Your specific issue is quite easy to fix. It's done on the attached patch. Unfortunately, it shows another issue. The issue I found relates to the new GUC bytea_output. Here is a quick example. ticketx=# CREATE TRIGGER c_aud_trg2 BEFORE INSERT OR UPDATE OR DELETE ON ca FOR EACH ROW EXECUTE PROCEDURE c_aud_trg_trfunc2('&'); This statement creates a trigger that executes a procedure which accepts one argument. Let's try to get the contents of the column tgargs of the pg_trigger table: ticketx=# select tgargs from pg_trigger where tgname='c_aud_trg2'; tgargs -------- \x2600 (1 row) This is the new hex output for a bytea column (yes, tgargs is a bytea). Let's try the old output: ticketx=# set bytea_output to escape; SET ticketx=# select tgargs from pg_trigger where tgname='c_aud_trg2'; tgargs -------- &\000 (1 row) Much better. So, the only way to fix this, AFAICT, is to set bytea_ouput to "escape" when connected to a 9.0 server. My question is this: should I set the parameter at the connection start, or should I set and unset it during the search of triggers? The latter is less error prone, but requires to execute three more queries (SHOW bytea_output, SET bytea_output TO escape, SET bytea_output TO old_value). > The second issue is the ordering of 'update of' triggers. For example when > creating the following trigger: > CREATE TRIGGER ca_trig > BEFORE UPDATE OF columnA OR DELETE > ON ca > FOR EACH ROW > EXECUTE PROCEDURE c_h_trg_func (); > > It will be displayed as: > CREATE TRIGGER ca_trig > BEFORE UPDATE OR DELETE OF columnA > ON ca > FOR EACH ROW > EXECUTE PROCEDURE c_h_trg_func (); > > This is a syntax error. > Fixed on the attached patch. > On a side note, does pgAdmin or Postgres have a bug tracker like > bugzilla/trac/jira/etc? > Postgres doesn't. pgAdmin has one, but it's readonly for most people. Usually, I put in it each bug I'm able to reproduce. It's available at http://code.pgadmin.org/, and your issue is here: http://code.pgadmin.org/trac/ticket/240 Thanks for your report. -- Guillaume http://www.postgresql.fr http://dalibo.com
>From f97e5bc58b537858d9765f625ca3dfdd65cfcfb5 Mon Sep 17 00:00:00 2001 From: Guillaume Lelarge <guilla...@lelarge.info> Date: Sat, 25 Sep 2010 00:48:09 +0200 Subject: [PATCH] Fix the reverse-engineered query for triggers The new "OF column" syntax is only available for UPDATE, and we should check the args only if the number of args is not zero. Report from Christopher A Hotchkiss. Fixed #240. --- pgadmin/schema/pgTrigger.cpp | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pgadmin/schema/pgTrigger.cpp b/pgadmin/schema/pgTrigger.cpp index c73ecbc..12cc989 100644 --- a/pgadmin/schema/pgTrigger.cpp +++ b/pgadmin/schema/pgTrigger.cpp @@ -98,9 +98,6 @@ wxString pgTrigger::GetSql(ctlTree *browser) sql += wxT("\n ") + GetFireWhen() + wxT(" ") + GetEvent(); - if (!GetQuotedColumns().IsEmpty()) - sql += wxT(" OF ") + GetQuotedColumns(); - sql += wxT("\n ON ") + GetQuotedFullTable() + wxT("\n FOR EACH ") + GetForEach(); @@ -147,6 +144,8 @@ wxString pgTrigger::GetEvent() const if (!event.IsNull()) event += wxT(" OR "); event += wxT("UPDATE"); + if (!GetQuotedColumns().IsEmpty()) + event += wxT(" OF ") + GetQuotedColumns(); } if (triggerType & TRIGGER_TYPE_DELETE) { @@ -333,8 +332,10 @@ pgObject *pgTriggerFactory::CreateObjects(pgCollection *coll, ctlTree *browser, trigger->iSetLanguage(triggers->GetVal(wxT("lanname"))); trigger->iSetSource(triggers->GetVal(wxT("prosrc"))); trigger->iSetQuotedFullTable(collection->GetDatabase()->GetQuotedSchemaPrefix(triggers->GetVal(wxT("nspname"))) + qtIdent(triggers->GetVal(wxT("relname")))); - wxString arglist=triggers->GetVal(wxT("tgargs")); - wxString args; + wxString arglist = wxEmptyString; + if (triggers->GetLong(wxT("tgnargs")) > 0) + arglist=triggers->GetVal(wxT("tgargs")); + wxString args = wxEmptyString; while (!arglist.IsEmpty()) { -- 1.7.0.4
-- Sent via pgadmin-support mailing list (pgadmin-support@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-support