aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_utilcmd.c
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/backend/parser/parse_utilcmd.c
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/backend/parser/parse_utilcmd.c')
-rw-r--r--src/backend/parser/parse_utilcmd.c13
1 files changed, 13 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