</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
</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>
</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>
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
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 (10) WITH 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
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 (10) WITH 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