aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/tablecmds.c
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2017-10-05 13:06:46 -0400
committerRobert Haas <rhaas@postgresql.org>2017-10-05 13:06:46 -0400
commit14f67a8ee282ebc0de78e773fbd597f460ab4a54 (patch)
treecd309fe1858bd1ac7f012c963c9d89db4e061843 /src/backend/commands/tablecmds.c
parentc31e9d4bafd80da52408af5f87fe874c9ca0c952 (diff)
downloadpostgresql-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.c15
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. */