-- -- Perl Weekly Challenge 213 -- Task 2 -- -- See -- CREATE SCHEMA IF NOT EXISTS pwc213; /* CREATE OR REPLACE FUNCTION pwc213.task2_plpgsql( s int, d int, routes int[] ) RETURNS SETOF int AS $CODE$ SELECT pwc213.task2_plperl( s, d, routes ); $CODE$ LANGUAGE sql; */ CREATE OR REPLACE FUNCTION pwc213.task2_plpgsql( s int, d int, routes int[] ) RETURNS SETOF int AS $CODE$ DECLARE slice_size int := 3; current_route_index int; current_route int[]; next_route_index int; next_node int; need_loop boolean; node int; path int[]; BEGIN need_loop := true; current_route_index := 1; <> WHILE need_loop LOOP FOREACH node IN ARRAY routes[ current_route_index : current_route_index ] LOOP RETURN NEXT node; IF node = d THEN EXIT; END IF; need_loop := false; FOR next_route_index IN current_route_index + 1 .. array_length( routes, 1 ) LOOP FOREACH next_node IN ARRAY routes[ next_route_index : next_route_index ] LOOP IF next_node = node THEN current_route_index := next_route_index; need_loop := true; CONTINUE rescan; END IF; END LOOP; END LOOP; END LOOP; END LOOP; IF node <> d THEN RAISE EXCEPTION 'Cannot find the path!'; END IF; return; END $CODE$ LANGUAGE plpgsql;