Check for Citus table in worker_copy_table_to_node (#7662)

Fixes #6795 

The `worker_copy_table_to_node` is not supposed to be called for Citus
tables. When this function was initially introduced in #6098 , it had
the respective check. But the check was omitted, since
`worker_copy_table_to_node` called for Citus table finishes with error
anyway:
```
ERROR: cannot execute a distributed query from a query on a shard
DETAIL: Executing a distributed query in a function call that may be pushed to a remote node can lead to incorrect results.
```
It turns out that in some cases this error does not occur. See #6795 

I suggest restoring that check.

Co-authored-by: Karina Litskevich <litskevichkarina@gmail.com>
pull/7694/head^2
Karina 2025-03-05 17:33:52 +03:00 committed by GitHub
parent afcda3feff
commit 26ad52713c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 4 deletions

View File

@ -40,6 +40,15 @@ worker_copy_table_to_node(PG_FUNCTION_ARGS)
Oid relationId = PG_GETARG_OID(0); Oid relationId = PG_GETARG_OID(0);
uint32_t targetNodeId = PG_GETARG_INT32(1); uint32_t targetNodeId = PG_GETARG_INT32(1);
if (IsCitusTable(relationId))
{
char *qualifiedRelationName = generate_qualified_relation_name(relationId);
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("table %s is a Citus table, only copies of "
"shards or regular postgres tables are supported",
qualifiedRelationName)));
}
Oid schemaOid = get_rel_namespace(relationId); Oid schemaOid = get_rel_namespace(relationId);
char *relationSchemaName = get_namespace_name(schemaOid); char *relationSchemaName = get_namespace_name(schemaOid);
char *relationName = get_rel_name(relationId); char *relationName = get_rel_name(relationId);

View File

@ -37,11 +37,9 @@ CREATE TABLE t_62629600(a int);
SET search_path TO worker_copy_table_to_node; SET search_path TO worker_copy_table_to_node;
-- Make sure that the UDF doesn't work on Citus tables -- Make sure that the UDF doesn't work on Citus tables
SELECT worker_copy_table_to_node('t', :worker_1_node); SELECT worker_copy_table_to_node('t', :worker_1_node);
ERROR: cannot execute a distributed query from a query on a shard ERROR: table worker_copy_table_to_node.t is a Citus table, only copies of shards or regular postgres tables are supported
DETAIL: Executing a distributed query in a function call that may be pushed to a remote node can lead to incorrect results.
SELECT worker_copy_table_to_node('ref', :worker_1_node); SELECT worker_copy_table_to_node('ref', :worker_1_node);
ERROR: cannot execute a distributed query from a query on a shard ERROR: table worker_copy_table_to_node.ref is a Citus table, only copies of shards or regular postgres tables are supported
DETAIL: Executing a distributed query in a function call that may be pushed to a remote node can lead to incorrect results.
-- It should work on shards -- It should work on shards
SELECT worker_copy_table_to_node('t_62629600', :worker_1_node); SELECT worker_copy_table_to_node('t_62629600', :worker_1_node);
worker_copy_table_to_node worker_copy_table_to_node