]> granicus.if.org Git - postgresql/commitdiff
Move code for managing PartitionDescs into a new file, partdesc.c
authorRobert Haas <rhaas@postgresql.org>
Thu, 21 Feb 2019 16:38:54 +0000 (11:38 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 21 Feb 2019 16:45:02 +0000 (11:45 -0500)
This is similar in spirit to the existing partbounds.c file in the
same directory, except that there's a lot less code in the new file
created by this commit.  Pending work in this area proposes to add a
bunch more code related to PartitionDescs, though, and this will give
us a good place to put it.

Discussion: http://postgr.es/m/CA+TgmoZUwPf_uanjF==gTGBMJrn8uCq52XYvAEorNkLrUdoawg@mail.gmail.com

17 files changed:
src/backend/catalog/heap.c
src/backend/catalog/partition.c
src/backend/catalog/pg_constraint.c
src/backend/commands/indexcmds.c
src/backend/commands/tablecmds.c
src/backend/commands/trigger.c
src/backend/executor/execPartition.c
src/backend/optimizer/util/inherit.c
src/backend/optimizer/util/plancat.c
src/backend/partitioning/Makefile
src/backend/partitioning/partbounds.c
src/backend/partitioning/partdesc.c [new file with mode: 0644]
src/backend/utils/cache/partcache.c
src/backend/utils/cache/relcache.c
src/include/catalog/partition.h
src/include/partitioning/partdesc.h [new file with mode: 0644]
src/include/utils/partcache.h

index d0215a5eed0b787c0d8f12e5f0da1296b8715ff2..7dba4e50ddb2972f8b8a0cfbc310b21bb93e4c9b 100644 (file)
@@ -69,6 +69,7 @@
 #include "parser/parse_collate.h"
 #include "parser/parse_expr.h"
 #include "parser/parse_relation.h"
+#include "partitioning/partdesc.h"
 #include "storage/lmgr.h"
 #include "storage/predicate.h"
 #include "storage/smgr.h"
index 0d3bc3a2c796aa5985eb604a0290cbf2ea87929a..3ccdaff8c458c0cdbcf15618208b8471e198923e 100644 (file)
@@ -253,22 +253,6 @@ has_partition_attrs(Relation rel, Bitmapset *attnums, bool *used_in_expr)
        return false;
 }
 
