From 1bf53093225794d01003c62d6fd0a4d2a8d06453 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 18 Dec 2018 18:55:37 -0500 Subject: [PATCH] Partition directory. --- src/backend/partitioning/Makefile | 2 +- src/backend/partitioning/partdir.c | 76 +++++++++++++++++++++++++++++ src/include/partitioning/partdefs.h | 2 + src/include/partitioning/partdir.h | 21 ++++++++ 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 src/backend/partitioning/partdir.c create mode 100644 src/include/partitioning/partdir.h diff --git a/src/backend/partitioning/Makefile b/src/backend/partitioning/Makefile index 278fac3afa..a096b0a0bb 100644 --- a/src/backend/partitioning/Makefile +++ b/src/backend/partitioning/Makefile @@ -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 index 0000000000..463d192f13 --- /dev/null +++ b/src/backend/partitioning/partdir.c @@ -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; +} diff --git a/src/include/partitioning/partdefs.h b/src/include/partitioning/partdefs.h index 1fe1b4868e..9d94740d1d 100644 --- a/src/include/partitioning/partdefs.h +++ b/src/include/partitioning/partdefs.h @@ -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 index 0000000000..0472575bc1 --- /dev/null +++ b/src/include/partitioning/partdir.h @@ -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 */ -- 2.39.5