[HACKERS] pg_trigger.tgargs needs detoast
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 9: In versions below 8.0, the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match
[HACKERS] pg_trigger.tgargs needs detoast
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