]> granicus.if.org Git - postgresql/commitdiff
Prohibit identity columns on typed tables and partitions
authorPeter Eisentraut <peter_e@gmx.net>
Fri, 8 Dec 2017 17:13:04 +0000 (12:13 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Fri, 8 Dec 2017 17:25:41 +0000 (12:25 -0500)
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

src/backend/parser/parse_utilcmd.c
src/test/regress/expected/identity.out
src/test/regress/sql/identity.sql

index ed9ed833babc0744bcf90a6860b2b29cab742f79..bb78e9637a7a4176ec662c92c264c6695483f4cb 100644 (file)
@@ -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);
@@ -2694,6 +2706,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
index 174b420a0414a15a580bda9e29ad311e8625f037..ddc69505937811059aef5c41bc096bc7459cb41e 100644 (file)
@@ -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;
index 6e76dd08c86683e16aa7e4584b2875ce37b6233f..1b2d11cf343a382bac2d7d054984488f885fb604 100644 (file)
@@ -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;