Re: [HACKERS] pg_trigger.tgargs needs detoast
Patch applied. Thanks. Backpached to 8.2.X. If it needs to be backpatched to older releases, someone needs to research that. --- Kenji Kawamura wrote: >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) > > ---(end of broadcast)--- > TIP 7: You can help support the PostgreSQL project by donating at > > http://www.postgresql.org/about/donate -- Bruce Momjian [EMAIL PROTECTED] EnterpriseDBhttp://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. + ---(end of broadcast)--- TIP 5: don't forget to increase your free space map settings
Re: [HACKERS] pg_trigger.tgargs needs detoast
Your patch has been added to the PostgreSQL unapplied patches list at: http://momjian.postgresql.org/cgi-bin/pgpatches It will be applied as soon as one of the PostgreSQL committers reviews and approves it. --- Kenji Kawamura wrote: >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) > > ---(end of broadcast)--- > TIP 7: You can help support the PostgreSQL project by donating at > > http://www.postgresql.org/about/donate -- Bruce Momjian [EMAIL PROTECTED] EnterpriseDBhttp://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. + ---(end of broadcast)--- TIP 2: Don't 'kill -9' the postmaster