aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2017-12-08 12:13:04 -0500
committerPeter Eisentraut <peter_e@gmx.net>2017-12-08 12:13:04 -0500
commit005ac298b1bdc3e9bd19e5ee2bcf7e320ebe4130 (patch)
tree5e16ea7135c6bfcf08b23690a74056b6d04dc197 /src
parentaf9f8b7ca343eefa33b693d7919d8f945aeee3e7 (diff)
downloadpostgresql-005ac298b1bdc3e9bd19e5ee2bcf7e320ebe4130.tar.gz
postgresql-005ac298b1bdc3e9bd19e5ee2bcf7e320ebe4130.zip
Prohibit identity columns on typed tables and partitions
Those cases currently crash and supporting them is more work then originally thought, so we'll just prohibit these scenarios for now. Author: Michael Paquier <michael.paquier@gmail.com> Reviewed-by: Amit Langote <Langote_Amit_f8@lab.ntt.co.jp> Reported-by: Мансур Галиев <gomer94@yandex.ru> Bug: #14866
Diffstat (limited to 'src')
-rw-r--r--src/backend/parser/parse_utilcmd.c13
-rw-r--r--src/test/regress/expected/identity.out12
-rw-r--r--src/test/regress/sql/identity.sql16
3 files changed, 41 insertions, 0 deletions
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 8461da490ac..343e6b37381 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -92,6 +92,7 @@ typedef struct
IndexStmt *pkey; /* PRIMARY KEY index, if any */
bool ispartitioned; /* true if table is partitioned */
PartitionBoundSpec *partbound; /* transformed FOR VALUES */
+ bool ofType; /* true if statement contains OF typename */
} CreateStmtContext;
/* State shared by transformCreateSchemaStmt and its subroutines */
@@ -240,6 +241,8 @@ transformCreateStmt(CreateStmt *stmt, const char *queryString)
cxt.alist = NIL;
cxt.pkey = NULL;
cxt.ispartitioned = stmt->partspec != NULL;
+ cxt.partbound = stmt->partbound;
+ cxt.ofType = (stmt->ofTypename != NULL);
/*
* Notice that we allow OIDs here only for plain tables, even though
@@ -662,6 +665,15 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
Type ctype;
Oid typeOid;
+ if (cxt->ofType)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("identity colums are not supported on typed tables")));
+ if (cxt->partbound)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("identify columns are not supported on partitions")));
+
ctype = typenameType(cxt->pstate, column->typeName, NULL);
typeOid = HeapTupleGetOid(ctype);
ReleaseSysCache(ctype);
@@ -2697,6 +2709,7 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt,
cxt.pkey = NULL;
cxt.ispartitioned = (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
cxt.partbound = NULL;
+ cxt.ofType = false;
/*
* The only subtypes that currently require parse transformation handling
diff --git a/src/test/regress/expected/identity.out b/src/test/regress/expected/identity.out
index 174b420a041..ddc69505937 100644
--- a/src/test/regress/expected/identity.out
+++ b/src/test/regress/expected/identity.out
@@ -346,3 +346,15 @@ SELECT * FROM itest8;
RESET ROLE;
DROP TABLE itest8;
DROP USER regress_user1;
+-- typed tables (currently not supported)
+CREATE TYPE itest_type AS (f1 integer, f2 text, f3 bigint);
+CREATE TABLE itest12 OF itest_type (f1 WITH OPTIONS GENERATED ALWAYS AS IDENTITY); -- error
+ERROR: identity colums are not supported on typed tables
+DROP TYPE itest_type CASCADE;
+-- table partitions (currently not supported)
+CREATE TABLE itest_parent (f1 date NOT NULL, f2 text, f3 bigint) PARTITION BY RANGE (f1);
+CREATE TABLE itest_child PARTITION OF itest_parent (
+ f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY
+) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); -- error
+ERROR: identify columns are not supported on partitions
+DROP TABLE itest_parent;
diff --git a/src/test/regress/sql/identity.sql b/src/test/regress/sql/identity.sql
index 6e76dd08c86..1b2d11cf343 100644
--- a/src/test/regress/sql/identity.sql
+++ b/src/test/regress/sql/identity.sql
@@ -211,3 +211,19 @@ SELECT * FROM itest8;
RESET ROLE;
DROP TABLE itest8;
DROP USER regress_user1;
+
+
+-- typed tables (currently not supported)
+
+CREATE TYPE itest_type AS (f1 integer, f2 text, f3 bigint);
+CREATE TABLE itest12 OF itest_type (f1 WITH OPTIONS GENERATED ALWAYS AS IDENTITY); -- error
+DROP TYPE itest_type CASCADE;
+
+
+-- table partitions (currently not supported)
+
+CREATE TABLE itest_parent (f1 date NOT NULL, f2 text, f3 bigint) PARTITION BY RANGE (f1);
+CREATE TABLE itest_child PARTITION OF itest_parent (
+ f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY
+) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); -- error
+DROP TABLE itest_parent;