-/*
- * get_default_oid_from_partdesc
- *
- * Given a partition descriptor, return the OID of the default partition, if
- * one exists; else, return InvalidOid.
- */
-Oid
-get_default_oid_from_partdesc(PartitionDesc partdesc)
-{
-       if (partdesc && partdesc->boundinfo &&
-               partition_bound_has_default(partdesc->boundinfo))
-               return partdesc->oids[partdesc->boundinfo->default_index];
-
-       return InvalidOid;
-}
-
 /*
  * get_default_partition_oid
  *
index ad836e0d98e501102ecf78747e606b86eb8c4d2e..b6145593a38a4c4e4e61652a0cb20fc46b76f6e5 100644 (file)
@@ -24,7 +24,6 @@
 #include "catalog/dependency.h"
 #include "catalog/indexing.h"
 #include "catalog/objectaccess.h"
-#include "catalog/partition.h"
 #include "catalog/pg_constraint.h"
 #include "catalog/pg_operator.h"
 #include "catalog/pg_type.h"
index 7352b9e341d3138626d358b262d2f6a5ad39706f..5dcedc337aa761664359cd5d4eb8e5ff2e0ba8aa 100644 (file)
@@ -24,7 +24,6 @@
 #include "catalog/catalog.h"
 #include "catalog/index.h"
 #include "catalog/indexing.h"
-#include "catalog/partition.h"
 #include "catalog/pg_am.h"
 #include "catalog/pg_constraint.h"
 #include "catalog/pg_inherits.h"
@@ -46,6 +45,7 @@
 #include "parser/parse_coerce.h"
 #include "parser/parse_func.h"
 #include "parser/parse_oper.h"
+#include "partitioning/partdesc.h"
 #include "rewrite/rewriteManip.h"
 #include "storage/lmgr.h"
 #include "storage/proc.h"
index 715c6a221cfc94b1eb2a1f972d6968b0d90e2590..35bdb0e0c6fc30a61c4a6aaaab1738472efda803 100644 (file)
@@ -74,6 +74,7 @@
 #include "parser/parse_utilcmd.h"
 #include "parser/parser.h"
 #include "partitioning/partbounds.h"
+#include "partitioning/partdesc.h"
 #include "pgstat.h"
 #include "rewrite/rewriteDefine.h"
 #include "rewrite/rewriteHandler.h"
index 409bee24f89f20864523c068c22082d2a6efb1b1..7e5bf0d27f800a6aeb13306652eda96549c934db 100644 (file)
@@ -42,6 +42,7 @@
 #include "parser/parse_func.h"
 #include "parser/parse_relation.h"
 #include "parser/parsetree.h"
+#include "partitioning/partdesc.h"
 #include "pgstat.h"
 #include "rewrite/rewriteManip.h"
 #include "storage/bufmgr.h"
index ab69404daac5531bc81df3ed03b02cfa8ba86f85..e121c6c8ff555df5717629880dd31dfb55d8ec8b 100644 (file)
@@ -24,6 +24,7 @@
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
 #include "partitioning/partbounds.h"
+#include "partitioning/partdesc.h"
 #include "partitioning/partprune.h"
 #include "rewrite/rewriteManip.h"
 #include "utils/lsyscache.h"
index eaf788e578d1538c0aaea6107905fac2ec4e2e95..faba4932002429d642a884e0454f3900d3da023b 100644 (file)
@@ -23,6 +23,7 @@
 #include "optimizer/inherit.h"
 #include "optimizer/planner.h"
 #include "optimizer/prep.h"
+#include "partitioning/partdesc.h"
 #include "utils/rel.h"
 
 
index d6dc83ca8090577cbe83c2f9ae671eb83c72c0b3..78a96b4ee2005c165ed38fc5954d1372b4460aa4 100644 (file)
@@ -27,7 +27,6 @@
 #include "catalog/catalog.h"
 #include "catalog/dependency.h"
 #include "catalog/heap.h"
-#include "catalog/partition.h"
 #include "catalog/pg_am.h"
 #include "catalog/pg_proc.h"
 #include "catalog/pg_statistic_ext.h"
@@ -41,6 +40,7 @@
 #include "optimizer/plancat.h"
 #include "optimizer/prep.h"
 #include "partitioning/partbounds.h"
+#include "partitioning/partdesc.h"
 #include "parser/parse_relation.h"
 #include "parser/parsetree.h"
 #include "rewrite/rewriteManip.h"
index 278fac3afa6aa8437b951d0ed0757f64e6ce8b51..82093c615f3eedc59718e3215a58c4e4f8191ecf 100644 (file)
@@ -12,6 +12,6 @@ subdir = src/backend/partitioning
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-OBJS = partprune.o partbounds.o
+OBJS = partbounds.o partdesc.o partprune.o
 
 include $(top_srcdir)/src/backend/common.mk
index d478ae7e19b21a135002cfc1466de3a0c1ed9666..e71eb3793bc99f2d9063af1b6966cf7decb1060a 100644 (file)
@@ -10,7 +10,8 @@
  *               src/backend/partitioning/partbounds.c
  *
  *-------------------------------------------------------------------------
-*/
+ */
+
 #include "postgres.h"
 
 #include "access/heapam.h"
@@ -23,8 +24,9 @@
 #include "nodes/makefuncs.h"
 #include "nodes/nodeFuncs.h"
 #include "parser/parse_coerce.h"
-#include "partitioning/partprune.h"
 #include "partitioning/partbounds.h"
