diff --git a/src/backend/distributed/metadata/node_metadata.c b/src/backend/distributed/metadata/node_metadata.c index 848990332..968211ca7 100644 --- a/src/backend/distributed/metadata/node_metadata.c +++ b/src/backend/distributed/metadata/node_metadata.c @@ -785,24 +785,30 @@ SyncObjectDependenciesCommandList(WorkerNode *workerNode) static void SyncObjectDependenciesToNode(WorkerNode *workerNode) { - if (NodeIsPrimary(workerNode)) + if (NodeIsCoordinator(workerNode)) { - EnsureNoModificationsHaveBeenDone(); - - Assert(ShouldPropagate()); - if (!NodeIsCoordinator(workerNode)) - { - List *commandList = SyncObjectDependenciesCommandList(workerNode); - - /* send commands to new workers, the current user should be a superuser */ - Assert(superuser()); - SendMetadataCommandListToWorkerInCoordinatedTransaction( - workerNode->workerName, - workerNode->workerPort, - CurrentUserName(), - commandList); - } + /* coordinator has all the objects */ + return; } + + if (!NodeIsPrimary(workerNode)) + { + /* secondary nodes gets the objects from their primaries via replication */ + return; + } + + EnsureNoModificationsHaveBeenDone(); + Assert(ShouldPropagate()); + + List *commandList = SyncObjectDependenciesCommandList(workerNode); + + /* send commands to new workers, the current user should be a superuser */ + Assert(superuser()); + SendMetadataCommandListToWorkerInCoordinatedTransaction( + workerNode->workerName, + workerNode->workerPort, + CurrentUserName(), + commandList); } diff --git a/src/backend/distributed/worker/worker_data_fetch_protocol.c b/src/backend/distributed/worker/worker_data_fetch_protocol.c index ce8a66959..a24af380a 100644 --- a/src/backend/distributed/worker/worker_data_fetch_protocol.c +++ b/src/backend/distributed/worker/worker_data_fetch_protocol.c @@ -466,18 +466,18 @@ worker_apply_sequence_command(PG_FUNCTION_ARGS) /* * If sequence with the same name exist for different type, it must have been * stayed on that node after a rollbacked create_distributed_table operation. - * We must drop it first to create the sequence with the correct type. + * We must change it's name first to create the sequence with the correct type. */ + Oid sequenceOid; CreateSeqStmt *createSequenceStatement = (CreateSeqStmt *) commandNode; char *sequenceName = createSequenceStatement->sequence->relname; char *sequenceSchema = createSequenceStatement->sequence->schemaname; - RangeVar *sequenceRange = makeRangeVar(sequenceSchema, sequenceName, -1); - Oid sequenceRelationId = RangeVarGetRelid(sequenceRange, AccessShareLock, true); - - if (sequenceRelationId != InvalidOid) + RangeVarGetAndCheckCreationNamespace(createSequenceStatement->sequence, NoLock, + &sequenceOid); + if (OidIsValid(sequenceOid)) { - Form_pg_sequence pgSequenceForm = pg_get_sequencedef(sequenceRelationId); + Form_pg_sequence pgSequenceForm = pg_get_sequencedef(sequenceOid); if (pgSequenceForm->seqtypid != sequenceTypeId) { StringInfo dropSequenceString = makeStringInfo(); diff --git a/src/test/regress/sql/multi_test_helpers_superuser.sql b/src/test/regress/sql/multi_test_helpers_superuser.sql index cc26981a8..2df7b1724 100644 --- a/src/test/regress/sql/multi_test_helpers_superuser.sql +++ b/src/test/regress/sql/multi_test_helpers_superuser.sql @@ -22,8 +22,17 @@ WITH dist_node_summary AS ( master_run_on_worker(ARRAY[hostname, 'localhost'], ARRAY[port, master_port], ARRAY[dist_node_summary.query, dist_node_summary.query], false) +), dist_placement_summary AS ( + SELECT 'SELECT jsonb_agg(pg_dist_placement ORDER BY placementid) FROM pg_dist_placement' AS query +), dist_placement_check AS ( + SELECT count(distinct result) = 1 AS matches + FROM dist_placement_summary CROSS JOIN LATERAL + master_run_on_worker(ARRAY[hostname, 'localhost'], ARRAY[port, master_port], + ARRAY[dist_placement_summary.query, dist_placement_summary.query], + false) ) -SELECT dist_node_check.matches FROM dist_node_check +SELECT dist_node_check.matches AND dist_placement_check.matches +FROM dist_node_check CROSS JOIN dist_placement_check $$;