summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2011-01-10 14:27:03 +0000
committerMarko Kreen2011-01-10 14:33:42 +0000
commit1bf1fd4c2aaffad69abe888fd610353e6243ec8c (patch)
tree8128ea339245e3382db016f3ae0c5d97ef325ae9
parent2a15fd367eaf78150420ad72bdcdd2292dbe1eb6 (diff)
pgq/triggers: disallow primary key updates
-rw-r--r--sql/pgq/expected/logutriga.out6
-rw-r--r--sql/pgq/expected/sqltriga.out6
-rw-r--r--sql/pgq/sql/logutriga.sql3
-rw-r--r--sql/pgq/sql/sqltriga.sql5
-rw-r--r--sql/pgq/triggers/logutriga.c12
-rw-r--r--sql/pgq/triggers/makesql.c3
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++;