pgq/triggers: disallow primary key updates
authorMarko Kreen <markokr@gmail.com>
Mon, 10 Jan 2011 14:27:03 +0000 (16:27 +0200)
committerMarko Kreen <markokr@gmail.com>
Mon, 10 Jan 2011 14:33:42 +0000 (16:33 +0200)
sql/pgq/expected/logutriga.out
sql/pgq/expected/sqltriga.out
sql/pgq/sql/logutriga.sql
sql/pgq/sql/sqltriga.sql
sql/pgq/triggers/logutriga.c
sql/pgq/triggers/makesql.c

index b3c1fd71f894bca7a428d1639bec55289b69a4e7..795618cbd81d12ae3e35f259128ce187cde0aa35 100644 (file)
@@ -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
index 8140051180d84c59c92a95070f0e9035b8dce9d6..6747a50332fc71d0b073001f4faf241a76b870c4 100644 (file)
@@ -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
index 86104e963a7491e7ddad1122c3953b5fe37ffe49..5b0060c273d0fb5234a49268435ceef0c0e5be5a 100644 (file)
@@ -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;
index e39d445ca7d02c6818d035640203f02acea29d9c..14b70364c844c9b4bb0f8b4a80fecec083527297 100644 (file)
@@ -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;
+
index 8e51b06414863dba409688a605703ed784025dc3..978a928dd40a9a4b13ee61709c2173add277b5a2 100644 (file)
@@ -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++;
index 7dc85a81eef2b3514f3083b7deaa685643435179..aacf105974d18df7b50fc639ed56b7ca00930da6 100644 (file)
@@ -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++;