mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Make partitions automatically inherit OIDs.
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
This commit is contained in:
@ -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
|
||||
|
@ -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 (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
|
||||
|
@ -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 (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
|
||||
|
||||
|
Reference in New Issue
Block a user