sql/pgq: trigger fixes
authorMarko Kreen <markokr@gmail.com>
Mon, 21 Sep 2009 11:29:51 +0000 (14:29 +0300)
committerMarko Kreen <markokr@gmail.com>
Mon, 21 Sep 2009 11:29:51 +0000 (14:29 +0300)
- 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.

sql/pgq/expected/logutriga.out
sql/pgq/expected/sqltriga.out
sql/pgq/sql/logutriga.sql
sql/pgq/sql/sqltriga.sql
sql/pgq/triggers/common.c
sql/pgq/triggers/logutriga.c

index c8ff9e4ae9447bf932d1e85a8ed38c04c6c049b7..782c5965c743f4fdd87b851bca0a2140831120f5 100644 (file)
@@ -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
index d712881e9f4877a1c06a8c77084e32ef30ef16ec..3eb91ef309f40c845d448face17c1c6471686f67 100644 (file)
@@ -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)"
index e2a909959b2a82eb8f7981ec8579231e34893257..8ba3162149844b62ac7afa5bed3258cd4028e531 100644 (file)
@@ -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;
 
index 808440b4154ae1f13d59ed12f327f48967e353b8..9ac38a4eff90b8a11c9ba20716d879821d4468df 100644 (file)
@@ -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;
 
index ed5d95356eabb90809490d22a3cec0bcdea8563f..0cc2bb49f87efef7b2d9673852d94d321606af30 100644 (file)
@@ -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)
index 7d950b140485b6b89287bd960e972942a6d90d45..f6f7ff1763f18606cd03d1f685c311707b17a010 100644 (file)
@@ -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);
 
        /*