From a829b7555be2bf7930ea5bb3d23a14a23fa6df01 Mon Sep 17 00:00:00 2001 From: Burak Velioglu Date: Sun, 13 Feb 2022 18:35:48 +0300 Subject: [PATCH] Add function propagation tests --- .../regress/expected/function_propagation.out | 273 ++++++++++++++++++ .../expected/function_propagation_0.out | 265 +++++++++++++++++ src/test/regress/multi_1_schedule | 3 + src/test/regress/sql/function_propagation.sql | 155 ++++++++++ 4 files changed, 696 insertions(+) create mode 100644 src/test/regress/expected/function_propagation.out create mode 100644 src/test/regress/expected/function_propagation_0.out create mode 100644 src/test/regress/sql/function_propagation.sql diff --git a/src/test/regress/expected/function_propagation.out b/src/test/regress/expected/function_propagation.out new file mode 100644 index 000000000..1579198ae --- /dev/null +++ b/src/test/regress/expected/function_propagation.out @@ -0,0 +1,273 @@ +CREATE SCHEMA function_propagation_schema; +SET search_path TO 'function_propagation_schema'; +-- Check whether supported dependencies can be distributed while propagating functions +-- Check types +BEGIN; + CREATE TYPE function_prop_type AS (a int, b int); +COMMIT; +CREATE OR REPLACE FUNCTION func_1(param_1 function_prop_type) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +-- Check all dependent objects and function depends on all nodes +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema'::regnamespace::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (schema,{function_propagation_schema},{}) +(1 row) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type'::regtype::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (type,{function_propagation_schema.function_prop_type},{}) +(1 row) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_1'::regproc::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (function,"{function_propagation_schema,func_1}",{function_propagation_schema.function_prop_type}) +(1 row) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema'::regnamespace::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (schema,{function_propagation_schema},{}) + localhost | 57638 | t | (schema,{function_propagation_schema},{}) +(2 rows) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type'::regtype::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (type,{function_propagation_schema.function_prop_type},{}) + localhost | 57638 | t | (type,{function_propagation_schema.function_prop_type},{}) +(2 rows) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_1'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (function,"{function_propagation_schema,func_1}",{function_propagation_schema.function_prop_type}) + localhost | 57638 | t | (function,"{function_propagation_schema,func_1}",{function_propagation_schema.function_prop_type}) +(2 rows) + +BEGIN; + CREATE TYPE function_prop_type_2 AS (a int, b int); +COMMIT; +CREATE OR REPLACE FUNCTION func_2(param_1 int) +RETURNS function_prop_type_2 +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type_2'::regtype::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (type,{function_propagation_schema.function_prop_type_2},{}) +(1 row) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_2'::regproc::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (function,"{function_propagation_schema,func_2}",{integer}) +(1 row) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type_2'::regtype::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (type,{function_propagation_schema.function_prop_type_2},{}) + localhost | 57638 | t | (type,{function_propagation_schema.function_prop_type_2},{}) +(2 rows) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_2'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (function,"{function_propagation_schema,func_2}",{integer}) + localhost | 57638 | t | (function,"{function_propagation_schema,func_2}",{integer}) +(2 rows) + +BEGIN; + CREATE TYPE function_prop_type_3 AS (a int, b int); +COMMIT; +-- Objects in the body part is not found as dependency +CREATE OR REPLACE FUNCTION func_3(param_1 int) +RETURNS int +LANGUAGE plpgsql AS +$$ +DECLARE + internal_param1 function_prop_type_3; +BEGIN + return 1; +END; +$$; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type_3'::regtype::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- +(0 rows) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_3'::regproc::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (function,"{function_propagation_schema,func_3}",{integer}) +(1 row) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_3'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (function,"{function_propagation_schema,func_3}",{integer}) + localhost | 57638 | t | (function,"{function_propagation_schema,func_3}",{integer}) +(2 rows) + +-- Check sequences +-- Note that after pg 14 creating sequence doesn't create type +-- it is expected for versions > pg14 to fail sequence tests below +CREATE SEQUENCE function_prop_seq; +CREATE OR REPLACE FUNCTION func_4(param_1 function_prop_seq) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq'::regclass::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (sequence,"{function_propagation_schema,function_prop_seq}",{}) +(1 row) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_4'::regproc::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (function,"{function_propagation_schema,func_4}",{function_propagation_schema.function_prop_seq}) +(1 row) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq'::regclass::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (sequence,"{function_propagation_schema,function_prop_seq}",{}) + localhost | 57638 | t | (sequence,"{function_propagation_schema,function_prop_seq}",{}) +(2 rows) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_4'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (function,"{function_propagation_schema,func_4}",{function_propagation_schema.function_prop_seq}) + localhost | 57638 | t | (function,"{function_propagation_schema,func_4}",{function_propagation_schema.function_prop_seq}) +(2 rows) + +CREATE SEQUENCE function_prop_seq_2; +CREATE OR REPLACE FUNCTION func_5(param_1 int) +RETURNS function_prop_seq_2 +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq_2'::regclass::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (sequence,"{function_propagation_schema,function_prop_seq_2}",{}) +(1 row) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_5'::regproc::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (function,"{function_propagation_schema,func_5}",{integer}) +(1 row) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq_2'::regclass::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (sequence,"{function_propagation_schema,function_prop_seq_2}",{}) + localhost | 57638 | t | (sequence,"{function_propagation_schema,function_prop_seq_2}",{}) +(2 rows) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_5'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (function,"{function_propagation_schema,func_5}",{integer}) + localhost | 57638 | t | (function,"{function_propagation_schema,func_5}",{integer}) +(2 rows) + +-- Check table +CREATE TABLE function_prop_table(a int, b int); +-- Non-distributed table is not distributed as dependency +CREATE OR REPLACE FUNCTION func_6(param_1 function_prop_table) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +WARNING: Citus can't distribute functions having dependency on non-distributed relations +DETAIL: Function will be created only locally +HINT: To distribute function, distribute dependent relations first +CREATE OR REPLACE FUNCTION func_7(param_1 int) +RETURNS function_prop_table +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +WARNING: Citus can't distribute functions having dependency on non-distributed relations +DETAIL: Function will be created only locally +HINT: To distribute function, distribute dependent relations first +-- Functions can be created with distributed table dependency +SELECT create_distributed_table('function_prop_table', 'a'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +CREATE OR REPLACE FUNCTION func_8(param_1 function_prop_table) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_8'::regproc::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (function,"{function_propagation_schema,func_8}",{function_propagation_schema.function_prop_table}) +(1 row) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_8'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (function,"{function_propagation_schema,func_8}",{function_propagation_schema.function_prop_table}) + localhost | 57638 | t | (function,"{function_propagation_schema,func_8}",{function_propagation_schema.function_prop_table}) +(2 rows) + +-- Views are not supported +CREATE VIEW function_prop_view AS SELECT * FROM function_prop_table; +CREATE OR REPLACE FUNCTION func_9(param_1 function_prop_view) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +ERROR: type function_propagation_schema.function_prop_view does not exist +CONTEXT: while executing command on localhost:xxxxx +CREATE OR REPLACE FUNCTION func_10(param_1 int) +RETURNS function_prop_view +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +ERROR: type "function_propagation_schema.function_prop_view" does not exist +CONTEXT: while executing command on localhost:xxxxx +RESET search_path; diff --git a/src/test/regress/expected/function_propagation_0.out b/src/test/regress/expected/function_propagation_0.out new file mode 100644 index 000000000..0c2f63656 --- /dev/null +++ b/src/test/regress/expected/function_propagation_0.out @@ -0,0 +1,265 @@ +CREATE SCHEMA function_propagation_schema; +SET search_path TO 'function_propagation_schema'; +-- Check whether supported dependencies can be distributed while propagating functions +-- Check types +BEGIN; + CREATE TYPE function_prop_type AS (a int, b int); +COMMIT; +CREATE OR REPLACE FUNCTION func_1(param_1 function_prop_type) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +-- Check all dependent objects and function depends on all nodes +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema'::regnamespace::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (schema,{function_propagation_schema},{}) +(1 row) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type'::regtype::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (type,{function_propagation_schema.function_prop_type},{}) +(1 row) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_1'::regproc::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (function,"{function_propagation_schema,func_1}",{function_propagation_schema.function_prop_type}) +(1 row) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema'::regnamespace::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (schema,{function_propagation_schema},{}) + localhost | 57638 | t | (schema,{function_propagation_schema},{}) +(2 rows) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type'::regtype::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (type,{function_propagation_schema.function_prop_type},{}) + localhost | 57638 | t | (type,{function_propagation_schema.function_prop_type},{}) +(2 rows) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_1'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (function,"{function_propagation_schema,func_1}",{function_propagation_schema.function_prop_type}) + localhost | 57638 | t | (function,"{function_propagation_schema,func_1}",{function_propagation_schema.function_prop_type}) +(2 rows) + +BEGIN; + CREATE TYPE function_prop_type_2 AS (a int, b int); +COMMIT; +CREATE OR REPLACE FUNCTION func_2(param_1 int) +RETURNS function_prop_type_2 +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type_2'::regtype::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (type,{function_propagation_schema.function_prop_type_2},{}) +(1 row) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_2'::regproc::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (function,"{function_propagation_schema,func_2}",{integer}) +(1 row) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type_2'::regtype::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (type,{function_propagation_schema.function_prop_type_2},{}) + localhost | 57638 | t | (type,{function_propagation_schema.function_prop_type_2},{}) +(2 rows) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_2'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (function,"{function_propagation_schema,func_2}",{integer}) + localhost | 57638 | t | (function,"{function_propagation_schema,func_2}",{integer}) +(2 rows) + +BEGIN; + CREATE TYPE function_prop_type_3 AS (a int, b int); +COMMIT; +-- Objects in the body part is not found as dependency +CREATE OR REPLACE FUNCTION func_3(param_1 int) +RETURNS int +LANGUAGE plpgsql AS +$$ +DECLARE + internal_param1 function_prop_type_3; +BEGIN + return 1; +END; +$$; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type_3'::regtype::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- +(0 rows) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_3'::regproc::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (function,"{function_propagation_schema,func_3}",{integer}) +(1 row) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_3'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (function,"{function_propagation_schema,func_3}",{integer}) + localhost | 57638 | t | (function,"{function_propagation_schema,func_3}",{integer}) +(2 rows) + +-- Check sequences +-- Note that after pg 14 creating sequence doesn't create type +-- it is expected for versions > pg14 to fail sequence tests below +CREATE SEQUENCE function_prop_seq; +CREATE OR REPLACE FUNCTION func_4(param_1 function_prop_seq) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +ERROR: type function_prop_seq does not exist +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq'::regclass::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- +(0 rows) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_4'::regproc::oid; +ERROR: function "function_propagation_schema.func_4" does not exist +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq'::regclass::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | f | ERROR: relation "function_propagation_schema.function_prop_seq" does not exist + localhost | 57638 | f | ERROR: relation "function_propagation_schema.function_prop_seq" does not exist +(2 rows) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_4'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | f | ERROR: function "function_propagation_schema.func_4" does not exist + localhost | 57638 | f | ERROR: function "function_propagation_schema.func_4" does not exist +(2 rows) + +CREATE SEQUENCE function_prop_seq_2; +CREATE OR REPLACE FUNCTION func_5(param_1 int) +RETURNS function_prop_seq_2 +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +ERROR: type "function_prop_seq_2" does not exist +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq_2'::regclass::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- +(0 rows) + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_5'::regproc::oid; +ERROR: function "function_propagation_schema.func_5" does not exist +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq_2'::regclass::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | f | ERROR: relation "function_propagation_schema.function_prop_seq_2" does not exist + localhost | 57638 | f | ERROR: relation "function_propagation_schema.function_prop_seq_2" does not exist +(2 rows) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_5'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | f | ERROR: function "function_propagation_schema.func_5" does not exist + localhost | 57638 | f | ERROR: function "function_propagation_schema.func_5" does not exist +(2 rows) + +-- Check table +CREATE TABLE function_prop_table(a int, b int); +-- Non-distributed table is not distributed as dependency +CREATE OR REPLACE FUNCTION func_6(param_1 function_prop_table) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +WARNING: Citus can't distribute functions having dependency on non-distributed relations +DETAIL: Function will be created only locally +HINT: To distribute function, distribute dependent relations first +CREATE OR REPLACE FUNCTION func_7(param_1 int) +RETURNS function_prop_table +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +WARNING: Citus can't distribute functions having dependency on non-distributed relations +DETAIL: Function will be created only locally +HINT: To distribute function, distribute dependent relations first +-- Functions can be created with distributed table dependency +SELECT create_distributed_table('function_prop_table', 'a'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +CREATE OR REPLACE FUNCTION func_8(param_1 function_prop_table) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_8'::regproc::oid; + pg_identify_object_as_address +--------------------------------------------------------------------- + (function,"{function_propagation_schema,func_8}",{function_propagation_schema.function_prop_table}) +(1 row) + +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_8'::regproc::oid;$$) ORDER BY 1,2; + nodename | nodeport | success | result +--------------------------------------------------------------------- + localhost | 57637 | t | (function,"{function_propagation_schema,func_8}",{function_propagation_schema.function_prop_table}) + localhost | 57638 | t | (function,"{function_propagation_schema,func_8}",{function_propagation_schema.function_prop_table}) +(2 rows) + +-- Views are not supported +CREATE VIEW function_prop_view AS SELECT * FROM function_prop_table; +CREATE OR REPLACE FUNCTION func_9(param_1 function_prop_view) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +ERROR: type function_propagation_schema.function_prop_view does not exist +CONTEXT: while executing command on localhost:xxxxx +CREATE OR REPLACE FUNCTION func_10(param_1 int) +RETURNS function_prop_view +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; +ERROR: type "function_propagation_schema.function_prop_view" does not exist +CONTEXT: while executing command on localhost:xxxxx +RESET search_path; diff --git a/src/test/regress/multi_1_schedule b/src/test/regress/multi_1_schedule index 1a071da8a..0029383cf 100644 --- a/src/test/regress/multi_1_schedule +++ b/src/test/regress/multi_1_schedule @@ -312,6 +312,8 @@ test: ssl_by_default # --------- # object distribution tests +# TODO: After deprecating parameterless create_distributed_function combine +# distributed_functions and function_propagation tests # --------- test: distributed_types distributed_types_conflict disable_object_propagation distributed_types_xact_add_enum_value test: check_mx @@ -319,6 +321,7 @@ test: distributed_functions distributed_functions_conflict test: distributed_collations test: distributed_procedure test: distributed_collations_conflict +test: function_propagation test: check_mx # --------- diff --git a/src/test/regress/sql/function_propagation.sql b/src/test/regress/sql/function_propagation.sql new file mode 100644 index 000000000..2e0dd7d1c --- /dev/null +++ b/src/test/regress/sql/function_propagation.sql @@ -0,0 +1,155 @@ +CREATE SCHEMA function_propagation_schema; +SET search_path TO 'function_propagation_schema'; + +-- Check whether supported dependencies can be distributed while propagating functions + +-- Check types +BEGIN; + CREATE TYPE function_prop_type AS (a int, b int); +COMMIT; + +CREATE OR REPLACE FUNCTION func_1(param_1 function_prop_type) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; + +-- Check all dependent objects and function depends on all nodes +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema'::regnamespace::oid; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type'::regtype::oid; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_1'::regproc::oid; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema'::regnamespace::oid;$$) ORDER BY 1,2; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type'::regtype::oid;$$) ORDER BY 1,2; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_1'::regproc::oid;$$) ORDER BY 1,2; + +BEGIN; + CREATE TYPE function_prop_type_2 AS (a int, b int); +COMMIT; + +CREATE OR REPLACE FUNCTION func_2(param_1 int) +RETURNS function_prop_type_2 +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type_2'::regtype::oid; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_2'::regproc::oid; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type_2'::regtype::oid;$$) ORDER BY 1,2; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_2'::regproc::oid;$$) ORDER BY 1,2; + +BEGIN; + CREATE TYPE function_prop_type_3 AS (a int, b int); +COMMIT; + +-- Objects in the body part is not found as dependency +CREATE OR REPLACE FUNCTION func_3(param_1 int) +RETURNS int +LANGUAGE plpgsql AS +$$ +DECLARE + internal_param1 function_prop_type_3; +BEGIN + return 1; +END; +$$; + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_type_3'::regtype::oid; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_3'::regproc::oid; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_3'::regproc::oid;$$) ORDER BY 1,2; + +-- Check sequences +-- Note that after pg 14 creating sequence doesn't create type +-- it is expected for versions > pg14 to fail sequence tests below +CREATE SEQUENCE function_prop_seq; +CREATE OR REPLACE FUNCTION func_4(param_1 function_prop_seq) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq'::regclass::oid; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_4'::regproc::oid; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq'::regclass::oid;$$) ORDER BY 1,2; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_4'::regproc::oid;$$) ORDER BY 1,2; + +CREATE SEQUENCE function_prop_seq_2; +CREATE OR REPLACE FUNCTION func_5(param_1 int) +RETURNS function_prop_seq_2 +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq_2'::regclass::oid; +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_5'::regproc::oid; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.function_prop_seq_2'::regclass::oid;$$) ORDER BY 1,2; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_5'::regproc::oid;$$) ORDER BY 1,2; + +-- Check table +CREATE TABLE function_prop_table(a int, b int); + +-- Non-distributed table is not distributed as dependency +CREATE OR REPLACE FUNCTION func_6(param_1 function_prop_table) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; + +CREATE OR REPLACE FUNCTION func_7(param_1 int) +RETURNS function_prop_table +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; + +-- Functions can be created with distributed table dependency +SELECT create_distributed_table('function_prop_table', 'a'); +CREATE OR REPLACE FUNCTION func_8(param_1 function_prop_table) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; + +SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_8'::regproc::oid; +SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_8'::regproc::oid;$$) ORDER BY 1,2; + +-- Views are not supported +CREATE VIEW function_prop_view AS SELECT * FROM function_prop_table; +CREATE OR REPLACE FUNCTION func_9(param_1 function_prop_view) +RETURNS int +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; + +CREATE OR REPLACE FUNCTION func_10(param_1 int) +RETURNS function_prop_view +LANGUAGE plpgsql AS +$$ +BEGIN + return 1; +END; +$$; + +RESET search_path;