- 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.
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
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)"
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;
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;
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)
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);
/*