londiste remove-table: drop sequence too
authorMarko Kreen <markokr@gmail.com>
Wed, 9 May 2012 13:25:46 +0000 (16:25 +0300)
committerMarko Kreen <markokr@gmail.com>
Mon, 21 May 2012 10:27:54 +0000 (13:27 +0300)
sql/londiste/expected/londiste_seqs.out
sql/londiste/functions/londiste.local_remove_table.sql
sql/londiste/sql/londiste_seqs.sql

index 459f7d939749993c70f0accc7d878760d42e5458..ed21db3fb77227024934ba461624219f6bf05f28 100644 (file)
@@ -120,3 +120,50 @@ select * from londiste.local_remove_seq('seqbranch', 'masterseq');
       404 | Sequence not found: public.masterseq
 (1 row)
 
+-- seq auto-removal
+create table seqtable (
+    id1 serial primary key,
+    id2 bigserial not null
+);
+select * from londiste.local_add_table('seqroot', 'seqtable');
+ ret_code |           ret_note           
+----------+------------------------------
+      200 | Table added: public.seqtable
+(1 row)
+
+select * from londiste.local_add_seq('seqroot', 'seqtable_id1_seq');
+ ret_code |                ret_note                 
+----------+-----------------------------------------
+      200 | Sequence added: public.seqtable_id1_seq
+(1 row)
+
+select * from londiste.local_add_seq('seqroot', 'seqtable_id2_seq');
+ ret_code |                ret_note                 
+----------+-----------------------------------------
+      200 | Sequence added: public.seqtable_id2_seq
+(1 row)
+
+select * from londiste.get_table_list('seqroot');
+   table_name    | local | merge_state | custom_snapshot | table_attrs | dropped_ddl | copy_role | copy_pos | dest_table 
+-----------------+-------+-------------+-----------------+-------------+-------------+-----------+----------+------------
+ public.seqtable | t     | ok          |                 |             |             |           |        0 | 
+(1 row)
+
+select * from londiste.get_seq_list('seqroot');
+        seq_name         | last_value | local 
+-------------------------+------------+-------
+ public.seqtable_id1_seq |      30001 | t
+ public.seqtable_id2_seq |      30001 | t
+(2 rows)
+
+select * from londiste.local_remove_table('seqroot', 'seqtable');
+ ret_code |            ret_note            
+----------+--------------------------------
+      200 | Table removed: public.seqtable
+(1 row)
+
+select * from londiste.get_seq_list('seqroot');
+ seq_name | last_value | local 
+----------+------------+-------
+(0 rows)
+
index ac86566a9606807acd581bf91a5f70e6a6f3a413..71a0806a20fe4697bf8c03bfb07af314be3bc27d 100644 (file)
@@ -18,9 +18,14 @@ as $$
 -- ----------------------------------------------------------------------
 declare
     fq_table_name   text;
+    qtbl            text;
+    seqname         text;
     tbl             record;
+    tbl_oid         oid;
 begin
     fq_table_name := londiste.make_fqname(i_table_name);
+    qtbl := londiste.quote_fqname(fq_table_name);
+    tbl_oid := londiste.find_table_oid(i_table_name);
 
     select local into tbl
         from londiste.table_info
@@ -44,6 +49,21 @@ begin
                 dest_table = null
             where queue_name = i_queue_name
                 and table_name = fq_table_name;
+
+        -- drop dependent sequence
+        for seqname in
+            select n.nspname || '.' || s.relname
+                from pg_catalog.pg_class s,
+                     pg_catalog.pg_namespace n,
+                     pg_catalog.pg_attribute a
+                where a.attrelid = tbl_oid
+                    and a.atthasdef
+                    and a.atttypid::regtype::text in ('integer', 'bigint')
+                    and s.oid = pg_get_serial_sequence(qtbl, a.attname)::regclass::oid
+                    and n.oid = s.relnamespace
+        loop
+            perform londiste.local_remove_seq(i_queue_name, seqname);
+        end loop;
     else
         if not pgq_node.is_root_node(i_queue_name) then
             select 400, 'Table not registered locally: ' || fq_table_name into ret_code, ret_note;
index 27f3cd50c266005972bb6ec430b386bb721ba106..8487a2d0c72d247750bfafc7ca39bf3019edda23 100644 (file)
@@ -36,4 +36,19 @@ select * from londiste.get_seq_list('seqbranch');
 select * from londiste.local_remove_seq('seqbranch', 'masterseq');
 select * from londiste.local_remove_seq('seqbranch', 'masterseq');
 
+-- seq auto-removal
+create table seqtable (
+    id1 serial primary key,
+    id2 bigserial not null
+);
 
+select * from londiste.local_add_table('seqroot', 'seqtable');
+select * from londiste.local_add_seq('seqroot', 'seqtable_id1_seq');
+select * from londiste.local_add_seq('seqroot', 'seqtable_id2_seq');
+
+select * from londiste.get_table_list('seqroot');
+select * from londiste.get_seq_list('seqroot');
+
+select * from londiste.local_remove_table('seqroot', 'seqtable');
+
+select * from londiste.get_seq_list('seqroot');