Partition directory.
authorRobert Haas <[email protected]>
Tue, 18 Dec 2018 23:55:37 +0000 (18:55 -0500)
committerRobert Haas <[email protected]>
Tue, 18 Dec 2018 23:55:37 +0000 (18:55 -0500)
src/backend/partitioning/Makefile
src/backend/partitioning/partdir.c [new file with mode: 0644]
src/include/partitioning/partdefs.h
src/include/partitioning/partdir.h [new file with mode: 0644]

index 278fac3afa6aa8437b951d0ed0757f64e6ce8b51..a096b0a0bb6b6d1f42157ddf175f1fc59c8e5c35 100644 (file)
@@ -12,6 +12,6 @@ subdir = src/backend/partitioning
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-OBJS = partprune.o partbounds.o
+OBJS = partprune.o partbounds.o partdir.o
 
 include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/partitioning/partdir.c b/src/backend/partitioning/partdir.c
new file mode 100644 (file)
index 0000000..463d192
--- /dev/null
@@ -0,0 +1,76 @@
+/*-------------------------------------------------------------------------
+ *
+ * partdir.c
+ *             Support for partition directories
+ *
+ * Partition directories provide a mechanism for looking up the
+ * PartitionDesc for a relation in such a way that the answer will be
+ * the same every time the directory is interrogated, even in the face
+ * of concurrent DDL.
+ *
+ * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *               src/backend/partitioning/partdir.c
+ *
+ *-------------------------------------------------------------------------
+*/
+#include "postgres.h"
+
+#include "catalog/pg_class.h"
+#include "partitioning/partdir.h"
+#include "utils/hsearch.h"
+#include "utils/rel.h"
+
+typedef struct PartitionDirectoryData
+{
+       MemoryContext pdir_mcxt;
+       HTAB *pdir_htab;
+} PartitionDirectoryData;
+
+typedef struct PartitionDirectoryEntry
+{
+       Oid     relid;
+       PartitionDesc pd;
+} PartitionDirectoryEntry;
+
+PartitionDirectory
+CreatePartitionDirectory(MemoryContext mcxt)
+{
+       HASHCTL hctl;
+       MemoryContext oldcontext;
+       PartitionDirectory pdir;
+
+       hctl.keysize = sizeof(Oid);
+       hctl.entrysize = sizeof(PartitionDirectoryEntry);
+       hctl.hcxt = mcxt;
+
+       oldcontext = MemoryContextSwitchTo(mcxt);
+
+       pdir = palloc(sizeof(PartitionDirectoryData));
+       pdir->pdir_mcxt = mcxt;
+       pdir->pdir_htab = hash_create("PartitionDirectory", 256, &hctl,
+                                                                 HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
+
+       MemoryContextSwitchTo(oldcontext);
+       return pdir;
+}
+
+PartitionDesc
+PartitionDirectoryLookup(PartitionDirectory pdir, Relation rel)
+{
+       PartitionDirectoryEntry *pde;
+       Oid relid;
+       bool found;
+
+       Assert(rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
+       relid = RelationGetRelid(rel);
+       pde = hash_search(pdir->pdir_htab, &relid, HASH_ENTER, &found);
+       if (!found)
+       {
+               pde->pd = RelationGetPartitionDesc(rel);
+               Assert(pde->pd != NULL);
+       }
+       return pde->pd;
+}
index 1fe1b4868e997c8213b863cddfd6e9bfc3680870..9d94740d1d7298cc2710e3fd858c900184dc4911 100644 (file)
@@ -21,4 +21,6 @@ typedef struct PartitionBoundSpec PartitionBoundSpec;
 
 typedef struct PartitionDescData *PartitionDesc;
 
+typedef struct PartitionDirectoryData *PartitionDirectory;
+
 #endif                                                 /* PARTDEFS_H */
diff --git a/src/include/partitioning/partdir.h b/src/include/partitioning/partdir.h
new file mode 100644 (file)
index 0000000..0472575
--- /dev/null
@@ -0,0 +1,21 @@
+/*-------------------------------------------------------------------------
+ *
+ * partdir.h
+ *             A partition directory provides stable PartitionDesc lookups
+ *
+ * Copyright (c) 2007-2018, PostgreSQL Global Development Group
+ *
+ * src/include/partitioning/partdir.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef PARTDIR_H
+#define PARTDIR_H
+
+#include "partitioning/partdefs.h"
+#include "utils/relcache.h"
+
+extern PartitionDirectory CreatePartitionDirectory(MemoryContext mcxt);
+extern PartitionDesc PartitionDirectoryLookup(PartitionDirectory, Relation);
+
+#endif                                                 /* PARTDIR_H */