diff options
author | Marko Kreen | 2011-01-10 14:27:03 +0000 |
---|---|---|
committer | Marko Kreen | 2011-01-10 14:33:42 +0000 |
commit | 1bf1fd4c2aaffad69abe888fd610353e6243ec8c (patch) | |
tree | 8128ea339245e3382db016f3ae0c5d97ef325ae9 | |
parent | 2a15fd367eaf78150420ad72bdcdd2292dbe1eb6 (diff) |
pgq/triggers: disallow primary key updates
-rw-r--r-- | sql/pgq/expected/logutriga.out | 6 | ||||
-rw-r--r-- | sql/pgq/expected/sqltriga.out | 6 | ||||
-rw-r--r-- | sql/pgq/sql/logutriga.sql | 3 | ||||
-rw-r--r-- | sql/pgq/sql/sqltriga.sql | 5 | ||||
-rw-r--r-- | sql/pgq/triggers/logutriga.c | 12 | ||||
-rw-r--r-- | sql/pgq/triggers/makesql.c | 3 |
6 files changed, 31 insertions, 4 deletions
diff --git a/sql/pgq/expected/logutriga.out b/sql/pgq/expected/logutriga.out index b3c1fd71..795618cb 100644 --- a/sql/pgq/expected/logutriga.out +++ b/sql/pgq/expected/logutriga.out @@ -166,3 +166,9 @@ insert into deny_test values ('1', '2'); ERROR: Table 'public.deny_test' to queue 'noqueue': change not allowed (I) truncate deny_test; ERROR: Table 'public.deny_test' to queue 'noqueue': change not allowed (R) +-- test pk update +insert into udata (id, txt) values (1, 'txt'); +NOTICE: insert_event(udata_que, I:id, id=1&txt=txt, public.udata) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" +update udata set id = 2; +ERROR: primary key update not allowed diff --git a/sql/pgq/expected/sqltriga.out b/sql/pgq/expected/sqltriga.out index 81400511..6747a503 100644 --- a/sql/pgq/expected/sqltriga.out +++ b/sql/pgq/expected/sqltriga.out @@ -147,3 +147,9 @@ for each statement execute procedure pgq.sqltriga('que3'); truncate custom_expr; NOTICE: insert_event(que3, R, , public.custom_expr) CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" +-- test pk update +insert into rtest values (1, 'value1'); +NOTICE: insert_event(que3, I, (id,dat,dat2) values ('1','value1',null), public.rtest) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" +update rtest set id = 2; +ERROR: primary key update not allowed diff --git a/sql/pgq/sql/logutriga.sql b/sql/pgq/sql/logutriga.sql index 86104e96..5b0060c2 100644 --- a/sql/pgq/sql/logutriga.sql +++ b/sql/pgq/sql/logutriga.sql @@ -126,3 +126,6 @@ for each statement execute procedure pgq.logutriga('noqueue', 'deny'); insert into deny_test values ('1', '2'); truncate deny_test; +-- test pk update +insert into udata (id, txt) values (1, 'txt'); +update udata set id = 2; diff --git a/sql/pgq/sql/sqltriga.sql b/sql/pgq/sql/sqltriga.sql index e39d445c..14b70364 100644 --- a/sql/pgq/sql/sqltriga.sql +++ b/sql/pgq/sql/sqltriga.sql @@ -109,3 +109,8 @@ delete from custom_expr; create trigger customtrc_triga after truncate on custom_expr for each statement execute procedure pgq.sqltriga('que3'); truncate custom_expr; + +-- test pk update +insert into rtest values (1, 'value1'); +update rtest set id = 2; + diff --git a/sql/pgq/triggers/logutriga.c b/sql/pgq/triggers/logutriga.c index 8e51b064..978a928d 100644 --- a/sql/pgq/triggers/logutriga.c +++ b/sql/pgq/triggers/logutriga.c @@ -40,6 +40,7 @@ static int is_interesting_change(PgqTriggerEvent *ev, TriggerData *tg) Datum new_value; bool old_isnull; bool new_isnull; + bool is_pk; int i, attkind_idx = -1; int ignore_count = 0; @@ -48,10 +49,6 @@ static int is_interesting_change(PgqTriggerEvent *ev, TriggerData *tg) if (!TRIGGER_FIRED_BY_UPDATE(tg->tg_event)) return 1; - /* if no columns are ignored, all events are interesting */ - if (ev->tgargs->ignore_list == NULL) - return 1; - for (i = 0; i < tupdesc->natts; i++) { /* * Ignore dropped columns @@ -60,6 +57,10 @@ static int is_interesting_change(PgqTriggerEvent *ev, TriggerData *tg) continue; attkind_idx++; + is_pk = pgqtriga_is_pkey(ev, i, attkind_idx); + if (!is_pk && ev->tgargs->ignore_list == NULL) + continue; + old_value = SPI_getbinval(old_row, tupdesc, i + 1, &old_isnull); new_value = SPI_getbinval(new_row, tupdesc, i + 1, &new_isnull); @@ -108,6 +109,9 @@ static int is_interesting_change(PgqTriggerEvent *ev, TriggerData *tg) } } + if (is_pk) + elog(ERROR, "primary key update not allowed"); + if (pgqtriga_skip_col(ev, i, attkind_idx)) { /* this change should be ignored */ ignore_count++; diff --git a/sql/pgq/triggers/makesql.c b/sql/pgq/triggers/makesql.c index 7dc85a81..aacf1059 100644 --- a/sql/pgq/triggers/makesql.c +++ b/sql/pgq/triggers/makesql.c @@ -206,6 +206,9 @@ static int process_update(PgqTriggerEvent *ev, StringInfo sql) } } + if (pgqtriga_is_pkey(ev, i, attkind_idx)) + elog(ERROR, "primary key update not allowed"); + if (pgqtriga_skip_col(ev, i, attkind_idx)) { /* this change should be ignored */ ignore_count++; |