londiste: make trigger handling compat with 9.0
authorMarko Kreen <markokr@gmail.com>
Fri, 25 Jun 2010 08:38:41 +0000 (08:38 +0000)
committerMarko Kreen <markokr@gmail.com>
Fri, 25 Jun 2010 08:38:41 +0000 (08:38 +0000)
sql/londiste/expected/londiste_subscriber.out
sql/londiste/functions/londiste.find_table_triggers.sql
sql/londiste/sql/londiste_subscriber.sql

index bd266175dd35c2d070bcdb6fd924f878db7f38f7..ad560d42de4ae735e0c26ae548bc9c2eb2f5eca7 100644 (file)
@@ -215,3 +215,64 @@ select londiste.get_last_tick('c');
               
 (1 row)
 
+-- test triggers
+create table tgfk (
+  id int4 primary key,
+  data text
+);
+create table tgtest (
+  id int4 primary key,
+  fk int4 references tgfk,
+  data text
+);
+create or replace function notg() returns trigger as $$
+begin
+    return null;
+end;
+$$ language plpgsql;
+create trigger tg_nop after insert on tgtest for each row execute procedure notg();
+select * from londiste.find_table_triggers('tgtest');
+  table_name   | trigger_name |                                    trigger_def                                     
+---------------+--------------+------------------------------------------------------------------------------------
+ public.tgtest | tg_nop       | CREATE TRIGGER tg_nop AFTER INSERT ON tgtest FOR EACH ROW EXECUTE PROCEDURE notg()
+(1 row)
+
+select * from londiste.subscriber_get_table_pending_triggers('tgtest');
+ table_name | trigger_name | trigger_def 
+------------+--------------+-------------
+(0 rows)
+
+select * from londiste.subscriber_drop_all_table_triggers('tgtest');
+ subscriber_drop_all_table_triggers 
+------------------------------------
+                                  1
+(1 row)
+
+select * from londiste.find_table_triggers('tgtest');
+ table_name | trigger_name | trigger_def 
+------------+--------------+-------------
+(0 rows)
+
+select * from londiste.subscriber_get_table_pending_triggers('tgtest');
+ table_name | trigger_name |                                    trigger_def                                     
+------------+--------------+------------------------------------------------------------------------------------
+ tgtest     | tg_nop       | CREATE TRIGGER tg_nop AFTER INSERT ON tgtest FOR EACH ROW EXECUTE PROCEDURE notg()
+(1 row)
+
+select * from londiste.subscriber_restore_all_table_triggers('tgtest');
+ subscriber_restore_all_table_triggers 
+---------------------------------------
+                                     1
+(1 row)
+
+select * from londiste.find_table_triggers('tgtest');
+  table_name   | trigger_name |                                    trigger_def                                     
+---------------+--------------+------------------------------------------------------------------------------------
+ public.tgtest | tg_nop       | CREATE TRIGGER tg_nop AFTER INSERT ON tgtest FOR EACH ROW EXECUTE PROCEDURE notg()
+(1 row)
+
+select * from londiste.subscriber_get_table_pending_triggers('tgtest');
+ table_name | trigger_name | trigger_def 
+------------+--------------+-------------
+(0 rows)
+
index f43c41771504d351d201c5b2e48fca61ab0aa797..90381883d8bde9e01360b7bae788bdab4cc4a5d9 100644 (file)
@@ -3,16 +3,32 @@ create or replace function londiste.find_table_triggers(i_table_name text)
 returns setof londiste.subscriber_pending_triggers as $$
 declare
     tg        record;
+    ver       int4;
 begin
-    for tg in
-        select n.nspname || '.' || c.relname as table_name, t.tgname::text as name, pg_get_triggerdef(t.oid) as def 
-        from pg_trigger t, pg_class c, pg_namespace n
-        where n.oid = c.relnamespace and c.oid = t.tgrelid
-            and t.tgrelid = londiste.find_table_oid(i_table_name)
-            and not t.tgisconstraint
-    loop
-        return next tg;
-    end loop;
+    select setting::int4 into ver from pg_settings
+     where name = 'server_version_num';
+
+    if ver >= 90000 then
+        for tg in
+            select n.nspname || '.' || c.relname as table_name, t.tgname::text as name, pg_get_triggerdef(t.oid) as def 
+            from pg_trigger t, pg_class c, pg_namespace n
+            where n.oid = c.relnamespace and c.oid = t.tgrelid
+                and t.tgrelid = londiste.find_table_oid(i_table_name)
+                and not t.tgisinternal
+        loop
+            return next tg;
+        end loop;
+    else
+        for tg in
+            select n.nspname || '.' || c.relname as table_name, t.tgname::text as name, pg_get_triggerdef(t.oid) as def 
+            from pg_trigger t, pg_class c, pg_namespace n
+            where n.oid = c.relnamespace and c.oid = t.tgrelid
+                and t.tgrelid = londiste.find_table_oid(i_table_name)
+                and not t.tgisconstraint
+        loop
+            return next tg;
+        end loop;
+    end if;
     
     return;
 end;
index c042dd5b30c9a129e0f194509655b47b33219afe..a72369114bb9bc4e402613a46db6f7d16768dd33 100644 (file)
@@ -75,3 +75,38 @@ select londiste.get_last_tick('c');
 select londiste.set_last_tick('c', NULL);
 select londiste.get_last_tick('c');
 
+
+-- test triggers
+
+create table tgfk (
+  id int4 primary key,
+  data text
+);
+
+create table tgtest (
+  id int4 primary key,
+  fk int4 references tgfk,
+  data text
+);
+
+create or replace function notg() returns trigger as $$
+begin
+    return null;
+end;
+$$ language plpgsql;
+
+create trigger tg_nop after insert on tgtest for each row execute procedure notg();
+
+select * from londiste.find_table_triggers('tgtest');
+select * from londiste.subscriber_get_table_pending_triggers('tgtest');
+
+select * from londiste.subscriber_drop_all_table_triggers('tgtest');
+
+select * from londiste.find_table_triggers('tgtest');
+select * from londiste.subscriber_get_table_pending_triggers('tgtest');
+
+select * from londiste.subscriber_restore_all_table_triggers('tgtest');
+
+select * from londiste.find_table_triggers('tgtest');
+select * from londiste.subscriber_get_table_pending_triggers('tgtest');
+