+#include "partitioning/partdesc.h"
+#include "partitioning/partprune.h"
 #include "utils/builtins.h"
 #include "utils/datum.h"
 #include "utils/fmgroids.h"
diff --git a/src/backend/partitioning/partdesc.c b/src/backend/partitioning/partdesc.c
new file mode 100644 (file)
index 0000000..8a4b63a
--- /dev/null
@@ -0,0 +1,221 @@
+/*-------------------------------------------------------------------------
+ *
+ * partdesc.c
+ *             Support routines for manipulating partition descriptors
+ *
+ * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *               src/backend/partitioning/partdesc.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "catalog/partition.h"
+#include "catalog/pg_inherits.h"
+#include "partitioning/partbounds.h"
+#include "partitioning/partdesc.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "utils/partcache.h"
+#include "utils/syscache.h"
+
+/*
+ * RelationBuildPartitionDesc
+ *             Form rel's partition descriptor
+ *
+ * Not flushed from the cache by RelationClearRelation() unless changed because
+ * of addition or removal of partition.
+ */
+void
+RelationBuildPartitionDesc(Relation rel)
+{
+       PartitionDesc partdesc;
+       PartitionBoundInfo boundinfo = NULL;
+       List       *inhoids;
+       PartitionBoundSpec **boundspecs = NULL;
+       Oid                *oids = NULL;
+       ListCell   *cell;
+       int                     i,
+                               nparts;
+       PartitionKey key = RelationGetPartitionKey(rel);
+       MemoryContext oldcxt;
+       int                *mapping;
+
+       /* Get partition oids from pg_inherits */
+       inhoids = find_inheritance_children(RelationGetRelid(rel), NoLock);
+       nparts = list_length(inhoids);
+
+       if (nparts > 0)
+       {
+               oids = palloc(nparts * sizeof(Oid));
+               boundspecs = palloc(nparts * sizeof(PartitionBoundSpec *));
+       }
+
+       /* Collect bound spec nodes for each partition */
+       i = 0;
+       foreach(cell, inhoids)
+       {
+               Oid                     inhrelid = lfirst_oid(cell);
+               HeapTuple       tuple;
+               Datum           datum;
+               bool            isnull;
+               PartitionBoundSpec *boundspec;
+
+               tuple = SearchSysCache1(RELOID, inhrelid);
+               if (!HeapTupleIsValid(tuple))
+                       elog(ERROR, "cache lookup failed for relation %u", inhrelid);
+
+               datum = SysCacheGetAttr(RELOID, tuple,
+                                                               Anum_pg_class_relpartbound,
+                                                               &isnull);
+               if (isnull)
+                       elog(ERROR, "null relpartbound for relation %u", inhrelid);
+               boundspec = stringToNode(TextDatumGetCString(datum));
+               if (!IsA(boundspec, PartitionBoundSpec))
+                       elog(ERROR, "invalid relpartbound for relation %u", inhrelid);
+
+               /*
+                * Sanity check: If the PartitionBoundSpec says this is the default
+                * partition, its OID should correspond to whatever's stored in
+                * pg_partitioned_table.partdefid; if not, the catalog is corrupt.
+                */
+               if (boundspec->is_default)
+               {
+                       Oid                     partdefid;
+
+                       partdefid = get_default_partition_oid(RelationGetRelid(rel));
+                       if (partdefid != inhrelid)
+                               elog(ERROR, "expected partdefid %u, but got %u",
+                                        inhrelid, partdefid);
+               }
+
+               oids[i] = inhrelid;
+               boundspecs[i] = boundspec;
+               ++i;
+               ReleaseSysCache(tuple);
+       }
+
+       /* Now build the actual relcache partition descriptor */
+       rel->rd_pdcxt = AllocSetContextCreate(CacheMemoryContext,
+                                                                                 "partition descriptor",
+                                                                                 ALLOCSET_DEFAULT_SIZES);
+       MemoryContextCopyAndSetIdentifier(rel->rd_pdcxt,
+                                                                         RelationGetRelationName(rel));
+
+       oldcxt = MemoryContextSwitchTo(rel->rd_pdcxt);
+       partdesc = (PartitionDescData *) palloc0(sizeof(PartitionDescData));
+       partdesc->nparts = nparts;
+       /* oids and boundinfo are allocated below. */
+
+       MemoryContextSwitchTo(oldcxt);
+
+       if (nparts == 0)
+       {
+               rel->rd_partdesc = partdesc;
+               return;
+       }
+
+       /* First create PartitionBoundInfo */
+       boundinfo = partition_bounds_create(boundspecs, nparts, key, &mapping);
+
+       /* Now copy boundinfo and oids into partdesc. */
+       oldcxt = MemoryContextSwitchTo(rel->rd_pdcxt);
+       partdesc->boundinfo = partition_bounds_copy(boundinfo, key);
+       partdesc->oids = (Oid *) palloc(partdesc->nparts * sizeof(Oid));
+       partdesc->is_leaf = (bool *) palloc(partdesc->nparts * sizeof(bool));
+
+       /*
+        * Now assign OIDs from the original array into mapped indexes of the
+        * result array.  The order of OIDs in the former is defined by the
+        * catalog scan that retrieved them, whereas that in the latter is defined
+        * by canonicalized representation of the partition bounds.
+        */
+       for (i = 0; i < partdesc->nparts; i++)
+       {
+               int                     index = mapping[i];
+
+               partdesc->oids[index] = oids[i];
+               /* Record if the partition is a leaf partition */
+               partdesc->is_leaf[index] =
+                               (get_rel_relkind(oids[i]) != RELKIND_PARTITIONED_TABLE);
+       }
+       MemoryContextSwitchTo(oldcxt);
+
+       rel->rd_partdesc = partdesc;
+}
+
+/*
+ * equalPartitionDescs
+ *             Compare two partition descriptors for logical equality
+ */
+bool
+equalPartitionDescs(PartitionKey key, PartitionDesc partdesc1,
+                                       PartitionDesc partdesc2)
+{
+       int                     i;
+
+       if (partdesc1 != NULL)
+       {
+               if (partdesc2 == NULL)
+                       return false;
+               if (partdesc1->nparts != partdesc2->nparts)
+                       return false;
+
+               Assert(key != NULL || partdesc1->nparts == 0);
+
+               /*
+                * Same oids? If the partitioning structure did not change, that is,
+                * no partitions were added or removed to the relation, the oids array
+                * should still match element-by-element.
+                */
+               for (i = 0; i < partdesc1->nparts; i++)
+               {
+                       if (partdesc1->oids[i] != partdesc2->oids[i])
+                               return false;
+               }
+
+               /*
+                * Now compare partition bound collections.  The logic to iterate over
+                * the collections is private to partition.c.
+                */
+               if (partdesc1->boundinfo != NULL)
+               {
+                       if (partdesc2->boundinfo == NULL)
+                               return false;
+
+                       if (!partition_bounds_equal(key->partnatts, key->parttyplen,
+                                                                               key->parttypbyval,
+                                                                               partdesc1->boundinfo,
+                                                                               partdesc2->boundinfo))
+                               return false;
+               }
+               else if (partdesc2->boundinfo != NULL)
+                       return false;
+       }
+       else if (partdesc2 != NULL)
+               return false;
+
+       return true;
+}
+
+/*
+ * get_default_oid_from_partdesc
+ *
+ * Given a partition descriptor, return the OID of the default partition, if
+ * one exists; else, return InvalidOid.
+ */
+Oid
+get_default_oid_from_partdesc(PartitionDesc partdesc)
+{
+       if (partdesc && partdesc->boundinfo &&
+               partition_bound_has_default(partdesc->boundinfo))
+               return partdesc->oids[partdesc->boundinfo->default_index];
+
+       return InvalidOid;
+}
index 1b50f283c554352f1508b94318698f403bc23e8c..2b55f25e758b9f781a12b3a9e809e56670e26827 100644 (file)
@@ -243,130 +243,6 @@ RelationBuildPartitionKey(Relation relation)
        relation->rd_partkey = key;
 }
 
