diff options
author | Marko Kreen | 2009-09-21 11:29:51 +0000 |
---|---|---|
committer | Marko Kreen | 2009-09-21 11:29:51 +0000 |
commit | 95b24561de4cb0e27cf55b4853b40c06bf8d5d93 (patch) | |
tree | 06c8a0c6c6f6ae849a0ba8e65db453e46d9e37bb | |
parent | d0d852aa00e91858eb2521b44023392eca4f595d (diff) |
sql/pgq: trigger fixes
- pgq.logutriga() did not put custom pkey= value into events.
- pgq.logutriga() and pgq.sqltriga() did allow UPDATE and DELETE
on tables without pkey, running into SQL errors downstream.
They should throw error in such case.
-rw-r--r-- | sql/pgq/expected/logutriga.out | 23 | ||||
-rw-r--r-- | sql/pgq/expected/sqltriga.out | 24 | ||||
-rw-r--r-- | sql/pgq/sql/logutriga.sql | 18 | ||||
-rw-r--r-- | sql/pgq/sql/sqltriga.sql | 18 | ||||
-rw-r--r-- | sql/pgq/triggers/common.c | 8 | ||||
-rw-r--r-- | sql/pgq/triggers/logutriga.c | 2 |
6 files changed, 92 insertions, 1 deletions
diff --git a/sql/pgq/expected/logutriga.out b/sql/pgq/expected/logutriga.out index c8ff9e4a..782c5965 100644 --- a/sql/pgq/expected/logutriga.out +++ b/sql/pgq/expected/logutriga.out @@ -20,3 +20,26 @@ CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null) insert into udata (bin) values (E'bi\tn\\000bin'); NOTICE: insert_event(udata_que, I:id, id=2&txt&bin=bi%5c011n%5c000bin, public.udata) CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +-- test missing pkey +create table nopkey2 (dat text); +create trigger nopkey_triga2 after insert or update or delete on nopkey2 +for each row execute procedure pgq.logutriga('que3'); +insert into nopkey2 values ('foo'); +NOTICE: insert_event(que3, I:, dat=foo, public.nopkey2) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +update nopkey2 set dat = 'bat'; +ERROR: Update/Delete on table without pkey +delete from nopkey2; +ERROR: Update/Delete on table without pkey +-- test custom pkey +create table ucustom_pkey (dat1 text not null, dat2 int2 not null, dat3 text); +create trigger ucustom_triga after insert or update or delete on ucustom_pkey +--for each row execute procedure pgq.logutriga('que3', 'pkey=dat1,dat2'); +for each row execute procedure pgq.logutriga('que3'); +insert into ucustom_pkey values ('foo', '2'); +NOTICE: insert_event(que3, I:, dat1=foo&dat2=2&dat3, public.ucustom_pkey) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +update ucustom_pkey set dat3 = 'bat'; +ERROR: Update/Delete on table without pkey +delete from ucustom_pkey; +ERROR: Update/Delete on table without pkey diff --git a/sql/pgq/expected/sqltriga.out b/sql/pgq/expected/sqltriga.out index d712881e..3eb91ef3 100644 --- a/sql/pgq/expected/sqltriga.out +++ b/sql/pgq/expected/sqltriga.out @@ -76,3 +76,27 @@ CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null) delete from rtest where id=2; NOTICE: insert_event(que3, D, id='2', public.rtest) CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +-- test missing pkey +create table nopkey (dat text); +create trigger nopkey_triga after insert or update or delete on nopkey +for each row execute procedure pgq.sqltriga('que3'); +insert into nopkey values ('foo'); +NOTICE: insert_event(que3, I, (dat) values ('foo'), public.nopkey) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +update nopkey set dat = 'bat'; +ERROR: Update/Delete on table without pkey +delete from nopkey; +ERROR: Update/Delete on table without pkey +-- test custom pkey +create table custom_pkey (dat1 text not null, dat2 int2 not null, dat3 text); +create trigger custom_triga after insert or update or delete on custom_pkey +for each row execute procedure pgq.sqltriga('que3', 'pkey=dat1,dat2'); +insert into custom_pkey values ('foo', '2'); +NOTICE: insert_event(que3, I, (dat1,dat2,dat3) values ('foo','2',null), public.custom_pkey) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +update custom_pkey set dat3 = 'bat'; +NOTICE: insert_event(que3, U, dat3='bat' where dat1='foo' and dat2='2', public.custom_pkey) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +delete from custom_pkey; +NOTICE: insert_event(que3, D, dat1='foo' and dat2='2', public.custom_pkey) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" diff --git a/sql/pgq/sql/logutriga.sql b/sql/pgq/sql/logutriga.sql index e2a90995..8ba31621 100644 --- a/sql/pgq/sql/logutriga.sql +++ b/sql/pgq/sql/logutriga.sql @@ -19,4 +19,22 @@ for each row execute procedure pgq.logutriga('udata_que'); insert into udata (txt) values ('text1'); insert into udata (bin) values (E'bi\tn\\000bin'); +-- test missing pkey +create table nopkey2 (dat text); +create trigger nopkey_triga2 after insert or update or delete on nopkey2 +for each row execute procedure pgq.logutriga('que3'); + +insert into nopkey2 values ('foo'); +update nopkey2 set dat = 'bat'; +delete from nopkey2; + +-- test custom pkey +create table ucustom_pkey (dat1 text not null, dat2 int2 not null, dat3 text); +create trigger ucustom_triga after insert or update or delete on ucustom_pkey +--for each row execute procedure pgq.logutriga('que3', 'pkey=dat1,dat2'); +for each row execute procedure pgq.logutriga('que3'); + +insert into ucustom_pkey values ('foo', '2'); +update ucustom_pkey set dat3 = 'bat'; +delete from ucustom_pkey; diff --git a/sql/pgq/sql/sqltriga.sql b/sql/pgq/sql/sqltriga.sql index 808440b4..9ac38a4e 100644 --- a/sql/pgq/sql/sqltriga.sql +++ b/sql/pgq/sql/sqltriga.sql @@ -55,4 +55,22 @@ delete from rtest where id=1; delete from rtest where id=2; +-- test missing pkey +create table nopkey (dat text); +create trigger nopkey_triga after insert or update or delete on nopkey +for each row execute procedure pgq.sqltriga('que3'); + +insert into nopkey values ('foo'); +update nopkey set dat = 'bat'; +delete from nopkey; + + +-- test custom pkey +create table custom_pkey (dat1 text not null, dat2 int2 not null, dat3 text); +create trigger custom_triga after insert or update or delete on custom_pkey +for each row execute procedure pgq.sqltriga('que3', 'pkey=dat1,dat2'); + +insert into custom_pkey values ('foo', '2'); +update custom_pkey set dat3 = 'bat'; +delete from custom_pkey; diff --git a/sql/pgq/triggers/common.c b/sql/pgq/triggers/common.c index ed5d9535..0cc2bb49 100644 --- a/sql/pgq/triggers/common.c +++ b/sql/pgq/triggers/common.c @@ -302,6 +302,14 @@ static void parse_newstyle_args(PgqTriggerEvent *ev, TriggerData *tg) else elog(ERROR, "bad param to pgq trigger"); } + + /* + * Check if we have pkey + */ + if (ev->op_type == 'U' || ev->op_type == 'D') { + if (ev->pkey_list[0] == 0) + elog(ERROR, "Update/Delete on table without pkey"); + } } static void parse_oldstyle_args(PgqTriggerEvent *ev, TriggerData *tg) diff --git a/sql/pgq/triggers/logutriga.c b/sql/pgq/triggers/logutriga.c index 7d950b14..f6f7ff17 100644 --- a/sql/pgq/triggers/logutriga.c +++ b/sql/pgq/triggers/logutriga.c @@ -104,7 +104,7 @@ Datum pgq_logutriga(PG_FUNCTION_ARGS) appendStringInfoChar(ev.ev_type, ev.op_type); appendStringInfoChar(ev.ev_type, ':'); - appendStringInfoString(ev.ev_type, ev.info->pkey_list); + appendStringInfoString(ev.ev_type, ev.pkey_list); appendStringInfoString(ev.ev_extra1, ev.info->table_name); /* |