[HACKERS] pg_trigger.tgargs needs detoast

2007-01-18 Thread Kenji Kawamura

  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

2007-01-18 Thread Kenji Kawamura

  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