summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/londiste/Makefile3
-rw-r--r--sql/londiste/expected/londiste_leaf.out118
-rw-r--r--sql/londiste/functions/londiste.local_add_table.sql22
-rw-r--r--sql/londiste/sql/londiste_leaf.sql45
4 files changed, 184 insertions, 4 deletions
diff --git a/sql/londiste/Makefile b/sql/londiste/Makefile
index 6d6d0c03..0db0bfff 100644
--- a/sql/londiste/Makefile
+++ b/sql/londiste/Makefile
@@ -6,7 +6,8 @@ FUNCS = $(shell sed -e 's/^[^\\].*//' -e 's/\\i //' $(SQLS))
SRCS = $(SQLS) $(FUNCS)
REGRESS = londiste_install londiste_provider londiste_subscriber \
- londiste_fkeys londiste_execute londiste_seqs londiste_merge
+ londiste_fkeys londiste_execute londiste_seqs londiste_merge \
+ londiste_leaf
# londiste_denytrigger
REGRESS_OPTS = --dbname=regression
diff --git a/sql/londiste/expected/londiste_leaf.out b/sql/londiste/expected/londiste_leaf.out
new file mode 100644
index 00000000..8669f64c
--- /dev/null
+++ b/sql/londiste/expected/londiste_leaf.out
@@ -0,0 +1,118 @@
+set client_min_messages = 'warning';
+\set VERBOSITY 'terse'
+select 1
+from (select set_config(name, 'escape', false) as ignore
+ from pg_settings where name = 'bytea_output') x
+where x.ignore = 'foo';
+ ?column?
+----------
+(0 rows)
+
+--
+-- tables
+--
+create table leafdata (
+ id serial primary key,
+ data text
+);
+select current_database();
+ current_database
+------------------
+ regression
+(1 row)
+
+select * from pgq_node.register_location('leafq', 'lq_node1', 'dbname=db', false);
+ ret_code | ret_note
+----------+---------------------
+ 200 | Location registered
+(1 row)
+
+select * from pgq_node.register_location('leafq', 'lq_node2', 'dbname=db2', false);
+ ret_code | ret_note
+----------+---------------------
+ 200 | Location registered
+(1 row)
+
+select * from pgq_node.create_node('leafq', 'leaf', 'lq_node2', 'londiste_leaf', 'lq_node1', 100, null::text);
+ ret_code | ret_note
+----------+----------------------------------------------------------------
+ 200 | Node "lq_node2" initialized for queue "leafq" with type "leaf"
+(1 row)
+
+select * from londiste.local_show_missing('leafq');
+ obj_kind | obj_name
+----------+----------
+(0 rows)
+
+select * from londiste.local_add_table('leafq', 'public.leafdata');
+ ret_code | ret_note
+----------+-----------------------------------------------
+ 404 | Table not available on queue: public.leafdata
+(1 row)
+
+select * from londiste.global_add_table('leafq', 'public.leafdata');
+ ret_code | ret_note
+----------+------------------------------
+ 200 | Table added: public.leafdata
+(1 row)
+
+select * from londiste.local_add_table('leafq', 'public.leafdata');
+ ret_code | ret_note
+----------+------------------------------
+ 200 | Table added: public.leafdata
+(1 row)
+
+select * from londiste.global_add_table('leafq', 'public.tmp');
+ ret_code | ret_note
+----------+-------------------------
+ 200 | Table added: public.tmp
+(1 row)
+
+select * from londiste.get_table_list('leafq');
+ table_name | local | merge_state | custom_snapshot | table_attrs | dropped_ddl | copy_role
+-----------------+-------+-------------+-----------------+-------------+-------------+-----------
+ public.leafdata | t | | | | |
+ public.tmp | f | | | | |
+(2 rows)
+
+select tgname, tgargs from pg_trigger
+where tgrelid = 'public.leafdata'::regclass
+order by 1;
+ tgname | tgargs
+--------------------------+-------------------
+ _londiste_leafq | leafq\000deny\000
+ _londiste_leafq_truncate | leafq\000deny\000
+(2 rows)
+
+insert into leafdata values (1, 'asd');
+ERROR: Table 'public.leafdata' to queue 'leafq': change not allowed (I)
+select * from londiste.global_remove_table('leafq', 'public.tmp');
+ ret_code | ret_note
+----------+---------------------------
+ 200 | Table removed: public.tmp
+(1 row)
+
+select * from londiste.local_remove_table('leafq', 'public.leafdata');
+ ret_code | ret_note
+----------+--------------------------------
+ 200 | Table removed: public.leafdata
+(1 row)
+
+select * from londiste.local_remove_table('leafq', 'public.leafdata');
+ ret_code | ret_note
+----------+-----------------------------------------------
+ 400 | Table not registered locally: public.leafdata
+(1 row)
+
+select * from londiste.get_table_list('leafq');
+ table_name | local | merge_state | custom_snapshot | table_attrs | dropped_ddl | copy_role
+-----------------+-------+-------------+-----------------+-------------+-------------+-----------
+ public.leafdata | f | | | | |
+(1 row)
+
+select * from londiste.local_show_missing('leafq');
+ obj_kind | obj_name
+----------+-----------------
+ r | public.leafdata
+(1 row)
+
diff --git a/sql/londiste/functions/londiste.local_add_table.sql b/sql/londiste/functions/londiste.local_add_table.sql
index 162422be..156d939d 100644
--- a/sql/londiste/functions/londiste.local_add_table.sql
+++ b/sql/londiste/functions/londiste.local_add_table.sql
@@ -53,8 +53,16 @@ declare
sql text;
arg text;
_node record;
+ _tbloid oid;
+ _trunc_args text;
begin
+ _trunc_args := '';
fq_table_name := londiste.make_fqname(i_table_name);
+ _tbloid := londiste.find_table_oid(fq_table_name);
+ if _tbloid is null then
+ select 404, 'Table does not exist: ' || fq_table_name into ret_code, ret_note;
+ return;
+ end if;
col_types := londiste.find_column_types(fq_table_name);
if position('k' in col_types) < 1 then
-- allow missing primary key in case of combined table where
@@ -127,8 +135,16 @@ begin
-- skip triggers on leaf node
if _node.node_type = 'leaf' then
- select 200, 'Table added: ' || fq_table_name into ret_code, ret_note;
- return;
+ -- on weird leafs the trigger funcs may not exist
+ perform 1 from pg_proc p join pg_namespace n on (n.oid = p.pronamespace)
+ where n.nspname = 'pgq' and p.proname in ('logutriga', 'sqltriga');
+ if not found then
+ select 200, 'Table added with no triggers: ' || fq_table_name into ret_code, ret_note;
+ return;
+ end if;
+ -- on regular leaf, install deny trigger
+ i_trg_args := array['deny'];
+ _trunc_args := ', ' || quote_literal('deny');
end if;
-- create Ins/Upd/Del trigger if it does not exists already
@@ -207,7 +223,7 @@ begin
sql := 'create trigger ' || quote_ident(trunctrg_name)
|| ' after truncate on ' || londiste.quote_fqname(fq_table_name)
|| ' for each statement execute procedure pgq.sqltriga(' || quote_literal(i_queue_name)
- || ')';
+ || _trunc_args || ')';
execute sql;
end if;
end if;
diff --git a/sql/londiste/sql/londiste_leaf.sql b/sql/londiste/sql/londiste_leaf.sql
new file mode 100644
index 00000000..23b6a0e3
--- /dev/null
+++ b/sql/londiste/sql/londiste_leaf.sql
@@ -0,0 +1,45 @@
+
+set client_min_messages = 'warning';
+\set VERBOSITY 'terse'
+
+select 1
+from (select set_config(name, 'escape', false) as ignore
+ from pg_settings where name = 'bytea_output') x
+where x.ignore = 'foo';
+
+
+--
+-- tables
+--
+create table leafdata (
+ id serial primary key,
+ data text
+);
+
+select current_database();
+
+select * from pgq_node.register_location('leafq', 'lq_node1', 'dbname=db', false);
+select * from pgq_node.register_location('leafq', 'lq_node2', 'dbname=db2', false);
+select * from pgq_node.create_node('leafq', 'leaf', 'lq_node2', 'londiste_leaf', 'lq_node1', 100, null::text);
+
+select * from londiste.local_show_missing('leafq');
+
+select * from londiste.local_add_table('leafq', 'public.leafdata');
+select * from londiste.global_add_table('leafq', 'public.leafdata');
+select * from londiste.local_add_table('leafq', 'public.leafdata');
+select * from londiste.global_add_table('leafq', 'public.tmp');
+select * from londiste.get_table_list('leafq');
+
+select tgname, tgargs from pg_trigger
+where tgrelid = 'public.leafdata'::regclass
+order by 1;
+
+insert into leafdata values (1, 'asd');
+
+select * from londiste.global_remove_table('leafq', 'public.tmp');
+select * from londiste.local_remove_table('leafq', 'public.leafdata');
+select * from londiste.local_remove_table('leafq', 'public.leafdata');
+select * from londiste.get_table_list('leafq');
+
+select * from londiste.local_show_missing('leafq');
+