-/*
- * RelationBuildPartitionDesc
- *             Form rel's partition descriptor
- *
- * Not flushed from the cache by RelationClearRelation() unless changed because
- * of addition or removal of partition.
- */
-void
-RelationBuildPartitionDesc(Relation rel)
-{
-       PartitionDesc partdesc;
-       PartitionBoundInfo boundinfo = NULL;
-       List       *inhoids;
-       PartitionBoundSpec **boundspecs = NULL;
-       Oid                *oids = NULL;
-       ListCell   *cell;
-       int                     i,
-                               nparts;
-       PartitionKey key = RelationGetPartitionKey(rel);
-       MemoryContext oldcxt;
-       int                *mapping;
-
-       /* Get partition oids from pg_inherits */
-       inhoids = find_inheritance_children(RelationGetRelid(rel), NoLock);
-       nparts = list_length(inhoids);
-
-       if (nparts > 0)
-       {
-               oids = palloc(nparts * sizeof(Oid));
-               boundspecs = palloc(nparts * sizeof(PartitionBoundSpec *));
-       }
-
-       /* Collect bound spec nodes for each partition */
-       i = 0;
-       foreach(cell, inhoids)
-       {
-               Oid                     inhrelid = lfirst_oid(cell);
-               HeapTuple       tuple;
-               Datum           datum;
-               bool            isnull;
-               PartitionBoundSpec *boundspec;
-
-               tuple = SearchSysCache1(RELOID, inhrelid);
-               if (!HeapTupleIsValid(tuple))
-                       elog(ERROR, "cache lookup failed for relation %u", inhrelid);
-
-               datum = SysCacheGetAttr(RELOID, tuple,
-                                                               Anum_pg_class_relpartbound,
-                                                               &isnull);
-               if (isnull)
-                       elog(ERROR, "null relpartbound for relation %u", inhrelid);
-               boundspec = stringToNode(TextDatumGetCString(datum));
-               if (!IsA(boundspec, PartitionBoundSpec))
-                       elog(ERROR, "invalid relpartbound for relation %u", inhrelid);
-
-               /*
-                * Sanity check: If the PartitionBoundSpec says this is the default
-                * partition, its OID should correspond to whatever's stored in
-                * pg_partitioned_table.partdefid; if not, the catalog is corrupt.
-                */
-               if (boundspec->is_default)
-               {
-                       Oid                     partdefid;
-
-                       partdefid = get_default_partition_oid(RelationGetRelid(rel));
-                       if (partdefid != inhrelid)
-                               elog(ERROR, "expected partdefid %u, but got %u",
-                                        inhrelid, partdefid);
-               }
-
-               oids[i] = inhrelid;
-               boundspecs[i] = boundspec;
-               ++i;
-               ReleaseSysCache(tuple);
-       }
-
-       /* Now build the actual relcache partition descriptor */
-       rel->rd_pdcxt = AllocSetContextCreate(CacheMemoryContext,
-                                                                                 "partition descriptor",
-                                                                                 ALLOCSET_DEFAULT_SIZES);
-       MemoryContextCopyAndSetIdentifier(rel->rd_pdcxt, RelationGetRelationName(rel));
-
-       oldcxt = MemoryContextSwitchTo(rel->rd_pdcxt);
-       partdesc = (PartitionDescData *) palloc0(sizeof(PartitionDescData));
-       partdesc->nparts = nparts;
-       /* oids and boundinfo are allocated below. */
-
-       MemoryContextSwitchTo(oldcxt);
-
-       if (nparts == 0)
-       {
-               rel->rd_partdesc = partdesc;
-               return;
-       }
-
-       /* First create PartitionBoundInfo */
-       boundinfo = partition_bounds_create(boundspecs, nparts, key, &mapping);
-
-       /* Now copy boundinfo and oids into partdesc. */
-       oldcxt = MemoryContextSwitchTo(rel->rd_pdcxt);
-       partdesc->boundinfo = partition_bounds_copy(boundinfo, key);
-       partdesc->oids = (Oid *) palloc(partdesc->nparts * sizeof(Oid));
-       partdesc->is_leaf = (bool *) palloc(partdesc->nparts * sizeof(bool));
-
-       /*
-        * Now assign OIDs from the original array into mapped indexes of the
-        * result array.  The order of OIDs in the former is defined by the
-        * catalog scan that retrieved them, whereas that in the latter is defined
-        * by canonicalized representation of the partition bounds.
-        */
-       for (i = 0; i < partdesc->nparts; i++)
-       {
-               int                     index = mapping[i];
-
-               partdesc->oids[index] = oids[i];
-               /* Record if the partition is a leaf partition */
-               partdesc->is_leaf[index] =
-                               (get_rel_relkind(oids[i]) != RELKIND_PARTITIONED_TABLE);
-       }
-       MemoryContextSwitchTo(oldcxt);
-
-       rel->rd_partdesc = partdesc;
-}
-
 /*
  * RelationGetPartitionQual
  *
index 721c9dab95708560f8f6ef985e60462ba46a437d..54a40ef00bdc9c02bb520e8ddab4092479a3749e 100644 (file)
@@ -72,6 +72,7 @@
 #include "nodes/nodeFuncs.h"
 #include "optimizer/optimizer.h"
 #include "partitioning/partbounds.h"
+#include "partitioning/partdesc.h"
 #include "rewrite/rewriteDefine.h"
 #include "rewrite/rowsecurity.h"
 #include "storage/lmgr.h"
@@ -283,8 +284,6 @@ static OpClassCacheEnt *LookupOpclassInfo(Oid operatorClassOid,
                                  StrategyNumber numSupport);
 static void RelationCacheInitFileRemoveInDir(const char *tblspcpath);
 static void unlink_initfile(const char *initfilename, int elevel);
-static bool equalPartitionDescs(PartitionKey key, PartitionDesc partdesc1,
-                                       PartitionDesc partdesc2);
 
 
 /*
@@ -995,60 +994,6 @@ equalRSDesc(RowSecurityDesc *rsdesc1, RowSecurityDesc *rsdesc2)
        return true;
 }
 
-/*
- * equalPartitionDescs
- *             Compare two partition descriptors for logical equality
- */
-static bool
-equalPartitionDescs(PartitionKey key, PartitionDesc partdesc1,
-                                       PartitionDesc partdesc2)
-{
-       int                     i;
-
-       if (partdesc1 != NULL)
-       {
-               if (partdesc2 == NULL)
-                       return false;
-               if (partdesc1->nparts != partdesc2->nparts)
-                       return false;
-
-               Assert(key != NULL || partdesc1->nparts == 0);
-
-               /*
-                * Same oids? If the partitioning structure did not change, that is,
-                * no partitions were added or removed to the relation, the oids array
-                * should still match element-by-element.
-                */
-               for (i = 0; i < partdesc1->nparts; i++)
-               {
-                       if (partdesc1->oids[i] != partdesc2->oids[i])
-                               return false;
-               }
-
-               /*
-                * Now compare partition bound collections.  The logic to iterate over
-                * the collections is private to partition.c.
-                */
-               if (partdesc1->boundinfo != NULL)
-               {
-                       if (partdesc2->boundinfo == NULL)
-                               return false;
-
-                       if (!partition_bounds_equal(key->partnatts, key->parttyplen,
-                                                                               key->parttypbyval,
-                                                                               partdesc1->boundinfo,
-                                                                               partdesc2->boundinfo))
-                               return false;
-               }
-               else if (partdesc2->boundinfo != NULL)
-                       return false;
-       }
-       else if (partdesc2 != NULL)
-               return false;
-
-       return true;
-}
-
 /*
  *             RelationBuildDesc
  *
index 5685d2fd579a105bb18bbb9e273e315def10c3d1..d84e32598354d70aa05c5be6c979feb0059bec74 100644 (file)
 /* Seed for the extended hash function */
 #define HASH_PARTITION_SEED UINT64CONST(0x7A5B22367996DCFD)
 
