pg_trigger.tgargs needs detoast - Mailing list pgsql-hackers

From Kenji Kawamura
Subject pg_trigger.tgargs needs detoast
Date
Msg-id 45AF3834.9040102@oss.ntt.co.jp
Whole thread Raw
Responses Re: pg_trigger.tgargs needs detoast  (Bruce Momjian <bruce@momjian.us>)
Re: pg_trigger.tgargs needs detoast  (Bruce Momjian <bruce@momjian.us>)
List pgsql-hackers
   Hello,

   This patch fixes a bug of case of extraction of pg_trigger.tgargs.
   There was a problem when we used a long argument in defining trigger,
possibly resulting in a server crash.

Example:

   We defined a CREATE TRIGGER such as follows and registered trigger.
   In this case, the argument value which we received in the trigger
procedure was not right.

CREATE TRIGGER trigger_test BEFORE INSERT OR UPDATE ON sample FOR EACH
ROW EXECUTE PROCEDURE sample_trig('XXX...(more than 1823 characters)');

   The trigger procedure which receives the argument:

Datum sample_trig(PG_FUNCTION_ARGS)
{
    TriggerData* trigdata = (TriggerData*)fcinfo->context;
    char** args = trigdata->tg_trigger->tgargs;
    int nargs = trigdata->tg_trigger->tgnargs;

    int i;
    for (i = 0; i < nargs; i++) {
        elog(LOG, "%s", args[i]);
    }
    ...
}

Result:

   Before: LOG: (the character that is not right, for example '%')
   After : LOG: XXX...(more than 1823 characters)

Regards,

---
Kenji Kawamura
NTT Open Source Center, Japan

Index: src/backend/commands/tablecmds.c
===================================================================
--- src/backend/commands/tablecmds.c    (HEAD)
+++ src/backend/commands/tablecmds.c    (modified)
@@ -1800,8 +1800,7 @@
          * line; so does trigger.c ...
          */
         tgnargs = pg_trigger->tgnargs;
-        val = (bytea *)
-            DatumGetPointer(fastgetattr(tuple,
+        val = DatumGetByteaP(fastgetattr(tuple,
                                         Anum_pg_trigger_tgargs,
                                         tgrel->rd_att, &isnull));
         if (isnull || tgnargs < RI_FIRST_ATTNAME_ARGNO ||
Index: src/backend/commands/trigger.c
===================================================================
--- src/backend/commands/trigger.c    (HEAD)
+++ src/backend/commands/trigger.c    (modified)
@@ -906,8 +906,7 @@
             char       *p;
             int            i;

-            val = (bytea *)
-                DatumGetPointer(fastgetattr(htup,
+            val = DatumGetByteaP(fastgetattr(htup,
                                             Anum_pg_trigger_tgargs,
                                             tgrel->rd_att, &isnull));
             if (isnull)
Index: src/backend/utils/adt/ruleutils.c
===================================================================
--- src/backend/utils/adt/ruleutils.c    (HEAD)
+++ src/backend/utils/adt/ruleutils.c    (modified)
@@ -521,8 +521,7 @@
         char       *p;
         int            i;

-        val = (bytea *)
-            DatumGetPointer(fastgetattr(ht_trig,
+        val = DatumGetByteaP(fastgetattr(ht_trig,
                                         Anum_pg_trigger_tgargs,
                                         tgrel->rd_att, &isnull));
         if (isnull)

pgsql-hackers by date:

Previous
From: Guido Goldstein
Date:
Subject: Fix for bug in plpython bool type conversion
Next
From: Gavin Sherry
Date:
Subject: Planning aggregates which require sorted or distinct input