diff options
author | Robert Haas <rhaas@postgresql.org> | 2017-10-05 13:06:46 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2017-10-05 13:06:46 -0400 |
commit | 14f67a8ee282ebc0de78e773fbd597f460ab4a54 (patch) | |
tree | cd309fe1858bd1ac7f012c963c9d89db4e061843 /src/backend/commands/tablecmds.c | |
parent | c31e9d4bafd80da52408af5f87fe874c9ca0c952 (diff) | |
download | postgresql-14f67a8ee282ebc0de78e773fbd597f460ab4a54.tar.gz postgresql-14f67a8ee282ebc0de78e773fbd597f460ab4a54.zip |
On attach, consider skipping validation of subpartitions individually.
If the table attached as a partition is itself partitioned, individual
partitions might have constraints strong enough to skip scanning the
table even if the table actually attached does not. This is pretty
cheap to check, and possibly a big win if it works out.
Amit Langote, with test case changes by me.
Discussion: http://postgr.es/m/1f08b844-0078-aa8d-452e-7af3bf77d05f@lab.ntt.co.jp
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r-- | src/backend/commands/tablecmds.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index d90c739952a..2d4dcd75564 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -13683,6 +13683,21 @@ ValidatePartitionConstraints(List **wqueue, Relation scanrel, /* There can never be a whole-row reference here */ if (found_whole_row) elog(ERROR, "unexpected whole-row reference found in partition key"); + + /* Can we skip scanning this part_rel? */ + if (PartConstraintImpliedByRelConstraint(part_rel, my_partconstr)) + { + if (!validate_default) + ereport(INFO, + (errmsg("partition constraint for table \"%s\" is implied by existing constraints", + RelationGetRelationName(part_rel)))); + else + ereport(INFO, + (errmsg("updated partition constraint for default partition \"%s\" is implied by existing constraints", + RelationGetRelationName(part_rel)))); + heap_close(part_rel, NoLock); + continue; + } } /* Grab a work queue entry. */ |