• Robert Haas's avatar
    Implement table partitioning. · f0e44751
    Robert Haas authored
    Table partitioning is like table inheritance and reuses much of the
    existing infrastructure, but there are some important differences.
    The parent is called a partitioned table and is always empty; it may
    not have indexes or non-inherited constraints, since those make no
    sense for a relation with no data of its own.  The children are called
    partitions and contain all of the actual data.  Each partition has an
    implicit partitioning constraint.  Multiple inheritance is not
    allowed, and partitioning and inheritance can't be mixed.  Partitions
    can't have extra columns and may not allow nulls unless the parent
    does.  Tuples inserted into the parent are automatically routed to the
    correct partition, so tuple-routing ON INSERT triggers are not needed.
    Tuple routing isn't yet supported for partitions which are foreign
    tables, and it doesn't handle updates that cross partition boundaries.
    
    Currently, tables can be range-partitioned or list-partitioned.  List
    partitioning is limited to a single column, but range partitioning can
    involve multiple columns.  A partitioning "column" can be an
    expression.
    
    Because table partitioning is less general than table inheritance, it
    is hoped that it will be easier to reason about properties of
    partitions, and therefore that this will serve as a better foundation
    for a variety of possible optimizations, including query planner
    optimizations.  The tuple routing based which this patch does based on
    the implicit partitioning constraints is an example of this, but it
    seems likely that many other useful optimizations are also possible.
    
    Amit Langote, reviewed and tested by Robert Haas, Ashutosh Bapat,
    Amit Kapila, Rajkumar Raghuwanshi, Corey Huinker, Jaime Casanova,
    Rushabh Lathia, Erik Rijkers, among others.  Minor revisions by me.
    f0e44751
outfuncs.c 90.9 KB