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.
pull/4512/head
Onur Tirtir 2021-01-15 12:45:44 +03:00 committed by GitHub
parent 4d204320d3
commit 787ed643dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 1 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);