diff --git a/src/backend/distributed/commands/dependencies.c b/src/backend/distributed/commands/dependencies.c index 1bff7c295..41226d041 100644 --- a/src/backend/distributed/commands/dependencies.c +++ b/src/backend/distributed/commands/dependencies.c @@ -177,6 +177,11 @@ GetDependencyCreateDDLCommands(const ObjectAddress *dependency) break; } + case OCLASS_PROC: + { + return CreateFunctionDDLCommandsIdempotent(dependency); + } + default: { break; diff --git a/src/backend/distributed/commands/function.c b/src/backend/distributed/commands/function.c index a816f8040..e688176bf 100644 --- a/src/backend/distributed/commands/function.c +++ b/src/backend/distributed/commands/function.c @@ -20,6 +20,7 @@ #include "access/xact.h" #include "catalog/namespace.h" #include "catalog/pg_proc.h" +#include "distributed/commands.h" #include "distributed/metadata_sync.h" #include "distributed/metadata/distobject.h" #include "distributed/multi_executor.h" @@ -29,7 +30,7 @@ #include "utils/fmgrprotos.h" /* forward declaration for helper functions*/ -static const char * GetFunctionDDLCommand(Oid funcOid); +static char * GetFunctionDDLCommand(const RegProcedure funcOid); static void EnsureSequentialModeForFunctionDDL(void); PG_FUNCTION_INFO_V1(create_distributed_function); @@ -74,16 +75,32 @@ create_distributed_function(PG_FUNCTION_ARGS) } +/* + * CreateFunctionDDLCommandsIdempotent returns a list of DDL statements (const char *) to be + * executed on a node to recreate the function addressed by the functionAddress. + */ +List * +CreateFunctionDDLCommandsIdempotent(const ObjectAddress *functionAddress) +{ + char *ddlCommand = NULL; + + Assert(functionAddress->classId == ProcedureRelationId); + + ddlCommand = GetFunctionDDLCommand(functionAddress->objectId); + return list_make1(ddlCommand); +} + + /* * GetFunctionDDLCommand returns the complete "CREATE OR REPLACE FUNCTION ..." statement for * the specified function. */ -static const char * -GetFunctionDDLCommand(RegProcedure funcOid) +static char * +GetFunctionDDLCommand(const RegProcedure funcOid) { OverrideSearchPath *overridePath = NULL; Datum sqlTextDatum = 0; - const char *sql = NULL; + char *sql = NULL; /* * Set search_path to NIL so that all objects outside of pg_catalog will be diff --git a/src/include/distributed/commands.h b/src/include/distributed/commands.h index 34cb98e45..ca3c3b1d3 100644 --- a/src/include/distributed/commands.h +++ b/src/include/distributed/commands.h @@ -159,6 +159,9 @@ extern List * CreateTypeDDLCommandsIdempotent(const ObjectAddress *typeAddress); extern char * GenerateBackupNameForTypeCollision(const ObjectAddress *address); extern RenameStmt * CreateRenameTypeStmt(const ObjectAddress *address, char *newName); +/* function.c - forward declarations */ +extern List * CreateFunctionDDLCommandsIdempotent(const ObjectAddress *functionAddress); + /* vacuum.c - froward declarations */ extern void ProcessVacuumStmt(VacuumStmt *vacuumStmt, const char *vacuumCommand); diff --git a/src/test/regress/expected/isolation_dump_global_wait_edges.out b/src/test/regress/expected/isolation_dump_global_wait_edges.out index 84333599b..85a92131d 100644 --- a/src/test/regress/expected/isolation_dump_global_wait_edges.out +++ b/src/test/regress/expected/isolation_dump_global_wait_edges.out @@ -29,11 +29,11 @@ step detector-dump-wait-edges: waiting_transaction_numblocking_transaction_numblocking_transaction_waiting -266 265 f +281 280 f transactionnumberwaitingtransactionnumbers -265 -266 265 +280 +281 280 step s1-abort: ABORT; @@ -77,14 +77,14 @@ step detector-dump-wait-edges: waiting_transaction_numblocking_transaction_numblocking_transaction_waiting -270 269 f -271 269 f -271 270 t +285 284 f +286 284 f +286 285 t transactionnumberwaitingtransactionnumbers -269 -270 269 -271 269,270 +284 +285 284 +286 284,285 step s1-abort: ABORT; diff --git a/src/test/regress/expected/isolation_dump_global_wait_edges_0.out b/src/test/regress/expected/isolation_dump_global_wait_edges_0.out index f7a44bcb2..6976f987d 100644 --- a/src/test/regress/expected/isolation_dump_global_wait_edges_0.out +++ b/src/test/regress/expected/isolation_dump_global_wait_edges_0.out @@ -29,11 +29,11 @@ step detector-dump-wait-edges: waiting_transaction_numblocking_transaction_numblocking_transaction_waiting -267 266 f +282 281 f transactionnumberwaitingtransactionnumbers -266 -267 266 +281 +282 281 step s1-abort: ABORT; @@ -77,14 +77,14 @@ step detector-dump-wait-edges: waiting_transaction_numblocking_transaction_numblocking_transaction_waiting -271 270 f -272 270 f -272 271 t +286 285 f +287 285 f +287 286 t transactionnumberwaitingtransactionnumbers -270 -271 270 -272 270,271 +285 +286 285 +287 285,286 step s1-abort: ABORT; diff --git a/src/test/regress/expected/isolation_ensure_dependency_activate_node.out b/src/test/regress/expected/isolation_ensure_dependency_activate_node.out index 289ed798f..a7bc9b1d1 100644 --- a/src/test/regress/expected/isolation_ensure_dependency_activate_node.out +++ b/src/test/regress/expected/isolation_ensure_dependency_activate_node.out @@ -18,6 +18,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -37,6 +41,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -79,6 +90,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address count @@ -93,6 +108,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -118,6 +140,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -137,6 +163,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -185,6 +218,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address count @@ -199,6 +236,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -224,6 +268,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -243,6 +291,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -291,6 +346,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address count @@ -305,6 +364,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -330,6 +396,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -349,6 +419,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -392,6 +469,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address (schema,{myschema},{}) @@ -407,6 +488,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -432,6 +520,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -451,6 +543,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -500,6 +599,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address (schema,{myschema},{}) @@ -515,6 +618,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -540,6 +650,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -559,6 +673,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -608,6 +729,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address (schema,{myschema},{}) @@ -623,6 +748,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -648,6 +780,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -667,6 +803,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -735,6 +878,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address (schema,{myschema},{}) @@ -750,6 +897,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -775,6 +929,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -794,6 +952,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -881,6 +1046,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address (schema,{myschema},{}) @@ -896,6 +1065,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -921,6 +1097,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -940,6 +1120,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -1001,6 +1188,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address (schema,{myschema},{}) @@ -1016,6 +1207,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -1041,6 +1239,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -1060,6 +1262,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -1129,6 +1338,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address (schema,{myschema},{}) @@ -1145,6 +1358,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -1170,6 +1390,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -1189,6 +1413,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -1225,6 +1456,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address (type,{public.tt1},{}) @@ -1242,6 +1477,13 @@ run_command_on_workers (localhost,57637,t,1) (localhost,57638,t,1) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) master_remove_node @@ -1265,6 +1507,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -1284,6 +1530,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -1319,6 +1572,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address (type,{public.tt1},{}) @@ -1336,6 +1593,13 @@ run_command_on_workers (localhost,57637,t,1) (localhost,57638,t,1) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) master_remove_node @@ -1359,6 +1623,10 @@ step s1-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); ?column? @@ -1378,6 +1646,13 @@ count 0 run_command_on_workers +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + (localhost,57637,t,0) (localhost,57638,t,0) master_remove_node @@ -1430,6 +1705,10 @@ step s2-print-distributed-objects: SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + pg_identify_object_as_address (schema,{myschema},{}) @@ -1448,6 +1727,383 @@ run_command_on_workers (localhost,57637,t,1) (localhost,57638,t,1) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +master_remove_node + + + + +starting permutation: s1-print-distributed-objects s1-begin s1-add-worker s2-public-schema s2-distribute-function s1-commit s2-print-distributed-objects +?column? + +1 +step s1-print-distributed-objects: + SELECT 1 FROM master_add_node('localhost', 57638); + + -- print an overview of all distributed objects + SELECT pg_identify_object_as_address(classid, objid, objsubid) FROM citus.pg_dist_object ORDER BY 1; + + -- print if the schema has been created + SELECT count(*) FROM pg_namespace where nspname = 'myschema'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_namespace where nspname = 'myschema';$$); + + -- print if the type has been created + SELECT count(*) FROM pg_type where typname = 'tt1'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + + SELECT master_remove_node('localhost', 57638); + +?column? + +1 +pg_identify_object_as_address + +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +master_remove_node + + +step s1-begin: + BEGIN; + +step s1-add-worker: + SELECT 1 FROM master_add_node('localhost', 57638); + +?column? + +1 +step s2-public-schema: + SET search_path TO public; + +step s2-distribute-function: + CREATE OR REPLACE FUNCTION add (INT,INT) RETURNS INT AS $$ SELECT $1 + $2 $$ LANGUAGE SQL; + SELECT create_distributed_function('add(INT,INT)'); + +step s1-commit: + COMMIT; + +step s2-distribute-function: <... completed> +create_distributed_function + + +step s2-print-distributed-objects: + -- print an overview of all distributed objects + SELECT pg_identify_object_as_address(classid, objid, objsubid) FROM citus.pg_dist_object ORDER BY 1; + + -- print if the schema has been created + SELECT count(*) FROM pg_namespace where nspname = 'myschema'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_namespace where nspname = 'myschema';$$); + + -- print if the type has been created + SELECT count(*) FROM pg_type where typname = 'tt1'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + +pg_identify_object_as_address + +(function,"{public,add}","{integer,integer}") +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +1 +run_command_on_workers + +(localhost,57637,t,1) +(localhost,57638,t,1) +master_remove_node + + + + +starting permutation: s1-print-distributed-objects s1-begin s2-public-schema s2-distribute-function s1-add-worker s1-commit s2-print-distributed-objects +?column? + +1 +step s1-print-distributed-objects: + SELECT 1 FROM master_add_node('localhost', 57638); + + -- print an overview of all distributed objects + SELECT pg_identify_object_as_address(classid, objid, objsubid) FROM citus.pg_dist_object ORDER BY 1; + + -- print if the schema has been created + SELECT count(*) FROM pg_namespace where nspname = 'myschema'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_namespace where nspname = 'myschema';$$); + + -- print if the type has been created + SELECT count(*) FROM pg_type where typname = 'tt1'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + + SELECT master_remove_node('localhost', 57638); + +?column? + +1 +pg_identify_object_as_address + +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +master_remove_node + + +step s1-begin: + BEGIN; + +step s2-public-schema: + SET search_path TO public; + +step s2-distribute-function: + CREATE OR REPLACE FUNCTION add (INT,INT) RETURNS INT AS $$ SELECT $1 + $2 $$ LANGUAGE SQL; + SELECT create_distributed_function('add(INT,INT)'); + +create_distributed_function + + +step s1-add-worker: + SELECT 1 FROM master_add_node('localhost', 57638); + +?column? + +1 +step s1-commit: + COMMIT; + +step s2-print-distributed-objects: + -- print an overview of all distributed objects + SELECT pg_identify_object_as_address(classid, objid, objsubid) FROM citus.pg_dist_object ORDER BY 1; + + -- print if the schema has been created + SELECT count(*) FROM pg_namespace where nspname = 'myschema'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_namespace where nspname = 'myschema';$$); + + -- print if the type has been created + SELECT count(*) FROM pg_type where typname = 'tt1'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + +pg_identify_object_as_address + +(function,"{public,add}","{integer,integer}") +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +1 +run_command_on_workers + +(localhost,57637,t,1) +(localhost,57638,t,0) +master_remove_node + + + + +starting permutation: s1-print-distributed-objects s1-begin s2-begin s2-create-schema s2-distribute-function s1-add-worker s2-commit s1-commit s2-print-distributed-objects +?column? + +1 +step s1-print-distributed-objects: + SELECT 1 FROM master_add_node('localhost', 57638); + + -- print an overview of all distributed objects + SELECT pg_identify_object_as_address(classid, objid, objsubid) FROM citus.pg_dist_object ORDER BY 1; + + -- print if the schema has been created + SELECT count(*) FROM pg_namespace where nspname = 'myschema'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_namespace where nspname = 'myschema';$$); + + -- print if the type has been created + SELECT count(*) FROM pg_type where typname = 'tt1'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + + SELECT master_remove_node('localhost', 57638); + +?column? + +1 +pg_identify_object_as_address + +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +master_remove_node + + +step s1-begin: + BEGIN; + +step s2-begin: + BEGIN; + +step s2-create-schema: + CREATE SCHEMA myschema; + SET search_path TO myschema; + +step s2-distribute-function: + CREATE OR REPLACE FUNCTION add (INT,INT) RETURNS INT AS $$ SELECT $1 + $2 $$ LANGUAGE SQL; + SELECT create_distributed_function('add(INT,INT)'); + +create_distributed_function + + +step s1-add-worker: + SELECT 1 FROM master_add_node('localhost', 57638); + +step s2-commit: + COMMIT; + +step s1-add-worker: <... completed> +?column? + +1 +step s1-commit: + COMMIT; + +step s2-print-distributed-objects: + -- print an overview of all distributed objects + SELECT pg_identify_object_as_address(classid, objid, objsubid) FROM citus.pg_dist_object ORDER BY 1; + + -- print if the schema has been created + SELECT count(*) FROM pg_namespace where nspname = 'myschema'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_namespace where nspname = 'myschema';$$); + + -- print if the type has been created + SELECT count(*) FROM pg_type where typname = 'tt1'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + +pg_identify_object_as_address + +(function,"{myschema,add}","{integer,integer}") +(schema,{myschema},{}) +count + +1 +run_command_on_workers + +(localhost,57637,t,1) +(localhost,57638,t,1) +count + +0 +run_command_on_workers + +(localhost,57637,t,0) +(localhost,57638,t,0) +count + +1 +run_command_on_workers + +(localhost,57637,t,1) +(localhost,57638,t,0) master_remove_node diff --git a/src/test/regress/specs/isolation_ensure_dependency_activate_node.spec b/src/test/regress/specs/isolation_ensure_dependency_activate_node.spec index acdaf444c..f09df23e7 100644 --- a/src/test/regress/specs/isolation_ensure_dependency_activate_node.spec +++ b/src/test/regress/specs/isolation_ensure_dependency_activate_node.spec @@ -20,6 +20,21 @@ teardown DROP TABLE IF EXISTS t2 CASCADE; DROP TABLE IF EXISTS t3 CASCADE; DROP TYPE IF EXISTS tt1 CASCADE; + DROP FUNCTION IF EXISTS add(INT,INT) CASCADE; + + -- Remove the pg_dist_object record manually as we do not yet hook into DROP FUNC + -- queries. If the function does not exist, the casting to regprocedure fails. + DO + $do$ + BEGIN + DELETE FROM citus.pg_dist_object WHERE objid = 'add(int,int)'::regprocedure; + EXCEPTION + WHEN undefined_function THEN RETURN; + END; + $do$; + + -- similarly drop the function in the workers manually + SELECT run_command_on_workers($$DROP FUNCTION IF EXISTS add(INT,INT) CASCADE;$$); SELECT master_remove_node(nodename, nodeport) FROM pg_dist_node; } @@ -58,6 +73,10 @@ step "s1-print-distributed-objects" SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); + SELECT master_remove_node('localhost', 57638); } @@ -95,6 +114,12 @@ step "s2-create-table-with-type" SELECT create_distributed_table('t1', 'a'); } +step "s2-distribute-function" +{ + CREATE OR REPLACE FUNCTION add (INT,INT) RETURNS INT AS $$ SELECT $1 + $2 $$ LANGUAGE SQL; + SELECT create_distributed_function('add(INT,INT)'); +} + step "s2-begin" { BEGIN; @@ -119,6 +144,10 @@ step "s2-print-distributed-objects" -- print if the type has been created SELECT count(*) FROM pg_type where typname = 'tt1'; SELECT run_command_on_workers($$SELECT count(*) FROM pg_type where typname = 'tt1';$$); + + -- print if the function has been created + SELECT count(*) FROM pg_proc WHERE proname='add'; + SELECT run_command_on_workers($$SELECT count(*) FROM pg_proc WHERE proname='add';$$); } session "s3" @@ -205,3 +234,8 @@ permutation "s1-print-distributed-objects" "s1-begin" "s2-begin" "s4-begin" "s1- permutation "s1-print-distributed-objects" "s1-begin" "s1-add-worker" "s2-public-schema" "s2-create-type" "s1-commit" "s2-print-distributed-objects" permutation "s1-print-distributed-objects" "s1-begin" "s2-public-schema" "s2-create-type" "s1-add-worker" "s1-commit" "s2-print-distributed-objects" permutation "s1-print-distributed-objects" "s1-begin" "s2-begin" "s2-create-schema" "s2-create-type" "s2-create-table-with-type" "s1-add-worker" "s2-commit" "s1-commit" "s2-print-distributed-objects" + +# distributed function tests +permutation "s1-print-distributed-objects" "s1-begin" "s1-add-worker" "s2-public-schema" "s2-distribute-function" "s1-commit" "s2-print-distributed-objects" +permutation "s1-print-distributed-objects" "s1-begin" "s2-public-schema" "s2-distribute-function" "s1-add-worker" "s1-commit" "s2-print-distributed-objects" +permutation "s1-print-distributed-objects" "s1-begin" "s2-begin" "s2-create-schema" "s2-distribute-function" "s1-add-worker" "s2-commit" "s1-commit" "s2-print-distributed-objects"