]> granicus.if.org Git - postgresql/commitdiff
Make partitions automatically inherit OIDs.
authorRobert Haas <rhaas@postgresql.org>
Sun, 19 Feb 2017 15:59:27 +0000 (21:29 +0530)
committerRobert Haas <rhaas@postgresql.org>
Sun, 19 Feb 2017 15:59:27 +0000 (21:29 +0530)
Previously, if the parent was specified as WITH OIDS, each child
also had to be explicitly specified as WITH OIDS.

Amit Langote, per a report from Simon Riggs.  Some additional
work on the documentation changes by me.

Discussion: http://postgr.es/m/CANP8+jJBpWocfKrbJcaf3iBt9E3U=WPE_NC8YE6rye+YJ1sYnQ@mail.gmail.com

doc/src/sgml/ddl.sgml
doc/src/sgml/ref/create_table.sgml
src/backend/commands/tablecmds.c
src/test/regress/expected/create_table.out
src/test/regress/sql/create_table.sql

index f909242e4c4968b8b720a31c9e04aac08db0a0e8..5779eac43d94801ddefb05d8edc0c4ac769641fc 100644 (file)
@@ -2861,14 +2861,6 @@ VALUES ('Albany', NULL, NULL, 'NY');
       </para>
      </listitem>
 
-     <listitem>
-      <para>
-       If the partitioned table specified <literal>WITH OIDS</literal> then
-       each partition must also specify <literal>WITH OIDS</literal>. Oids
-       are not automatically inherited by partitions.
-      </para>
-     </listitem>
-
      <listitem>
       <para>
        One cannot drop a <literal>NOT NULL</literal> constraint on a
index 41c08bba7437e68cc608222c810c8fa69a6c091c..bb081ff86f5f37d5ab3fb831456ffba2b46b2096 100644 (file)
@@ -300,14 +300,18 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
      </note>
 
      <para>
-      A partition cannot have columns other than those inherited from the
-      parent.  If the parent is specified <literal>WITH OIDS</literal> then
-      the partitions must also explicitly specify <literal>WITH OIDS</literal>.
-      Defaults and constraints can optionally be specified for each of the
-      inherited columns.  One can also specify table constraints in addition
-      to those inherited from the parent.  If a check constraint with the name
-      matching one of the parent's constraint is specified, it is merged with
-      the latter, provided the specified condition is same.
+      A partition must have the same column names and types as the partitioned
+      table to which it belongs.  If the parent is specified <literal>WITH
+      OIDS</literal> then all partitions must have OIDs; the parent's OID
+      column will be inherited by all partitions just like any other column.
+      Modifications to the column names or types of a partitioned table, or
+      the addition or removal of an OID column, will automatically propagate
+      to all partitions.  <literal>CHECK</> constraints will be inherited
+      automatically by every partition, but an individual partition may specify
+      additional <literal>CHECK</> constraints; additional constraints with
+      the same name and condition as in the parent will be merged with the
+      parent constraint.  Defaults may be specified separately for each
+      partition.
      </para>
 
      <para>
@@ -318,15 +322,11 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
      </para>
 
      <para>
-      A partition must have the same column names and types as the table of
-      which it is a partition.  Therefore, modifications to the column names
-      or types of the partitioned table will automatically propagate to all
-      children, as will operations such as TRUNCATE which normally affect a
-      table and all of its inheritance children.  It is also possible to
-      TRUNCATE a partition individually, just as for an inheritance child.
-      Note that dropping a partition with <literal>DROP TABLE</literal>
-      requires taking an <literal>ACCESS EXCLUSIVE</literal> lock on the
-      parent table.
+      Operations such as TRUNCATE which normally affect a table and all of its
+      inheritance children will cascade to all partitions, but may also be
+      performed on an individual partition.  Note that dropping a partition
+      with <literal>DROP TABLE</literal> requires taking an <literal>ACCESS
+      EXCLUSIVE</literal> lock on the parent table.
      </para>
     </listitem>
    </varlistentry>
index f33aa70da69926ddc9dd8de82098a0702eb876a8..3cea220421985f301f0c0f7c76e5620c4196bd4d 100644 (file)
@@ -634,19 +634,14 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
                                                                          relkind == RELKIND_PARTITIONED_TABLE));
        descriptor->tdhasoid = (localHasOids || parentOidCount > 0);
 
