From 787ed643ddc5776a7053ae01e82f01d23e9abbe9 Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Fri, 15 Jan 2021 12:45:44 +0300 Subject: [PATCH] Undistribute table when cascade_via_foreign_keys=true even if rel has no fkeys (#4516) If relation is not involved in any foreign key relationships, foreign key graph would not return any relations for given relationId as expected. But even if it's the case, we should still undistribute the table itself. --- .../distributed/commands/alter_table.c | 3 ++- .../expected/undistribute_table_cascade.out | 20 +++++++++++++++++++ .../sql/undistribute_table_cascade.sql | 13 ++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/backend/distributed/commands/alter_table.c b/src/backend/distributed/commands/alter_table.c index 9a27c8f3c..161a0980e 100644 --- a/src/backend/distributed/commands/alter_table.c +++ b/src/backend/distributed/commands/alter_table.c @@ -479,7 +479,8 @@ AlterTableSetAccessMethod(TableConversionParameters *params) TableConversionReturn * ConvertTable(TableConversionState *con) { - if (con->conversionType == UNDISTRIBUTE_TABLE && con->cascadeViaForeignKeys) + if (con->conversionType == UNDISTRIBUTE_TABLE && con->cascadeViaForeignKeys && + (TableReferencing(con->relationId) || TableReferenced(con->relationId))) { CascadeOperationForConnectedRelations(con->relationId, ExclusiveLock, CASCADE_FKEY_UNDISTRIBUTE_TABLE); diff --git a/src/test/regress/expected/undistribute_table_cascade.out b/src/test/regress/expected/undistribute_table_cascade.out index 269dddc16..6db239227 100644 --- a/src/test/regress/expected/undistribute_table_cascade.out +++ b/src/test/regress/expected/undistribute_table_cascade.out @@ -493,6 +493,26 @@ BEGIN; t (1 row) +ROLLBACK; +BEGIN; + ALTER TABLE reference_table_2 DROP CONSTRAINT fkey_7; + -- since now citus_local_table_2 has no foreign keys, show that + -- cascade_via_foreign_keys option still works fine + SELECT undistribute_table('citus_local_table_2', cascade_via_foreign_keys=>true); + undistribute_table +--------------------------------------------------------------------- + +(1 row) + + SELECT COUNT(*)=0 FROM pg_dist_partition, pg_tables + WHERE tablename=logicalrelid::regclass::text AND + schemaname='undistribute_table_cascade' AND + tablename='citus_local_table_2'; + ?column? +--------------------------------------------------------------------- + t +(1 row) + ROLLBACK; CREATE SCHEMA "bad!schemaName"; CREATE TABLE "bad!schemaName"."LocalTabLE.1!?!"(col_1 INT UNIQUE); diff --git a/src/test/regress/sql/undistribute_table_cascade.sql b/src/test/regress/sql/undistribute_table_cascade.sql index 20d43ead0..e1ac2fccf 100644 --- a/src/test/regress/sql/undistribute_table_cascade.sql +++ b/src/test/regress/sql/undistribute_table_cascade.sql @@ -337,6 +337,19 @@ BEGIN; tablename LIKE 'partitioned_table_%'; ROLLBACK; +BEGIN; + ALTER TABLE reference_table_2 DROP CONSTRAINT fkey_7; + + -- since now citus_local_table_2 has no foreign keys, show that + -- cascade_via_foreign_keys option still works fine + SELECT undistribute_table('citus_local_table_2', cascade_via_foreign_keys=>true); + + SELECT COUNT(*)=0 FROM pg_dist_partition, pg_tables + WHERE tablename=logicalrelid::regclass::text AND + schemaname='undistribute_table_cascade' AND + tablename='citus_local_table_2'; +ROLLBACK; + CREATE SCHEMA "bad!schemaName"; CREATE TABLE "bad!schemaName"."LocalTabLE.1!?!"(col_1 INT UNIQUE);