From 3ace7b78b04395e01a973e49af1e7b8f29bbafae Mon Sep 17 00:00:00 2001 From: Ashutosh Bapat Date: Wed, 20 Dec 2023 14:55:24 +0530 Subject: [PATCH 11/27] Partitions with their own identity columns are not allowed ... for the reasons specified in earlier commit messages. Ashutosh Bapat --- src/backend/commands/tablecmds.c | 12 +++++++++++- src/test/regress/expected/generated.out | 2 +- src/test/regress/expected/identity.out | 20 +++++++++++++++----- src/test/regress/sql/identity.sql | 19 ++++++++++++++----- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 19badb3fba..f6db45522f 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -18793,7 +18793,10 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot attach temporary relation of another session as partition"))); - /* Check if there are any columns in attachrel that aren't in the parent */ + /* + * Check if attachrel has any identity columns or any columns that aren't + * in the parent. + */ tupleDesc = RelationGetDescr(attachrel); natts = tupleDesc->natts; for (attno = 1; attno <= natts; attno++) @@ -18805,6 +18808,13 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, if (attribute->attisdropped) continue; + if (attribute->attidentity) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("table \"%s\" being attached can not contain identity column \"%s\"", + RelationGetRelationName(attachrel), + attributeName)); + /* Try to find the column in parent (matching on column name) */ if (!SearchSysCacheExists2(ATTNAME, ObjectIdGetDatum(RelationGetRelid(rel)), diff --git a/src/test/regress/expected/generated.out b/src/test/regress/expected/generated.out index a2f38d0f50..c9b0856fa2 100644 --- a/src/test/regress/expected/generated.out +++ b/src/test/regress/expected/generated.out @@ -753,7 +753,7 @@ ERROR: column "f3" in child table must be a generated column DROP TABLE gtest_child3; CREATE TABLE gtest_child3 (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED ALWAYS AS IDENTITY); ALTER TABLE gtest_parent ATTACH PARTITION gtest_child3 FOR VALUES FROM ('2016-09-01') TO ('2016-10-01'); -- error -ERROR: column "f3" in child table must be a generated column +ERROR: table "gtest_child3" being attached can not contain identity column "f3" DROP TABLE gtest_child3; CREATE TABLE gtest_child3 (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED ALWAYS AS (f2 * 33) STORED); ALTER TABLE gtest_parent ATTACH PARTITION gtest_child3 FOR VALUES FROM ('2016-09-01') TO ('2016-10-01'); diff --git a/src/test/regress/expected/identity.out b/src/test/regress/expected/identity.out index 501fcc22c6..0b6a4b160e 100644 --- a/src/test/regress/expected/identity.out +++ b/src/test/regress/expected/identity.out @@ -701,13 +701,23 @@ SELECT tableoid::regclass, f1, f2, f3 FROM pitest3; pitest3_p1 | 07-07-2016 | from pitest3_p1 | 6 (6 rows) --- partition with identity column of its own is not allowed -CREATE TABLE itest_parent (f1 date NOT NULL, f2 text, f3 bigint) PARTITION BY RANGE (f1); -CREATE TABLE itest_child PARTITION OF itest_parent ( +-- partitions with their own identity columns are not allowed, even if the +-- partitioned table does not have an identity column. +CREATE TABLE pitest1_pfail PARTITION OF pitest1 ( f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY -) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); -- error +) FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); ERROR: identity columns are not supported on partitions -DROP TABLE itest_parent; +CREATE TABLE pitest_pfail PARTITION OF pitest3 ( + f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY +) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); +ERROR: identity columns are not supported on partitions +CREATE TABLE pitest1_pfail (f1 date NOT NULL, f2 text, f3 bigint GENERATED ALWAYS AS IDENTITY); +ALTER TABLE pitest1 ATTACH PARTITION pitest1_pfail FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); +ERROR: table "pitest1_pfail" being attached can not contain identity column "f3" +ALTER TABLE pitest3 ATTACH PARTITION pitest1_pfail FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); +ERROR: table "pitest1_pfail" being attached can not contain identity column "f3" +DROP TABLE pitest1_pfail; +DROP TABLE pitest3; -- test that sequence of half-dropped serial column is properly ignored CREATE TABLE itest14 (id serial); ALTER TABLE itest14 ALTER id DROP DEFAULT; diff --git a/src/test/regress/sql/identity.sql b/src/test/regress/sql/identity.sql index 0d7ecfb3e0..e0ce2c799b 100644 --- a/src/test/regress/sql/identity.sql +++ b/src/test/regress/sql/identity.sql @@ -413,13 +413,22 @@ INSERT into pitest3(f1, f2, f3) VALUES ('2016-07-6', 'from pitest3', 5); INSERT into pitest3_p1 (f1, f2, f3) VALUES ('2016-07-7', 'from pitest3_p1', 6); SELECT tableoid::regclass, f1, f2, f3 FROM pitest3; --- partition with identity column of its own is not allowed -CREATE TABLE itest_parent (f1 date NOT NULL, f2 text, f3 bigint) PARTITION BY RANGE (f1); -CREATE TABLE itest_child PARTITION OF itest_parent ( +-- partitions with their own identity columns are not allowed, even if the +-- partitioned table does not have an identity column. +CREATE TABLE pitest1_pfail PARTITION OF pitest1 ( f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY -) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); -- error -DROP TABLE itest_parent; +) FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); +CREATE TABLE pitest_pfail PARTITION OF pitest3 ( + f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY +) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); + +CREATE TABLE pitest1_pfail (f1 date NOT NULL, f2 text, f3 bigint GENERATED ALWAYS AS IDENTITY); +ALTER TABLE pitest1 ATTACH PARTITION pitest1_pfail FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); +ALTER TABLE pitest3 ATTACH PARTITION pitest1_pfail FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); + +DROP TABLE pitest1_pfail; +DROP TABLE pitest3; -- test that sequence of half-dropped serial column is properly ignored -- 2.25.1