summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2009-09-21 11:29:51 +0000
committerMarko Kreen2009-09-21 11:29:51 +0000
commit95b24561de4cb0e27cf55b4853b40c06bf8d5d93 (patch)
tree06c8a0c6c6f6ae849a0ba8e65db453e46d9e37bb
parentd0d852aa00e91858eb2521b44023392eca4f595d (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.out23
-rw-r--r--sql/pgq/expected/sqltriga.out24
-rw-r--r--sql/pgq/sql/logutriga.sql18
-rw-r--r--sql/pgq/sql/sqltriga.sql18
-rw-r--r--sql/pgq/triggers/common.c8
-rw-r--r--sql/pgq/triggers/logutriga.c2
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);
/*