| -- |
| -- Test using functions with EXECUTE ON options in utility mode. |
| -- |
| |
| -- First, create test functions with different EXECUTE ON options |
| |
| create function srf_on_master () returns setof text as $$ |
| begin /* in func */ |
| return next 'foo ' || current_setting('gp_contentid'); /* in func */ |
| return next 'bar ' || current_setting('gp_contentid'); /* in func */ |
| end; /* in func */ |
| $$ language plpgsql EXECUTE ON COORDINATOR; |
| |
| create function srf_on_all_segments () returns setof text as $$ |
| begin /* in func */ |
| return next 'foo ' || current_setting('gp_contentid'); /* in func */ |
| return next 'bar ' || current_setting('gp_contentid'); /* in func */ |
| end; /* in func */ |
| $$ language plpgsql EXECUTE ON ALL SEGMENTS; |
| |
| create function srf_on_any () returns setof text as $$ |
| begin /* in func */ |
| return next 'foo ' || current_setting('gp_contentid'); /* in func */ |
| return next 'bar ' || current_setting('gp_contentid'); /* in func */ |
| end; /* in func */ |
| $$ language plpgsql EXECUTE ON ANY IMMUTABLE; |
| |
| create function srf_on_initplan () returns setof text as $$ |
| begin /* in func */ |
| return next 'foo ' || current_setting('gp_contentid'); /* in func */ |
| return next 'bar ' || current_setting('gp_contentid'); /* in func */ |
| end; /* in func */ |
| $$ language plpgsql EXECUTE ON INITPLAN; |
| |
| -- Now try executing them in utility mode, in the master node and on a |
| -- segment. The expected behavior is that the function runs on the node |
| -- we're connected to, ignoring the EXECUTE ON directives. |
| -- |
| -- Join with a table, to give the planner something more exciting to do |
| -- than just create the FunctionScan plan. |
| create table fewrows (t text) distributed by (t); |
| insert into fewrows select g from generate_series(1, 10) g; |
| |
| -1U: select * from srf_on_master() as srf (x) left join fewrows on x = t; |
| -1U: select * from srf_on_all_segments() as srf (x) left join fewrows on x = t; |
| -1U: select * from srf_on_any() as srf (x) left join fewrows on x = t; |
| -1U: select * from srf_on_initplan() as srf (x) left join fewrows on x = t; |
| |
| 1U: select * from srf_on_master(), fewrows; |
| 1U: select * from srf_on_all_segments(), fewrows; |
| 1U: select * from srf_on_any(), fewrows; |
| 1U: select * from srf_on_initplan(), fewrows; |