Notice when create_distributed_function called without params (#5752)

* Notice when create_distributed_function called without params

* Move variable comments to top

* Add valid check for cache entry

* add objtype to notice msg

* update test outputs

* Add more tests

* Address feedback
pull/5760/head
Ahmet Gedemenli 2022-03-04 17:26:39 +03:00 committed by GitHub
parent 28443aee0c
commit b8eedcd261
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 558 additions and 205 deletions

View File

@ -69,6 +69,10 @@
(strncmp(arg, prefix, strlen(prefix)) == 0) (strncmp(arg, prefix, strlen(prefix)) == 0)
/* forward declaration for helper functions*/ /* forward declaration for helper functions*/
static bool RecreateSameNonColocatedFunction(ObjectAddress functionAddress,
char *distributionArgumentName,
bool colocateWithTableNameDefault,
bool *forceDelegationAddress);
static void ErrorIfAnyNodeDoesNotHaveMetadata(void); static void ErrorIfAnyNodeDoesNotHaveMetadata(void);
static char * GetAggregateDDLCommand(const RegProcedure funcOid, bool useCreateOrReplace); static char * GetAggregateDDLCommand(const RegProcedure funcOid, bool useCreateOrReplace);
static char * GetFunctionAlterOwnerCommand(const RegProcedure funcOid); static char * GetFunctionAlterOwnerCommand(const RegProcedure funcOid);
@ -128,6 +132,7 @@ create_distributed_function(PG_FUNCTION_ARGS)
char *distributionArgumentName = NULL; char *distributionArgumentName = NULL;
char *colocateWithTableName = NULL; char *colocateWithTableName = NULL;
bool colocateWithTableNameDefault = false;
bool *forceDelegationAddress = NULL; bool *forceDelegationAddress = NULL;
bool forceDelegation = false; bool forceDelegation = false;
ObjectAddress extensionAddress = { 0 }; ObjectAddress extensionAddress = { 0 };
@ -167,8 +172,13 @@ create_distributed_function(PG_FUNCTION_ARGS)
colocateWithText = PG_GETARG_TEXT_P(2); colocateWithText = PG_GETARG_TEXT_P(2);
colocateWithTableName = text_to_cstring(colocateWithText); colocateWithTableName = text_to_cstring(colocateWithText);
if (pg_strncasecmp(colocateWithTableName, "default", NAMEDATALEN) == 0)
{
colocateWithTableNameDefault = true;
}
/* check if the colocation belongs to a reference table */ /* check if the colocation belongs to a reference table */
if (pg_strncasecmp(colocateWithTableName, "default", NAMEDATALEN) != 0) if (!colocateWithTableNameDefault)
{ {
Oid colocationRelationId = ResolveRelationId(colocateWithText, false); Oid colocationRelationId = ResolveRelationId(colocateWithText, false);
colocatedWithReferenceTable = IsCitusTableType(colocationRelationId, colocatedWithReferenceTable = IsCitusTableType(colocationRelationId,
@ -192,6 +202,20 @@ create_distributed_function(PG_FUNCTION_ARGS)
ObjectAddressSet(functionAddress, ProcedureRelationId, funcOid); ObjectAddressSet(functionAddress, ProcedureRelationId, funcOid);
if (RecreateSameNonColocatedFunction(functionAddress,
distributionArgumentName,
colocateWithTableNameDefault,
forceDelegationAddress))
{
char *schemaName = get_namespace_name(get_func_namespace(funcOid));
char *functionName = get_func_name(funcOid);
char *qualifiedName = quote_qualified_identifier(schemaName, functionName);
ereport(NOTICE, (errmsg("procedure %s is already distributed", qualifiedName),
errdetail("Citus distributes procedures with CREATE "
"[PROCEDURE|FUNCTION|AGGREGATE] commands")));
PG_RETURN_VOID();
}
/* /*
* If the function is owned by an extension, only update the * If the function is owned by an extension, only update the
* pg_dist_object, and not propagate the CREATE FUNCTION. Function * pg_dist_object, and not propagate the CREATE FUNCTION. Function
@ -259,6 +283,55 @@ create_distributed_function(PG_FUNCTION_ARGS)
} }
/*
* RecreateSameNonColocatedFunction returns true if the given parameters of
* create_distributed_function will not change anything on the given function.
* Returns false otherwise.
*/
static bool
RecreateSameNonColocatedFunction(ObjectAddress functionAddress,
char *distributionArgumentName,
bool colocateWithTableNameDefault,
bool *forceDelegationAddress)
{
DistObjectCacheEntry *cacheEntry =
LookupDistObjectCacheEntry(ProcedureRelationId,
functionAddress.objectId,
InvalidOid);
if (cacheEntry == NULL || !cacheEntry->isValid || !cacheEntry->isDistributed)
{
return false;
}
/*
* If the colocationId, forceDelegation and distributionArgIndex fields of a
* pg_dist_object entry of a distributed function are all set to zero, it means
* that function is either automatically distributed by ddl propagation, without
* calling create_distributed_function. Or, it could be distributed via
* create_distributed_function, but with no parameters.
*
* For these cases, calling create_distributed_function for that function,
* without parameters would be idempotent. Hence we can simply early return here,
* by providing a notice message to the user.
*/
/* are pg_dist_object fields set to zero? */
bool functionDistributedWithoutParams =
cacheEntry->colocationId == 0 &&
cacheEntry->forceDelegation == 0 &&
cacheEntry->distributionArgIndex == 0;
/* called create_distributed_function without parameters? */
bool distributingAgainWithNoParams =
distributionArgumentName == NULL &&
colocateWithTableNameDefault &&
forceDelegationAddress == NULL;
return functionDistributedWithoutParams && distributingAgainWithNoParams;
}
/* /*
* ErrorIfAnyNodeDoesNotHaveMetadata throws error if any * ErrorIfAnyNodeDoesNotHaveMetadata throws error if any
* of the worker nodes does not have the metadata. * of the worker nodes does not have the metadata.

View File

@ -40,12 +40,16 @@ create aggregate sum2_strict (int) (
combinefunc = sum2_sfunc_strict combinefunc = sum2_sfunc_strict
); );
select create_distributed_function('sum2(int)'); select create_distributed_function('sum2(int)');
NOTICE: procedure aggregate_support.sum2 is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('sum2_strict(int)'); select create_distributed_function('sum2_strict(int)');
NOTICE: procedure aggregate_support.sum2_strict is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -96,12 +100,16 @@ create aggregate psum_strict(int, int)(
initcond=0 initcond=0
); );
select create_distributed_function('psum(int,int)'); select create_distributed_function('psum(int,int)');
NOTICE: procedure aggregate_support.psum is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('psum_strict(int,int)'); select create_distributed_function('psum_strict(int,int)');
NOTICE: procedure aggregate_support.psum_strict is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -298,6 +306,8 @@ SELECT run_command_on_workers($$select count(*) from pg_aggregate where aggfnoid
(2 rows) (2 rows)
select create_distributed_function('binstragg(text,text)'); select create_distributed_function('binstragg(text,text)');
NOTICE: procedure aggregate_support.binstragg is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -527,12 +537,16 @@ CREATE AGGREGATE last (
combinefunc = last_agg combinefunc = last_agg
); );
SELECT create_distributed_function('first(anyelement)'); SELECT create_distributed_function('first(anyelement)');
NOTICE: procedure aggregate_support.first is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
SELECT create_distributed_function('last(anyelement)'); SELECT create_distributed_function('last(anyelement)');
NOTICE: procedure aggregate_support.last is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -590,6 +604,8 @@ SELECT run_command_on_workers($$select aggfnoid from pg_aggregate where aggfnoid
(2 rows) (2 rows)
select create_distributed_function('sumstring(text)'); select create_distributed_function('sumstring(text)');
NOTICE: procedure aggregate_support.sumstring is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -614,6 +630,8 @@ create aggregate array_collect_sort(el int) (
initcond = '{}' initcond = '{}'
); );
select create_distributed_function('array_collect_sort(int)'); select create_distributed_function('array_collect_sort(int)');
NOTICE: procedure aggregate_support.array_collect_sort is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -11,6 +11,8 @@ BEGIN
RETURN localGroupId; RETURN localGroupId;
END; $$ language plpgsql VOLATILE; END; $$ language plpgsql VOLATILE;
SELECT create_distributed_function('get_local_node_id_volatile()'); SELECT create_distributed_function('get_local_node_id_volatile()');
NOTICE: procedure coordinator_evaluation.get_local_node_id_volatile is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -24,6 +26,8 @@ BEGIN
RETURN localGroupId; RETURN localGroupId;
END; $$ language plpgsql VOLATILE; END; $$ language plpgsql VOLATILE;
SELECT create_distributed_function('get_local_node_id_volatile_sum_with_param(int)'); SELECT create_distributed_function('get_local_node_id_volatile_sum_with_param(int)');
NOTICE: procedure coordinator_evaluation.get_local_node_id_volatile_sum_with_param is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -21,6 +21,8 @@ BEGIN
RETURN localGroupId; RETURN localGroupId;
END; $$ language plpgsql STABLE; END; $$ language plpgsql STABLE;
SELECT create_distributed_function('get_local_node_id_stable()'); SELECT create_distributed_function('get_local_node_id_stable()');
NOTICE: procedure coordinator_evaluation_combinations_modify.get_local_node_id_stable is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -21,6 +21,8 @@ BEGIN
RETURN localGroupId; RETURN localGroupId;
END; $$ language plpgsql VOLATILE; END; $$ language plpgsql VOLATILE;
SELECT create_distributed_function('get_local_node_id_volatile()'); SELECT create_distributed_function('get_local_node_id_volatile()');
NOTICE: procedure coordinator_evaluation_combinations.get_local_node_id_volatile is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -33,6 +33,8 @@ BEGIN
END; END;
$$; $$;
SELECT create_distributed_function('notice(text)'); SELECT create_distributed_function('notice(text)');
NOTICE: procedure function_tests.notice is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -486,6 +488,8 @@ AS 'select $1 = $2;'
IMMUTABLE IMMUTABLE
RETURNS NULL ON NULL INPUT; RETURNS NULL ON NULL INPUT;
select create_distributed_function('eq(macaddr,macaddr)'); select create_distributed_function('eq(macaddr,macaddr)');
NOTICE: procedure function_tests.eq is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -797,6 +801,8 @@ BEGIN
END; END;
$$; $$;
SELECT create_distributed_function('func_with_return_table(int)'); SELECT create_distributed_function('func_with_return_table(int)');
NOTICE: procedure function_tests.func_with_return_table is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -824,6 +830,8 @@ CREATE OR REPLACE FUNCTION func_with_out_param(a int, out b int)
RETURNS int RETURNS int
LANGUAGE sql AS $$ select 1; $$; LANGUAGE sql AS $$ select 1; $$;
SELECT create_distributed_function('func_with_out_param(int)'); SELECT create_distributed_function('func_with_out_param(int)');
NOTICE: procedure function_tests.func_with_out_param is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -869,6 +877,8 @@ SELECT create_distributed_function('func_with_inout_param(int)');
ERROR: function "func_with_inout_param(int)" does not exist ERROR: function "func_with_inout_param(int)" does not exist
-- this should work -- this should work
SELECT create_distributed_function('func_with_inout_param(int,int)'); SELECT create_distributed_function('func_with_inout_param(int,int)');
NOTICE: procedure function_tests.func_with_inout_param is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -893,6 +903,8 @@ CREATE OR REPLACE FUNCTION func_with_variadic_param(a int, variadic b int[])
LANGUAGE sql AS $$ select 1; $$; LANGUAGE sql AS $$ select 1; $$;
-- this should work -- this should work
SELECT create_distributed_function('func_with_variadic_param(int,int[])'); SELECT create_distributed_function('func_with_variadic_param(int,int[])');
NOTICE: procedure function_tests.func_with_variadic_param is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -923,6 +935,8 @@ $BODY$
LANGUAGE plpgsql VOLATILE LANGUAGE plpgsql VOLATILE
COST 100; COST 100;
SELECT create_distributed_function('func_returning_setof_int(date,interval)'); SELECT create_distributed_function('func_returning_setof_int(date,interval)');
NOTICE: procedure function_tests.func_returning_setof_int is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -961,6 +975,8 @@ $BODY$
LANGUAGE plpgsql VOLATILE LANGUAGE plpgsql VOLATILE
COST 100; COST 100;
SELECT create_distributed_function('func_returning_setof_int_with_variadic_param(date,int[])'); SELECT create_distributed_function('func_returning_setof_int_with_variadic_param(date,int[])');
NOTICE: procedure function_tests.func_returning_setof_int_with_variadic_param is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -997,6 +1013,8 @@ SELECT create_distributed_function('proc_with_variadic_param(date)');
ERROR: function "proc_with_variadic_param(date)" does not exist ERROR: function "proc_with_variadic_param(date)" does not exist
-- this should work -- this should work
SELECT create_distributed_function('proc_with_variadic_param(date,int[])'); SELECT create_distributed_function('proc_with_variadic_param(date,int[])');
NOTICE: procedure function_tests.proc_with_variadic_param is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -1028,6 +1046,8 @@ SELECT create_distributed_function('proc_with_inout_param(date)');
ERROR: function "proc_with_inout_param(date)" does not exist ERROR: function "proc_with_inout_param(date)" does not exist
-- this should work -- this should work
SELECT create_distributed_function('proc_with_inout_param(date,int)'); SELECT create_distributed_function('proc_with_inout_param(date,int)');
NOTICE: procedure function_tests.proc_with_inout_param is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -26,6 +26,8 @@ CREATE AGGREGATE existing_agg(int) (
STYPE = int STYPE = int
); );
SELECT create_distributed_function('existing_agg(int)'); SELECT create_distributed_function('existing_agg(int)');
NOTICE: procedure proc_conflict.existing_agg is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -87,6 +89,8 @@ CREATE AGGREGATE existing_agg(int) (
STYPE = int STYPE = int
); );
SELECT create_distributed_function('existing_agg(int)'); SELECT create_distributed_function('existing_agg(int)');
NOTICE: procedure proc_conflict.existing_agg is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -307,8 +307,8 @@ $$ LANGUAGE plpgsql;
DEBUG: switching to sequential query execution mode DEBUG: switching to sequential query execution mode
DETAIL: A command for a distributed function is run. To make sure subsequent commands see the function correctly we need to make sure to use only one connection for all future commands DETAIL: A command for a distributed function is run. To make sure subsequent commands see the function correctly we need to make sure to use only one connection for all future commands
SELECT create_distributed_function('func_calls_forcepush_func()'); SELECT create_distributed_function('func_calls_forcepush_func()');
DEBUG: switching to sequential query execution mode NOTICE: procedure forcepushdown_schema.func_calls_forcepush_func is already distributed
DETAIL: A command for a distributed function is run. To make sure subsequent commands see the function correctly we need to make sure to use only one connection for all future commands DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -134,7 +134,7 @@ BEGIN
return 1; return 1;
END; END;
$$; $$;
WARNING: Citus can't distribute function "func_4" having dependency on non-distributed relation "function_prop_table" WARNING: Citus can't distribute function "func_4" having dependency on non-distributed relation "function_prop_table"
DETAIL: Function will be created only locally DETAIL: Function will be created only locally
HINT: To distribute function, distribute dependent relations first. Then, re-create the function HINT: To distribute function, distribute dependent relations first. Then, re-create the function
CREATE OR REPLACE FUNCTION func_5(param_1 int) CREATE OR REPLACE FUNCTION func_5(param_1 int)
@ -319,29 +319,29 @@ $$;
-- Show that functions are propagated (or not) as a dependency -- Show that functions are propagated (or not) as a dependency
-- Function as a default column -- Function as a default column
BEGIN; BEGIN;
CREATE OR REPLACE FUNCTION func_in_transaction_def() CREATE OR REPLACE FUNCTION func_in_transaction_def()
RETURNS int RETURNS int
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return 1; return 1;
END; END;
$$; $$;
-- Function shouldn't be propagated within transaction -- Function shouldn't be propagated within transaction
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_def'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_def'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
CREATE TABLE table_to_prop_func(id int, col_1 int default func_in_transaction_def()); CREATE TABLE table_to_prop_func(id int, col_1 int default func_in_transaction_def());
SELECT create_distributed_table('table_to_prop_func','id'); SELECT create_distributed_table('table_to_prop_func','id');
create_distributed_table create_distributed_table
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
-- Function should be marked as distributed after distributing the table that depends on it -- Function should be marked as distributed after distributing the table that depends on it
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_def'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_def'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_in_transaction_def}",{}) (function,"{function_propagation_schema,func_in_transaction_def}",{})
@ -350,7 +350,7 @@ SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dis
COMMIT; COMMIT;
-- Function should be marked as distributed on the worker after committing changes -- Function should be marked as distributed on the worker after committing changes
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_in_transaction_def'::regproc::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_in_transaction_def'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_def}",{}) localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_def}",{})
localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_def}",{}) localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_def}",{})
@ -358,48 +358,48 @@ SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(clas
-- Multiple functions as a default column -- Multiple functions as a default column
BEGIN; BEGIN;
CREATE OR REPLACE FUNCTION func_in_transaction_1() CREATE OR REPLACE FUNCTION func_in_transaction_1()
RETURNS int RETURNS int
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return 1; return 1;
END; END;
$$; $$;
CREATE OR REPLACE FUNCTION func_in_transaction_2() CREATE OR REPLACE FUNCTION func_in_transaction_2()
RETURNS int RETURNS int
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return 1; return 1;
END; END;
$$; $$;
-- Functions shouldn't be propagated within transaction -- Functions shouldn't be propagated within transaction
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_1'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_1'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_2'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_2'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
CREATE TABLE table_to_prop_func_2(id int, col_1 int default func_in_transaction_1() + func_in_transaction_2()); CREATE TABLE table_to_prop_func_2(id int, col_1 int default func_in_transaction_1() + func_in_transaction_2());
SELECT create_distributed_table('table_to_prop_func_2','id'); SELECT create_distributed_table('table_to_prop_func_2','id');
create_distributed_table create_distributed_table
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
-- Functions should be marked as distribued after distributing the table that depends on it -- Functions should be marked as distribued after distributing the table that depends on it
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_1'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_1'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_in_transaction_1}",{}) (function,"{function_propagation_schema,func_in_transaction_1}",{})
(1 row) (1 row)
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_2'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_2'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_in_transaction_2}",{}) (function,"{function_propagation_schema,func_in_transaction_2}",{})
@ -408,14 +408,14 @@ SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dis
COMMIT; COMMIT;
-- Functions should be marked as distributed on the worker after committing changes -- Functions should be marked as distributed on the worker after committing changes
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_in_transaction_1'::regproc::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_in_transaction_1'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_1}",{}) localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_1}",{})
localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_1}",{}) localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_1}",{})
(2 rows) (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_in_transaction_2'::regproc::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_in_transaction_2'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_2}",{}) localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_2}",{})
localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_2}",{}) localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_2}",{})
@ -423,47 +423,47 @@ SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(clas
-- If function has dependency on non-distributed table it should error out -- If function has dependency on non-distributed table it should error out
BEGIN; BEGIN;
CREATE TABLE non_dist_table(id int); CREATE TABLE non_dist_table(id int);
CREATE OR REPLACE FUNCTION func_in_transaction_3(param_1 non_dist_table) CREATE OR REPLACE FUNCTION func_in_transaction_3(param_1 non_dist_table)
RETURNS int RETURNS int
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return 1; return 1;
END; END;
$$; $$;
CREATE TABLE table_to_prop_func_3(id int, col_1 int default func_in_transaction_3(NULL::non_dist_table)); CREATE TABLE table_to_prop_func_3(id int, col_1 int default func_in_transaction_3(NULL::non_dist_table));
-- It should error out as there is a non-distributed table dependency -- It should error out as there is a non-distributed table dependency
SELECT create_distributed_table('table_to_prop_func_3','id'); SELECT create_distributed_table('table_to_prop_func_3','id');
ERROR: Relation "table_to_prop_func_3" has dependency to a table "non_dist_table" that is not in Citus' metadata ERROR: Relation "table_to_prop_func_3" has dependency to a table "non_dist_table" that is not in Citus' metadata
HINT: Distribute dependent relation first. HINT: Distribute dependent relation first.
COMMIT; COMMIT;
-- Adding a column with default value should propagate the function -- Adding a column with default value should propagate the function
BEGIN; BEGIN;
CREATE TABLE table_to_prop_func_4(id int); CREATE TABLE table_to_prop_func_4(id int);
SELECT create_distributed_table('table_to_prop_func_4', 'id'); SELECT create_distributed_table('table_to_prop_func_4', 'id');
create_distributed_table create_distributed_table
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
CREATE OR REPLACE FUNCTION func_in_transaction_4() CREATE OR REPLACE FUNCTION func_in_transaction_4()
RETURNS int RETURNS int
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return 1; return 1;
END; END;
$$; $$;
-- Function shouldn't be propagated within transaction -- Function shouldn't be propagated within transaction
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_4'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_4'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
ALTER TABLE table_to_prop_func_4 ADD COLUMN col_1 int default function_propagation_schema.func_in_transaction_4(); ALTER TABLE table_to_prop_func_4 ADD COLUMN col_1 int default function_propagation_schema.func_in_transaction_4();
-- Function should be marked as distributed after adding the column -- Function should be marked as distributed after adding the column
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_4'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_4'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_in_transaction_4}",{}) (function,"{function_propagation_schema,func_in_transaction_4}",{})
@ -472,7 +472,7 @@ SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dis
COMMIT; COMMIT;
-- Functions should be marked as distributed on the worker after committing changes -- Functions should be marked as distributed on the worker after committing changes
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_in_transaction_4'::regproc::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_in_transaction_4'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_4}",{}) localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_4}",{})
localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_4}",{}) localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_4}",{})
@ -502,48 +502,48 @@ HINT: Distribute dependent relation first.
ROLLBACK; ROLLBACK;
-- Adding multiple columns with default values should propagate the function -- Adding multiple columns with default values should propagate the function
BEGIN; BEGIN;
CREATE OR REPLACE FUNCTION func_in_transaction_5() CREATE OR REPLACE FUNCTION func_in_transaction_5()
RETURNS int RETURNS int
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return 1; return 1;
END; END;
$$; $$;
CREATE OR REPLACE FUNCTION func_in_transaction_6() CREATE OR REPLACE FUNCTION func_in_transaction_6()
RETURNS int RETURNS int
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return 1; return 1;
END; END;
$$; $$;
-- Functions shouldn't be propagated within transaction -- Functions shouldn't be propagated within transaction
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_5'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_5'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_6'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_6'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
CREATE TABLE table_to_prop_func_5(id int, col_1 int default func_in_transaction_5(), col_2 int default func_in_transaction_6()); CREATE TABLE table_to_prop_func_5(id int, col_1 int default func_in_transaction_5(), col_2 int default func_in_transaction_6());
SELECT create_distributed_table('table_to_prop_func_5', 'id'); SELECT create_distributed_table('table_to_prop_func_5', 'id');
create_distributed_table create_distributed_table
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
-- Functions should be marked as distributed after adding the column -- Functions should be marked as distributed after adding the column
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_5'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_5'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_in_transaction_5}",{}) (function,"{function_propagation_schema,func_in_transaction_5}",{})
(1 row) (1 row)
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_6'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_6'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_in_transaction_6}",{}) (function,"{function_propagation_schema,func_in_transaction_6}",{})
@ -552,14 +552,14 @@ SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dis
COMMIT; COMMIT;
-- Functions should be marked as distributed on the worker after committing changes -- Functions should be marked as distributed on the worker after committing changes
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_in_transaction_5'::regproc::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_in_transaction_5'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_5}",{}) localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_5}",{})
localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_5}",{}) localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_5}",{})
(2 rows) (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_in_transaction_6'::regproc::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_in_transaction_6'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_6}",{}) localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_6}",{})
localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_6}",{}) localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_6}",{})
@ -567,29 +567,29 @@ SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(clas
-- Adding a constraint with function check should propagate the function -- Adding a constraint with function check should propagate the function
BEGIN; BEGIN;
CREATE OR REPLACE FUNCTION func_in_transaction_7(param_1 int) CREATE OR REPLACE FUNCTION func_in_transaction_7(param_1 int)
RETURNS boolean RETURNS boolean
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return param_1 > 5; return param_1 > 5;
END; END;
$$; $$;
-- Functions shouldn't be propagated within transaction -- Functions shouldn't be propagated within transaction
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_7'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_7'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
CREATE TABLE table_to_prop_func_6(id int, col_1 int check (function_propagation_schema.func_in_transaction_7(col_1))); CREATE TABLE table_to_prop_func_6(id int, col_1 int check (function_propagation_schema.func_in_transaction_7(col_1)));
SELECT create_distributed_table('table_to_prop_func_6', 'id'); SELECT create_distributed_table('table_to_prop_func_6', 'id');
create_distributed_table create_distributed_table
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
-- Function should be marked as distributed after adding the column -- Function should be marked as distributed after adding the column
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_7'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_7'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_in_transaction_7}",{integer}) (function,"{function_propagation_schema,func_in_transaction_7}",{integer})
@ -598,7 +598,7 @@ SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dis
COMMIT; COMMIT;
-- Function should be marked as distributed on the worker after committing changes -- Function should be marked as distributed on the worker after committing changes
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_in_transaction_7'::regproc::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_in_transaction_7'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_7}",{integer}) localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_7}",{integer})
localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_7}",{integer}) localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_7}",{integer})
@ -606,48 +606,48 @@ SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(clas
-- Adding a constraint with multiple functions check should propagate the function -- Adding a constraint with multiple functions check should propagate the function
BEGIN; BEGIN;
CREATE OR REPLACE FUNCTION func_in_transaction_8(param_1 int) CREATE OR REPLACE FUNCTION func_in_transaction_8(param_1 int)
RETURNS boolean RETURNS boolean
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return param_1 > 5; return param_1 > 5;
END; END;
$$; $$;
CREATE OR REPLACE FUNCTION func_in_transaction_9(param_1 int) CREATE OR REPLACE FUNCTION func_in_transaction_9(param_1 int)
RETURNS boolean RETURNS boolean
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return param_1 > 5; return param_1 > 5;
END; END;
$$; $$;
-- Functions shouldn't be propagated within transaction -- Functions shouldn't be propagated within transaction
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_8'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_8'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_9'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_9'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
CREATE TABLE table_to_prop_func_7(id int, col_1 int check (function_propagation_schema.func_in_transaction_8(col_1) and function_propagation_schema.func_in_transaction_9(col_1))); CREATE TABLE table_to_prop_func_7(id int, col_1 int check (function_propagation_schema.func_in_transaction_8(col_1) and function_propagation_schema.func_in_transaction_9(col_1)));
SELECT create_distributed_table('table_to_prop_func_7', 'id'); SELECT create_distributed_table('table_to_prop_func_7', 'id');
create_distributed_table create_distributed_table
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
-- Function should be marked as distributed after adding the column -- Function should be marked as distributed after adding the column
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_8'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_8'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_in_transaction_8}",{integer}) (function,"{function_propagation_schema,func_in_transaction_8}",{integer})
(1 row) (1 row)
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_9'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_9'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_in_transaction_9}",{integer}) (function,"{function_propagation_schema,func_in_transaction_9}",{integer})
@ -656,14 +656,14 @@ SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dis
COMMIT; COMMIT;
-- Functions should be marked as distributed on the worker after committing changes -- Functions should be marked as distributed on the worker after committing changes
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_in_transaction_8'::regproc::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_in_transaction_8'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_8}",{integer}) localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_8}",{integer})
localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_8}",{integer}) localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_8}",{integer})
(2 rows) (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_in_transaction_9'::regproc::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_in_transaction_9'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_9}",{integer}) localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_9}",{integer})
localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_9}",{integer}) localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_9}",{integer})
@ -671,30 +671,30 @@ SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(clas
-- Adding a column with constraint should propagate the function -- Adding a column with constraint should propagate the function
BEGIN; BEGIN;
CREATE TABLE table_to_prop_func_8(id int, col_1 int); CREATE TABLE table_to_prop_func_8(id int, col_1 int);
SELECT create_distributed_table('table_to_prop_func_8', 'id'); SELECT create_distributed_table('table_to_prop_func_8', 'id');
create_distributed_table create_distributed_table
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
CREATE OR REPLACE FUNCTION func_in_transaction_10(param_1 int) CREATE OR REPLACE FUNCTION func_in_transaction_10(param_1 int)
RETURNS boolean RETURNS boolean
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return param_1 > 5; return param_1 > 5;
END; END;
$$; $$;
-- Functions shouldn't be propagated within transaction -- Functions shouldn't be propagated within transaction
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_10'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_10'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
ALTER TABLE table_to_prop_func_8 ADD CONSTRAINT col1_check CHECK (function_propagation_schema.func_in_transaction_10(col_1)); ALTER TABLE table_to_prop_func_8 ADD CONSTRAINT col1_check CHECK (function_propagation_schema.func_in_transaction_10(col_1));
-- Function should be marked as distributed after adding the constraint -- Function should be marked as distributed after adding the constraint
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_10'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_in_transaction_10'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_in_transaction_10}",{integer}) (function,"{function_propagation_schema,func_in_transaction_10}",{integer})
@ -703,7 +703,7 @@ SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dis
COMMIT; COMMIT;
-- Function should be marked as distributed on the worker after committing changes -- Function should be marked as distributed on the worker after committing changes
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_in_transaction_10'::regproc::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_in_transaction_10'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_10}",{integer}) localhost | 57637 | t | (function,"{function_propagation_schema,func_in_transaction_10}",{integer})
localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_10}",{integer}) localhost | 57638 | t | (function,"{function_propagation_schema,func_in_transaction_10}",{integer})
@ -711,39 +711,39 @@ SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(clas
-- If constraint depends on a non-distributed table it should error out -- If constraint depends on a non-distributed table it should error out
BEGIN; BEGIN;
CREATE TABLE local_table_for_const(id int); CREATE TABLE local_table_for_const(id int);
CREATE OR REPLACE FUNCTION func_in_transaction_11(param_1 int, param_2 local_table_for_const) CREATE OR REPLACE FUNCTION func_in_transaction_11(param_1 int, param_2 local_table_for_const)
RETURNS boolean RETURNS boolean
LANGUAGE plpgsql AS LANGUAGE plpgsql AS
$$ $$
BEGIN BEGIN
return param_1 > 5; return param_1 > 5;
END; END;
$$; $$;
CREATE TABLE table_to_prop_func_9(id int, col_1 int check (func_in_transaction_11(col_1, NULL::local_table_for_const))); CREATE TABLE table_to_prop_func_9(id int, col_1 int check (func_in_transaction_11(col_1, NULL::local_table_for_const)));
-- It should error out since there is non-distributed table dependency exists -- It should error out since there is non-distributed table dependency exists
SELECT create_distributed_table('table_to_prop_func_9', 'id'); SELECT create_distributed_table('table_to_prop_func_9', 'id');
ERROR: Relation "table_to_prop_func_9" has dependency to a table "local_table_for_const" that is not in Citus' metadata ERROR: Relation "table_to_prop_func_9" has dependency to a table "local_table_for_const" that is not in Citus' metadata
HINT: Distribute dependent relation first. HINT: Distribute dependent relation first.
COMMIT; COMMIT;
-- Show that function as a part of generated always is supporte -- Show that function as a part of generated always is supporte
BEGIN; BEGIN;
CREATE OR REPLACE FUNCTION non_sense_func_for_generated_always() CREATE OR REPLACE FUNCTION non_sense_func_for_generated_always()
RETURNS int RETURNS int
LANGUAGE plpgsql IMMUTABLE AS LANGUAGE plpgsql IMMUTABLE AS
$$ $$
BEGIN BEGIN
return 1; return 1;
END; END;
$$; $$;
-- Functions shouldn't be propagated within transaction -- Functions shouldn't be propagated within transaction
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.non_sense_func_for_generated_always'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.non_sense_func_for_generated_always'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
CREATE TABLE people ( CREATE TABLE people (
id int, id int,
height_cm numeric, height_cm numeric,
height_in numeric GENERATED ALWAYS AS (height_cm / non_sense_func_for_generated_always()) STORED); height_in numeric GENERATED ALWAYS AS (height_cm / non_sense_func_for_generated_always()) STORED);
SELECT create_distributed_table('people', 'id'); SELECT create_distributed_table('people', 'id');
@ -762,24 +762,24 @@ BEGIN;
COMMIT; COMMIT;
-- Show that functions depending table via rule are also distributed -- Show that functions depending table via rule are also distributed
BEGIN; BEGIN;
CREATE OR REPLACE FUNCTION func_for_rule() CREATE OR REPLACE FUNCTION func_for_rule()
RETURNS int RETURNS int
LANGUAGE plpgsql STABLE AS LANGUAGE plpgsql STABLE AS
$$ $$
BEGIN BEGIN
return 4; return 4;
END; END;
$$; $$;
-- Functions shouldn't be propagated within transaction -- Functions shouldn't be propagated within transaction
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_for_rule'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_for_rule'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(0 rows) (0 rows)
CREATE TABLE table_1_for_rule(id int, col_1 int); CREATE TABLE table_1_for_rule(id int, col_1 int);
CREATE TABLE table_2_for_rule(id int, col_1 int); CREATE TABLE table_2_for_rule(id int, col_1 int);
CREATE RULE rule_1 AS ON UPDATE TO table_1_for_rule DO ALSO UPDATE table_2_for_rule SET col_1 = col_1 * func_for_rule(); CREATE RULE rule_1 AS ON UPDATE TO table_1_for_rule DO ALSO UPDATE table_2_for_rule SET col_1 = col_1 * func_for_rule();
SELECT create_distributed_table('table_1_for_rule','id'); SELECT create_distributed_table('table_1_for_rule','id');
create_distributed_table create_distributed_table
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -803,14 +803,14 @@ SELECT * FROM run_command_on_workers($$SELECT pg_identify_object_as_address(clas
-- Show that functions as partitioning functions are supported -- Show that functions as partitioning functions are supported
BEGIN; BEGIN;
CREATE OR REPLACE FUNCTION non_sense_func_for_partitioning(int) CREATE OR REPLACE FUNCTION non_sense_func_for_partitioning(int)
RETURNS int RETURNS int
LANGUAGE plpgsql IMMUTABLE AS LANGUAGE plpgsql IMMUTABLE AS
$$ $$
BEGIN BEGIN
return 1; return 1;
END; END;
$$; $$;
-- Functions shouldn't be propagated within transaction -- Functions shouldn't be propagated within transaction
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.non_sense_func_for_partitioning'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.non_sense_func_for_partitioning'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
@ -861,7 +861,7 @@ BEGIN;
NOTICE: localhost:xxxxx is the coordinator and already contains metadata, skipping syncing the metadata NOTICE: localhost:xxxxx is the coordinator and already contains metadata, skipping syncing the metadata
?column? ?column?
--------------------------------------------------------------------- ---------------------------------------------------------------------
1 1
(1 row) (1 row)
SELECT citus_add_local_table_to_metadata('citus_local_table_to_test_func'); SELECT citus_add_local_table_to_metadata('citus_local_table_to_test_func');
@ -984,7 +984,7 @@ BEGIN;
-- Function should be marked as distributed after distributing the table that depends on it -- Function should be marked as distributed after distributing the table that depends on it
SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_for_func_dep_1'::regproc::oid; SELECT pg_identify_object_as_address(classid, objid, objsubid) from citus.pg_dist_object where objid = 'function_propagation_schema.func_for_func_dep_1'::regproc::oid;
pg_identify_object_as_address pg_identify_object_as_address
--------------------------------------------------------------------- ---------------------------------------------------------------------
(function,"{function_propagation_schema,func_for_func_dep_1}",{}) (function,"{function_propagation_schema,func_for_func_dep_1}",{})
(1 row) (1 row)
@ -992,7 +992,7 @@ BEGIN;
COMMIT; COMMIT;
-- Function should be marked as distributed on the worker after committing changes -- Function should be marked as distributed on the worker after committing changes
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_for_func_dep_1'::regproc::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_for_func_dep_1'::regproc::oid;$$) ORDER BY 1,2;
nodename | nodeport | success | result nodename | nodeport | success | result
--------------------------------------------------------------------- ---------------------------------------------------------------------
localhost | 57637 | t | (function,"{function_propagation_schema,func_for_func_dep_1}",{}) localhost | 57637 | t | (function,"{function_propagation_schema,func_for_func_dep_1}",{})
localhost | 57638 | t | (function,"{function_propagation_schema,func_for_func_dep_1}",{}) localhost | 57638 | t | (function,"{function_propagation_schema,func_for_func_dep_1}",{})
@ -1070,6 +1070,124 @@ SELECT create_distributed_table('table_non_for_func_dist', 'a');
(1 row) (1 row)
SET citus.shard_replication_factor = 1;
-- test creating a colocated function
CREATE TABLE tbl_to_colocate (a int);
SELECT create_distributed_table('tbl_to_colocate', 'a');
create_distributed_table
---------------------------------------------------------------------
(1 row)
-- first test colocating function with a ref table
CREATE TABLE tbl_to_colocate_ref (a int);
SELECT create_reference_table('tbl_to_colocate_ref');
create_reference_table
---------------------------------------------------------------------
(1 row)
CREATE FUNCTION func_to_colocate (a int) returns int as $$select 1;$$ language sql;
-- see the empty pg_dist_object entries
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
distribution_argument_index | colocationid | force_delegation
---------------------------------------------------------------------
| |
(1 row)
-- colocate the function with ref table
SELECT create_distributed_function('func_to_colocate(int)', colocate_with:='tbl_to_colocate_ref');
create_distributed_function
---------------------------------------------------------------------
(1 row)
-- see the pg_dist_object entry
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
distribution_argument_index | colocationid | force_delegation
---------------------------------------------------------------------
| 10003 |
(1 row)
-- convert to non-delegated
SELECT create_distributed_function('func_to_colocate(int)');
create_distributed_function
---------------------------------------------------------------------
(1 row)
-- show that the pg_dist_object fields are gone
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
distribution_argument_index | colocationid | force_delegation
---------------------------------------------------------------------
| |
(1 row)
-- colocate the function with distributed table
SELECT create_distributed_function('func_to_colocate(int)','$1','tbl_to_colocate');
create_distributed_function
---------------------------------------------------------------------
(1 row)
-- see the pg_dist_object entry
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
distribution_argument_index | colocationid | force_delegation
---------------------------------------------------------------------
0 | 10005 |
(1 row)
-- try create or replace the same func
CREATE OR REPLACE FUNCTION func_to_colocate (a int) returns int as $$select 1;$$ language sql;
-- verify the pg_dist_object entry is the same
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
distribution_argument_index | colocationid | force_delegation
---------------------------------------------------------------------
0 | 10005 |
(1 row)
-- convert to non-delegated
SELECT create_distributed_function('func_to_colocate(int)');
create_distributed_function
---------------------------------------------------------------------
(1 row)
-- show that the pg_dist_object fields are gone
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
distribution_argument_index | colocationid | force_delegation
---------------------------------------------------------------------
| |
(1 row)
-- force delegate
SELECT create_distributed_function('func_to_colocate(int)','$1','tbl_to_colocate', true);
create_distributed_function
---------------------------------------------------------------------
(1 row)
-- show pg_dist_object fields
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
distribution_argument_index | colocationid | force_delegation
---------------------------------------------------------------------
0 | 10005 | t
(1 row)
-- convert to non-delegated
SELECT create_distributed_function('func_to_colocate(int)');
create_distributed_function
---------------------------------------------------------------------
(1 row)
-- show that the pg_dist_object fields are gone
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
distribution_argument_index | colocationid | force_delegation
---------------------------------------------------------------------
| |
(1 row)
RESET search_path; RESET search_path;
SET client_min_messages TO WARNING; SET client_min_messages TO WARNING;
DROP SCHEMA function_propagation_schema CASCADE; DROP SCHEMA function_propagation_schema CASCADE;

View File

@ -1182,6 +1182,7 @@ END;
$$ $$
LANGUAGE plpgsql STABLE; LANGUAGE plpgsql STABLE;
SELECT create_distributed_function('dist_func(int, int)'); SELECT create_distributed_function('dist_func(int, int)');
NOTICE: procedure insert_select_repartition.dist_func is already distributed
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -55,6 +55,8 @@ BEGIN
RETURN localGroupId; RETURN localGroupId;
END; $$ language plpgsql VOLATILE; END; $$ language plpgsql VOLATILE;
SELECT create_distributed_function('get_local_node_id_volatile()'); SELECT create_distributed_function('get_local_node_id_volatile()');
NOTICE: procedure local_shard_execution.get_local_node_id_volatile is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -60,6 +60,8 @@ BEGIN
RETURN localGroupId; RETURN localGroupId;
END; $$ language plpgsql VOLATILE; END; $$ language plpgsql VOLATILE;
SELECT create_distributed_function('get_local_node_id_volatile()'); SELECT create_distributed_function('get_local_node_id_volatile()');
NOTICE: procedure local_shard_execution_replicated.get_local_node_id_volatile is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -2284,6 +2286,8 @@ BEGIN
END; END;
$fn$; $fn$;
SELECT create_distributed_function('register_for_event(int,int,invite_resp)'); SELECT create_distributed_function('register_for_event(int,int,invite_resp)');
NOTICE: procedure local_shard_execution_replicated.register_for_event is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -683,6 +683,8 @@ CREATE FUNCTION func_custom_param(IN param intpair, OUT total INT)
LANGUAGE SQL; LANGUAGE SQL;
SET citus.enable_metadata_sync TO OFF; SET citus.enable_metadata_sync TO OFF;
SELECT create_distributed_function('func_custom_param(intpair)'); SELECT create_distributed_function('func_custom_param(intpair)');
NOTICE: procedure function_tests.func_custom_param is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -697,6 +699,8 @@ CREATE FUNCTION func_returns_table(IN count INT)
LANGUAGE SQL; LANGUAGE SQL;
SET citus.enable_metadata_sync TO OFF; SET citus.enable_metadata_sync TO OFF;
SELECT create_distributed_function('func_returns_table(INT)'); SELECT create_distributed_function('func_returns_table(INT)');
NOTICE: procedure function_tests.func_returns_table is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -169,6 +169,8 @@ BEGIN
END; END;
$function$; $function$;
SELECT create_distributed_function('stable_squared(int)'); SELECT create_distributed_function('stable_squared(int)');
NOTICE: procedure multi_function_evaluation.stable_squared is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -84,6 +84,8 @@ BEGIN
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
SELECT create_distributed_function('value_plus_one(int)'); SELECT create_distributed_function('value_plus_one(int)');
NOTICE: procedure multi_index_statements.value_plus_one is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -96,6 +98,8 @@ BEGIN
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
SELECT create_distributed_function('multi_index_statements_2.value_plus_one(int)'); SELECT create_distributed_function('multi_index_statements_2.value_plus_one(int)');
NOTICE: procedure multi_index_statements_2.value_plus_one is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -471,6 +471,8 @@ SELECT create_distributed_function('usage_access_func(usage_access_type,int[])')
ERROR: must be owner of function usage_access_func ERROR: must be owner of function usage_access_func
SET ROLE usage_access; SET ROLE usage_access;
SELECT create_distributed_function('usage_access_func(usage_access_type,int[])'); SELECT create_distributed_function('usage_access_func(usage_access_type,int[])');
NOTICE: procedure public.usage_access_func is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -166,24 +166,32 @@ call mx_call_proc_custom_types('S', 'A');
-- Mark both procedures as distributed ... -- Mark both procedures as distributed ...
select create_distributed_function('mx_call_proc(int,int)'); select create_distributed_function('mx_call_proc(int,int)');
NOTICE: procedure multi_mx_call.mx_call_proc is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_proc_bigint(bigint,bigint)'); select create_distributed_function('mx_call_proc_bigint(bigint,bigint)');
NOTICE: procedure multi_mx_call.mx_call_proc_bigint is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_proc_custom_types(mx_call_enum,mx_call_enum)'); select create_distributed_function('mx_call_proc_custom_types(mx_call_enum,mx_call_enum)');
NOTICE: procedure multi_mx_call.mx_call_proc_custom_types is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_proc_copy(int)'); select create_distributed_function('mx_call_proc_copy(int)');
NOTICE: procedure multi_mx_call.mx_call_proc_copy is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -559,8 +567,8 @@ CREATE FUNCTION mx_call_add(int, int) RETURNS int
DEBUG: switching to sequential query execution mode DEBUG: switching to sequential query execution mode
DETAIL: A command for a distributed function is run. To make sure subsequent commands see the function correctly we need to make sure to use only one connection for all future commands DETAIL: A command for a distributed function is run. To make sure subsequent commands see the function correctly we need to make sure to use only one connection for all future commands
SELECT create_distributed_function('mx_call_add(int,int)'); SELECT create_distributed_function('mx_call_add(int,int)');
DEBUG: switching to sequential query execution mode NOTICE: procedure multi_mx_call.mx_call_add is already distributed
DETAIL: A command for a distributed function is run. To make sure subsequent commands see the function correctly we need to make sure to use only one connection for all future commands DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -166,24 +166,32 @@ call mx_call_proc_custom_types('S', 'A');
-- Mark both procedures as distributed ... -- Mark both procedures as distributed ...
select create_distributed_function('mx_call_proc(int,int)'); select create_distributed_function('mx_call_proc(int,int)');
NOTICE: procedure multi_mx_call.mx_call_proc is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_proc_bigint(bigint,bigint)'); select create_distributed_function('mx_call_proc_bigint(bigint,bigint)');
NOTICE: procedure multi_mx_call.mx_call_proc_bigint is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_proc_custom_types(mx_call_enum,mx_call_enum)'); select create_distributed_function('mx_call_proc_custom_types(mx_call_enum,mx_call_enum)');
NOTICE: procedure multi_mx_call.mx_call_proc_custom_types is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_proc_copy(int)'); select create_distributed_function('mx_call_proc_copy(int)');
NOTICE: procedure multi_mx_call.mx_call_proc_copy is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -559,8 +567,8 @@ CREATE FUNCTION mx_call_add(int, int) RETURNS int
DEBUG: switching to sequential query execution mode DEBUG: switching to sequential query execution mode
DETAIL: A command for a distributed function is run. To make sure subsequent commands see the function correctly we need to make sure to use only one connection for all future commands DETAIL: A command for a distributed function is run. To make sure subsequent commands see the function correctly we need to make sure to use only one connection for all future commands
SELECT create_distributed_function('mx_call_add(int,int)'); SELECT create_distributed_function('mx_call_add(int,int)');
DEBUG: switching to sequential query execution mode NOTICE: procedure multi_mx_call.mx_call_add is already distributed
DETAIL: A command for a distributed function is run. To make sure subsequent commands see the function correctly we need to make sure to use only one connection for all future commands DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -132,30 +132,40 @@ select mx_call_func(2, 0);
-- Mark both functions as distributed ... -- Mark both functions as distributed ...
select create_distributed_function('mx_call_func(int,int)'); select create_distributed_function('mx_call_func(int,int)');
NOTICE: procedure multi_mx_function_call_delegation.mx_call_func is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_func_bigint(bigint,bigint)'); select create_distributed_function('mx_call_func_bigint(bigint,bigint)');
NOTICE: procedure multi_mx_function_call_delegation.mx_call_func_bigint is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_func_custom_types(mx_call_enum,mx_call_enum)'); select create_distributed_function('mx_call_func_custom_types(mx_call_enum,mx_call_enum)');
NOTICE: procedure multi_mx_function_call_delegation.mx_call_func_custom_types is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_func_copy(int)'); select create_distributed_function('mx_call_func_copy(int)');
NOTICE: procedure multi_mx_function_call_delegation.mx_call_func_copy is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('squares(int)'); select create_distributed_function('squares(int)');
NOTICE: procedure multi_mx_function_call_delegation.squares is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -132,30 +132,40 @@ select mx_call_func(2, 0);
-- Mark both functions as distributed ... -- Mark both functions as distributed ...
select create_distributed_function('mx_call_func(int,int)'); select create_distributed_function('mx_call_func(int,int)');
NOTICE: procedure multi_mx_function_call_delegation.mx_call_func is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_func_bigint(bigint,bigint)'); select create_distributed_function('mx_call_func_bigint(bigint,bigint)');
NOTICE: procedure multi_mx_function_call_delegation.mx_call_func_bigint is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_func_custom_types(mx_call_enum,mx_call_enum)'); select create_distributed_function('mx_call_func_custom_types(mx_call_enum,mx_call_enum)');
NOTICE: procedure multi_mx_function_call_delegation.mx_call_func_custom_types is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('mx_call_func_copy(int)'); select create_distributed_function('mx_call_func_copy(int)');
NOTICE: procedure multi_mx_function_call_delegation.mx_call_func_copy is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
(1 row) (1 row)
select create_distributed_function('squares(int)'); select create_distributed_function('squares(int)');
NOTICE: procedure multi_mx_function_call_delegation.squares is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -24,6 +24,8 @@ CREATE FUNCTION square(int) RETURNS INT
AS $$ SELECT $1 * $1 $$ AS $$ SELECT $1 * $1 $$
LANGUAGE SQL; LANGUAGE SQL;
select create_distributed_function('square(int)'); select create_distributed_function('square(int)');
NOTICE: procedure multi_mx_insert_select_repartition.square is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -71,6 +71,7 @@ BEGIN
RETURN a*a; RETURN a*a;
END; $$ LANGUAGE PLPGSQL STABLE; END; $$ LANGUAGE PLPGSQL STABLE;
SELECT create_distributed_function('square(int)'); SELECT create_distributed_function('square(int)');
NOTICE: procedure multi_row_router_insert.square is already distributed
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -1232,6 +1232,8 @@ SELECT create_distributed_function('proc_with_out_param(date,int)');
ERROR: function "proc_with_out_param(date,int)" does not exist ERROR: function "proc_with_out_param(date,int)" does not exist
-- this should work -- this should work
SELECT create_distributed_function('proc_with_out_param(date)'); SELECT create_distributed_function('proc_with_out_param(date)');
NOTICE: procedure pg14.proc_with_out_param is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -15,6 +15,8 @@ BEGIN
END; END;
$$ language plpgsql; $$ language plpgsql;
SELECT create_distributed_function('table_returner(int)'); SELECT create_distributed_function('table_returner(int)');
NOTICE: procedure row_types.table_returner is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -29,6 +31,8 @@ BEGIN
END; END;
$$ language plpgsql; $$ language plpgsql;
SELECT create_distributed_function('record_returner(int)'); SELECT create_distributed_function('record_returner(int)');
NOTICE: procedure row_types.record_returner is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -42,6 +46,8 @@ BEGIN
END; END;
$$ language plpgsql; $$ language plpgsql;
SELECT create_distributed_function('identity_returner(anyelement)'); SELECT create_distributed_function('identity_returner(anyelement)');
NOTICE: procedure row_types.identity_returner is already distributed
DETAIL: Citus distributes procedures with CREATE [PROCEDURE|FUNCTION|AGGREGATE] commands
create_distributed_function create_distributed_function
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@ -709,6 +709,52 @@ CREATE TABLE table_non_for_func_dist (
b int DEFAULT non_sense_func_for_default_val(NULL::loc_for_func_dist)); b int DEFAULT non_sense_func_for_default_val(NULL::loc_for_func_dist));
SELECT create_distributed_table('table_non_for_func_dist', 'a'); SELECT create_distributed_table('table_non_for_func_dist', 'a');
SET citus.shard_replication_factor = 1;
-- test creating a colocated function
CREATE TABLE tbl_to_colocate (a int);
SELECT create_distributed_table('tbl_to_colocate', 'a');
-- first test colocating function with a ref table
CREATE TABLE tbl_to_colocate_ref (a int);
SELECT create_reference_table('tbl_to_colocate_ref');
CREATE FUNCTION func_to_colocate (a int) returns int as $$select 1;$$ language sql;
-- see the empty pg_dist_object entries
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
-- colocate the function with ref table
SELECT create_distributed_function('func_to_colocate(int)', colocate_with:='tbl_to_colocate_ref');
-- see the pg_dist_object entry
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
-- convert to non-delegated
SELECT create_distributed_function('func_to_colocate(int)');
-- show that the pg_dist_object fields are gone
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
-- colocate the function with distributed table
SELECT create_distributed_function('func_to_colocate(int)','$1','tbl_to_colocate');
-- see the pg_dist_object entry
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
-- try create or replace the same func
CREATE OR REPLACE FUNCTION func_to_colocate (a int) returns int as $$select 1;$$ language sql;
-- verify the pg_dist_object entry is the same
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
-- convert to non-delegated
SELECT create_distributed_function('func_to_colocate(int)');
-- show that the pg_dist_object fields are gone
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
-- force delegate
SELECT create_distributed_function('func_to_colocate(int)','$1','tbl_to_colocate', true);
-- show pg_dist_object fields
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
-- convert to non-delegated
SELECT create_distributed_function('func_to_colocate(int)');
-- show that the pg_dist_object fields are gone
SELECT distribution_argument_index, colocationid, force_delegation FROM citus.pg_dist_object WHERE objid = 'func_to_colocate'::regproc;
RESET search_path; RESET search_path;
SET client_min_messages TO WARNING; SET client_min_messages TO WARNING;