-/*
- * Information about partitions of a partitioned table.
- */
-typedef struct PartitionDescData
-{
-       int                     nparts;                 /* Number of partitions */
-       Oid                *oids;                       /* Array of 'nparts' elements containing
-                                                                * partition OIDs in order of the their bounds */
-       bool       *is_leaf;            /* Array of 'nparts' elements storing whether
-                                                                * the corresponding 'oids' element belongs to
-                                                                * a leaf partition or not */
-       PartitionBoundInfo boundinfo;   /* collection of partition bounds */
-} PartitionDescData;
-
 extern Oid     get_partition_parent(Oid relid);
 extern List *get_partition_ancestors(Oid relid);
 extern List *map_partition_varattnos(List *expr, int fromrel_varno,
@@ -41,7 +27,6 @@ extern List *map_partition_varattnos(List *expr, int fromrel_varno,
 extern bool has_partition_attrs(Relation rel, Bitmapset *attnums,
                                        bool *used_in_expr);
 
-extern Oid     get_default_oid_from_partdesc(PartitionDesc partdesc);
 extern Oid     get_default_partition_oid(Oid parentId);
 extern void update_default_partition_oid(Oid parentId, Oid defaultPartId);
 extern List *get_proposed_default_constraint(List *new_part_constaints);
diff --git a/src/include/partitioning/partdesc.h b/src/include/partitioning/partdesc.h
new file mode 100644 (file)
index 0000000..f72b70d
--- /dev/null
@@ -0,0 +1,39 @@
+/*-------------------------------------------------------------------------
+ *
+ * partdesc.h
+ *
+ * Copyright (c) 1996-2018, PostgreSQL Global Development Group
+ *
+ * src/include/utils/partdesc.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PARTDESC_H
+#define PARTDESC_H
+
+#include "partitioning/partdefs.h"
+#include "utils/relcache.h"
+
+/*
+ * Information about partitions of a partitioned table.
+ */
+typedef struct PartitionDescData
+{
+       int                     nparts;                 /* Number of partitions */
+       Oid                *oids;                       /* Array of 'nparts' elements containing
+                                                                * partition OIDs in order of the their bounds */
+       bool       *is_leaf;            /* Array of 'nparts' elements storing whether
+                                                                * the corresponding 'oids' element belongs to
+                                                                * a leaf partition or not */
+       PartitionBoundInfo boundinfo;   /* collection of partition bounds */
+} PartitionDescData;
+
+extern void RelationBuildPartitionDesc(Relation rel);
+
+extern Oid     get_default_oid_from_partdesc(PartitionDesc partdesc);
+
+extern bool equalPartitionDescs(PartitionKey key, PartitionDesc partdesc1,
+                                       PartitionDesc partdesc2);
+
+#endif                                                 /* PARTCACHE_H */
index 7c2f973f68ef97189bc04219faa56ef963db9c4e..823ad2eeb6531a4eb75480f993a1e230502af8db 100644 (file)
@@ -47,7 +47,6 @@ typedef struct PartitionKeyData
 }                      PartitionKeyData;
 
 extern void RelationBuildPartitionKey(Relation relation);
-extern void RelationBuildPartitionDesc(Relation rel);
 extern List *RelationGetPartitionQual(Relation rel);
 extern Expr *get_partition_qual_relid(Oid relid);