summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2013-11-23 22:45:46 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2013-11-23 22:46:03 -0500
commitaf1288e6812367dfb11f5b3cadb432fed74e2cd7 (patch)
treec1854cc79a5a261a5d77de047c99451a9d421f9a
parentc4d3cd3dc8514147cc8d30a648e4970a2a876ca8 (diff)
Defend against bad trigger definitions in contrib/lo's lo_manage() trigger.
This function formerly crashed if called as a statement-level trigger, or if a column-name argument wasn't given. In passing, add the trigger name to all error messages from the function. (None of them are expected cases, so this shouldn't pose any compatibility risk.) Marc Cousin, reviewed by Sawada Masahiko
-rw-r--r--contrib/lo/lo.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/contrib/lo/lo.c b/contrib/lo/lo.c
index 9dbbbcebd23..757758fe7f8 100644
--- a/contrib/lo/lo.c
+++ b/contrib/lo/lo.c
@@ -40,7 +40,12 @@ lo_manage(PG_FUNCTION_ARGS)
HeapTuple trigtuple; /* The original value of tuple */
if (!CALLED_AS_TRIGGER(fcinfo)) /* internal error */
- elog(ERROR, "not fired by trigger manager");
+ elog(ERROR, "%s: not fired by trigger manager",
+ trigdata->tg_trigger->tgname);
+
+ if (!TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) /* internal error */
+ elog(ERROR, "%s: must be fired for row",
+ trigdata->tg_trigger->tgname);
/*
* Fetch some values from trigdata
@@ -50,6 +55,10 @@ lo_manage(PG_FUNCTION_ARGS)
tupdesc = trigdata->tg_relation->rd_att;
args = trigdata->tg_trigger->tgargs;
+ if (args == NULL) /* internal error */
+ elog(ERROR, "%s: no column name provided in the trigger definition",
+ trigdata->tg_trigger->tgname);
+
/* tuple to return to Executor */
if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
rettuple = newtuple;
@@ -63,7 +72,8 @@ lo_manage(PG_FUNCTION_ARGS)
attnum = SPI_fnumber(tupdesc, args[0]);
if (attnum <= 0)
- elog(ERROR, "column \"%s\" does not exist", args[0]);
+ elog(ERROR, "%s: column \"%s\" does not exist",
+ trigdata->tg_trigger->tgname, args[0]);
/*
* Handle updates