-       if (stmt->partbound)
-       {
-               /* If the parent has OIDs, partitions must have them too. */
-               if (parentOidCount > 0 && !localHasOids)
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                        errmsg("cannot create table without OIDs as partition of table with OIDs")));
-               /* If the parent doesn't, partitions must not have them. */
-               if (parentOidCount == 0 && localHasOids)
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                        errmsg("cannot create table with OIDs as partition of table without OIDs")));
-       }
+       /*
+        * If a partitioned table doesn't have the system OID column, then none
+        * of its partitions should have it.
+        */
+       if (stmt->partbound && parentOidCount == 0 && localHasOids)
+               ereport(ERROR,
+                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                errmsg("cannot create table with OIDs as partition of table without OIDs")));
 
        /*
         * Find columns with default values and prepare for insertion of the
index fc92cd92dd5221c6033d91947bc3dcf1339390b2..20eb3d35f9de0addc7ff576b9b778829229197cc 100644 (file)
@@ -524,16 +524,24 @@ DROP TABLE temp_parted;
 CREATE TABLE no_oids_parted (
        a int
 ) PARTITION BY RANGE (a) WITHOUT OIDS;
-CREATE TABLE fail_part PARTITION OF no_oids_parted FOR VALUES FROM (1) TO (10 )WITH OIDS;
+CREATE TABLE fail_part PARTITION OF no_oids_parted FOR VALUES FROM (1) TO (10WITH OIDS;
 ERROR:  cannot create table with OIDs as partition of table without OIDs
 DROP TABLE no_oids_parted;
--- likewise, the reverse if also true
+-- If the partitioned table has oids, then the partition must have them.
+-- If the WITHOUT OIDS option is specified for partition, it is overridden.
 CREATE TABLE oids_parted (
        a int
 ) PARTITION BY RANGE (a) WITH OIDS;
-CREATE TABLE fail_part PARTITION OF oids_parted FOR VALUES FROM (1) TO (10 ) WITHOUT OIDS;
-ERROR:  cannot create table without OIDs as partition of table with OIDs
-DROP TABLE oids_parted;
+CREATE TABLE part_forced_oids PARTITION OF oids_parted FOR VALUES FROM (1) TO (10) WITHOUT OIDS;
+\d+ part_forced_oids
+                             Table "public.part_forced_oids"
+ Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description 
+--------+---------+-----------+----------+---------+---------+--------------+-------------
+ a      | integer |           | not null |         | plain   |              | 
+Partition of: oids_parted FOR VALUES FROM (1) TO (10)
+Has OIDs: yes
+
+DROP TABLE oids_parted, part_forced_oids;
 -- check for partition bound overlap and other invalid specifications
 CREATE TABLE list_parted2 (
        a varchar
index 5f25c436ee16fc7a215dd4f72564f151af952ec4..f41dd714751ff05099b134d8f8cec9342dcf6e90 100644 (file)
@@ -493,15 +493,17 @@ DROP TABLE temp_parted;
 CREATE TABLE no_oids_parted (
        a int
 ) PARTITION BY RANGE (a) WITHOUT OIDS;
-CREATE TABLE fail_part PARTITION OF no_oids_parted FOR VALUES FROM (1) TO (10 )WITH OIDS;
+CREATE TABLE fail_part PARTITION OF no_oids_parted FOR VALUES FROM (1) TO (10WITH OIDS;
 DROP TABLE no_oids_parted;
 
--- likewise, the reverse if also true
+-- If the partitioned table has oids, then the partition must have them.
+-- If the WITHOUT OIDS option is specified for partition, it is overridden.
 CREATE TABLE oids_parted (
        a int
 ) PARTITION BY RANGE (a) WITH OIDS;
-CREATE TABLE fail_part PARTITION OF oids_parted FOR VALUES FROM (1) TO (10 ) WITHOUT OIDS;
-DROP TABLE oids_parted;
+CREATE TABLE part_forced_oids PARTITION OF oids_parted FOR VALUES FROM (1) TO (10) WITHOUT OIDS;
+\d+ part_forced_oids
+DROP TABLE oids_parted, part_forced_oids;
 
 -- check for partition bound overlap and other invalid specifications