Move code for managing PartitionDescs into a new file, partdesc.c
authorRobert Haas <[email protected]>
Thu, 21 Feb 2019 16:38:54 +0000 (11:38 -0500)
committerRobert Haas <[email protected]>
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);