Function Properties
Language: PLPGSQL
Return Type: bigint
This processes the SET_MOVE_TABLE event. The table is moved to the destination set.declare p_tab_id alias for $1; p_new_set_id alias for $2; v_old_set_id int4; v_origin int4; begin -- ---- -- Grab the central configuration lock -- ---- lock table sl_config_lock; -- ---- -- Get the tables current set -- ---- select tab_set into v_old_set_id from sl_table where tab_id = p_tab_id; if not found then raise exception 'Slony-I: table %d not found', p_tab_id; end if; -- ---- -- Check that both sets exist and originate here -- ---- if p_new_set_id = v_old_set_id then raise exception 'Slony-I: set ids cannot be identical'; end if; select set_origin into v_origin from sl_set where set_id = p_new_set_id; if not found then raise exception 'Slony-I: set % not found', p_new_set_id; end if; if v_origin != getLocalNodeId('_schemadoc') then raise exception 'Slony-I: set % does not originate on local node', p_new_set_id; end if; select set_origin into v_origin from sl_set where set_id = v_old_set_id; if not found then raise exception 'Slony-I: set % not found', v_old_set_id; end if; if v_origin != getLocalNodeId('_schemadoc') then raise exception 'Slony-I: set % does not originate on local node', v_old_set_id; end if; -- ---- -- Check that both sets are subscribed by the same set of nodes -- ---- if exists (select true from sl_subscribe SUB1 where SUB1.sub_set = p_new_set_id and SUB1.sub_receiver not in (select SUB2.sub_receiver from sl_subscribe SUB2 where SUB2.sub_set = v_old_set_id)) then raise exception 'Slony-I: subscriber lists of set % and % are different', p_new_set_id, v_old_set_id; end if; if exists (select true from sl_subscribe SUB1 where SUB1.sub_set = v_old_set_id and SUB1.sub_receiver not in (select SUB2.sub_receiver from sl_subscribe SUB2 where SUB2.sub_set = p_new_set_id)) then raise exception 'Slony-I: subscriber lists of set % and % are different', v_old_set_id, p_new_set_id; end if; -- ---- -- Change the set the table belongs to -- ---- perform createEvent('_schemadoc', 'SYNC', NULL); perform setMoveTable_int(p_tab_id, p_new_set_id); return createEvent('_schemadoc', 'SET_MOVE_TABLE', p_tab_id, p_new_set_id); end;