From 52e467a9a02221bdac671790a3051c00830768c6 Mon Sep 17 00:00:00 2001 From: Ahmet Gedemenli Date: Wed, 7 Apr 2021 11:21:06 +0300 Subject: [PATCH] Error out if inheriting a distributed table (#4871) * Error out if inheriting a distributed table * Add test inheriting a distirbuted table --- src/backend/distributed/commands/table.c | 28 +++++++++++++++++-- .../regress/expected/multi_partitioning.out | 11 ++++++++ src/test/regress/sql/multi_partitioning.sql | 6 ++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/commands/table.c b/src/backend/distributed/commands/table.c index 41d9fc3ba..0eefaba70 100644 --- a/src/backend/distributed/commands/table.c +++ b/src/backend/distributed/commands/table.c @@ -184,10 +184,32 @@ PostprocessCreateTableStmt(CreateStmt *createStatement, const char *queryString) { PostprocessCreateTableStmtForeignKeys(createStatement); - if (createStatement->inhRelations != NIL && createStatement->partbound != NULL) + if (createStatement->inhRelations != NIL) { - /* process CREATE TABLE ... PARTITION OF command */ - PostprocessCreateTableStmtPartitionOf(createStatement, queryString); + if (createStatement->partbound != NULL) + { + /* process CREATE TABLE ... PARTITION OF command */ + PostprocessCreateTableStmtPartitionOf(createStatement, queryString); + } + else + { + /* process CREATE TABLE ... INHERITS ... */ + RangeVar *parentRelation = NULL; + foreach_ptr(parentRelation, createStatement->inhRelations) + { + bool missingOk = false; + Oid parentRelationId = RangeVarGetRelid(parentRelation, NoLock, + missingOk); + Assert(parentRelationId != InvalidOid); + + if (IsCitusTable(parentRelationId)) + { + /* here we error out if inheriting a distributed table */ + ereport(ERROR, (errmsg("non-distributed tables cannot inherit " + "distributed tables"))); + } + } + } } } diff --git a/src/test/regress/expected/multi_partitioning.out b/src/test/regress/expected/multi_partitioning.out index bcd90f753..7c1ba6d91 100644 --- a/src/test/regress/expected/multi_partitioning.out +++ b/src/test/regress/expected/multi_partitioning.out @@ -2067,6 +2067,17 @@ SELECT * FROM time_partition_range('list_partitioned_p1'); ERROR: relation "list_partitioned_p1" is not a range partition DETAIL: time_partition_range can only be used for partitions of range-partitioned tables with a single partition column DROP TABLE list_partitioned; +-- error out when inheriting a distributed table +CREATE TABLE test_inheritance(a int, b int); +SELECT create_distributed_table('test_inheritance','a'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +CREATE TABLE local_inheritance (k int) INHERITS (test_inheritance); +ERROR: non-distributed tables cannot inherit distributed tables +DROP TABLE test_inheritance; DROP SCHEMA partitioning_schema CASCADE; NOTICE: drop cascades to table partitioning_schema."schema-test" DROP TABLE IF EXISTS diff --git a/src/test/regress/sql/multi_partitioning.sql b/src/test/regress/sql/multi_partitioning.sql index 13fd4c626..4eb609e9f 100644 --- a/src/test/regress/sql/multi_partitioning.sql +++ b/src/test/regress/sql/multi_partitioning.sql @@ -1219,6 +1219,12 @@ SELECT parent_table, partition_column, partition, from_value, to_value FROM time SELECT * FROM time_partition_range('list_partitioned_p1'); DROP TABLE list_partitioned; +-- error out when inheriting a distributed table +CREATE TABLE test_inheritance(a int, b int); +SELECT create_distributed_table('test_inheritance','a'); +CREATE TABLE local_inheritance (k int) INHERITS (test_inheritance); +DROP TABLE test_inheritance; + DROP SCHEMA partitioning_schema CASCADE; DROP TABLE IF EXISTS partitioning_hash_test,