mirror of
https://github.com/postgres/postgres.git
synced 2025-10-29 22:49:41 +03:00
Reorganize partitioning code
There's been a massive addition of partitioning code in PostgreSQL 11, with little oversight on its placement, resulting in a catalog/partition.c with poorly defined boundaries and responsibilities. This commit tries to set a couple of distinct modules to separate things a little bit. There are no code changes here, only code movement. There are three new files: src/backend/utils/cache/partcache.c src/include/partitioning/partdefs.h src/include/utils/partcache.h The previous arrangement of #including catalog/partition.h almost everywhere is no more. Authors: Amit Langote and Álvaro Herrera Discussion: https://postgr.es/m/98e8d509-790a-128c-be7f-e48a5b2d8d97@lab.ntt.co.jp https://postgr.es/m/11aa0c50-316b-18bb-722d-c23814f39059@lab.ntt.co.jp https://postgr.es/m/143ed9a4-6038-76d4-9a55-502035815e68@lab.ntt.co.jp https://postgr.es/m/20180413193503.nynq7bnmgh6vs5vm@alvherre.pgsql
This commit is contained in:
@@ -14,22 +14,12 @@
|
||||
#define PARTITION_H
|
||||
|
||||
#include "fmgr.h"
|
||||
#include "executor/tuptable.h"
|
||||
#include "nodes/execnodes.h"
|
||||
#include "parser/parse_node.h"
|
||||
#include "utils/rel.h"
|
||||
#include "partitioning/partdefs.h"
|
||||
#include "utils/relcache.h"
|
||||
|
||||
/* Seed for the extended hash function */
|
||||
#define HASH_PARTITION_SEED UINT64CONST(0x7A5B22367996DCFD)
|
||||
|
||||
/*
|
||||
* PartitionBoundInfo encapsulates a set of partition bounds. It is usually
|
||||
* associated with partitioned tables as part of its partition descriptor.
|
||||
*
|
||||
* The internal structure appears in partbounds.h.
|
||||
*/
|
||||
typedef struct PartitionBoundInfoData *PartitionBoundInfo;
|
||||
|
||||
/*
|
||||
* Information about partitions of a partitioned table.
|
||||
*/
|
||||
@@ -40,37 +30,17 @@ typedef struct PartitionDescData
|
||||
PartitionBoundInfo boundinfo; /* collection of partition bounds */
|
||||
} PartitionDescData;
|
||||
|
||||
typedef struct PartitionDescData *PartitionDesc;
|
||||
|
||||
extern void RelationBuildPartitionDesc(Relation relation);
|
||||
extern bool partition_bounds_equal(int partnatts, int16 *parttyplen,
|
||||
bool *parttypbyval, PartitionBoundInfo b1,
|
||||
PartitionBoundInfo b2);
|
||||
extern PartitionBoundInfo partition_bounds_copy(PartitionBoundInfo src,
|
||||
PartitionKey key);
|
||||
|
||||
extern void check_new_partition_bound(char *relname, Relation parent,
|
||||
PartitionBoundSpec *spec);
|
||||
extern Oid get_partition_parent(Oid relid);
|
||||
extern List *get_partition_ancestors(Oid relid);
|
||||
extern List *get_qual_from_partbound(Relation rel, Relation parent,
|
||||
PartitionBoundSpec *spec);
|
||||
extern List *map_partition_varattnos(List *expr, int fromrel_varno,
|
||||
Relation to_rel, Relation from_rel,
|
||||
bool *found_whole_row);
|
||||
extern List *RelationGetPartitionQual(Relation rel);
|
||||
extern Expr *get_partition_qual_relid(Oid relid);
|
||||
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 void check_default_allows_bound(Relation parent, Relation defaultRel,
|
||||
PartitionBoundSpec *new_spec);
|
||||
extern List *get_proposed_default_constraint(List *new_part_constaints);
|
||||
|
||||
extern int get_partition_for_tuple(Relation relation, Datum *values,
|
||||
bool *isnull);
|
||||
|
||||
#endif /* PARTITION_H */
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include "catalog/dependency.h"
|
||||
#include "catalog/objectaddress.h"
|
||||
#include "nodes/parsenodes.h"
|
||||
#include "catalog/partition.h"
|
||||
#include "storage/lock.h"
|
||||
#include "utils/relcache.h"
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#ifndef EXECPARTITION_H
|
||||
#define EXECPARTITION_H
|
||||
|
||||
#include "catalog/partition.h"
|
||||
#include "nodes/execnodes.h"
|
||||
#include "nodes/parsenodes.h"
|
||||
#include "nodes/plannodes.h"
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#ifndef EXECUTOR_H
|
||||
#define EXECUTOR_H
|
||||
|
||||
#include "catalog/partition.h"
|
||||
#include "executor/execdesc.h"
|
||||
#include "nodes/parsenodes.h"
|
||||
#include "utils/memutils.h"
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
#include "nodes/lockoptions.h"
|
||||
#include "nodes/primnodes.h"
|
||||
#include "nodes/value.h"
|
||||
#include "partitioning/partdefs.h"
|
||||
|
||||
|
||||
typedef enum OverridingKind
|
||||
{
|
||||
@@ -803,7 +805,7 @@ typedef struct PartitionSpec
|
||||
* This represents the portion of the partition key space assigned to a
|
||||
* particular partition. These are stored on disk in pg_class.relpartbound.
|
||||
*/
|
||||
typedef struct PartitionBoundSpec
|
||||
struct PartitionBoundSpec
|
||||
{
|
||||
NodeTag type;
|
||||
|
||||
@@ -822,7 +824,7 @@ typedef struct PartitionBoundSpec
|
||||
List *upperdatums; /* List of PartitionRangeDatums */
|
||||
|
||||
int location; /* token location, or -1 if unknown */
|
||||
} PartitionBoundSpec;
|
||||
};
|
||||
|
||||
/*
|
||||
* PartitionRangeDatum - one of the values in a range partition bound
|
||||
|
||||
@@ -11,7 +11,11 @@
|
||||
#ifndef PARTBOUNDS_H
|
||||
#define PARTBOUNDS_H
|
||||
|
||||
#include "catalog/partition.h"
|
||||
#include "fmgr.h"
|
||||
#include "nodes/parsenodes.h"
|
||||
#include "nodes/pg_list.h"
|
||||
#include "partitioning/partdefs.h"
|
||||
#include "utils/relcache.h"
|
||||
|
||||
|
||||
/*
|
||||
@@ -101,7 +105,34 @@ typedef struct PartitionRangeBound
|
||||
} PartitionRangeBound;
|
||||
|
||||
extern int get_hash_partition_greatest_modulus(PartitionBoundInfo b);
|
||||
extern int partition_list_bsearch(FmgrInfo *partsupfunc, Oid *partcollation,
|
||||
extern uint64 compute_hash_value(int partnatts, FmgrInfo *partsupfunc,
|
||||
Datum *values, bool *isnull);
|
||||
extern List *get_qual_from_partbound(Relation rel, Relation parent,
|
||||
PartitionBoundSpec *spec);
|
||||
extern bool partition_bounds_equal(int partnatts, int16 *parttyplen,
|
||||
bool *parttypbyval, PartitionBoundInfo b1,
|
||||
PartitionBoundInfo b2);
|
||||
extern PartitionBoundInfo partition_bounds_copy(PartitionBoundInfo src,
|
||||
PartitionKey key);
|
||||
extern void check_new_partition_bound(char *relname, Relation parent,
|
||||
PartitionBoundSpec *spec);
|
||||
extern void check_default_allows_bound(Relation parent, Relation defaultRel,
|
||||
PartitionBoundSpec *new_spec);
|
||||
|
||||
extern PartitionRangeBound *make_one_range_bound(PartitionKey key, int index,
|
||||
List *datums, bool lower);
|
||||
extern int32 partition_hbound_cmp(int modulus1, int remainder1, int modulus2,
|
||||
int remainder2);
|
||||
extern int32 partition_rbound_cmp(int partnatts, FmgrInfo *partsupfunc,
|
||||
Oid *partcollation, Datum *datums1,
|
||||
PartitionRangeDatumKind *kind1, bool lower1,
|
||||
PartitionRangeBound *b2);
|
||||
extern int32 partition_rbound_datum_cmp(FmgrInfo *partsupfunc,
|
||||
Oid *partcollation,
|
||||
Datum *rb_datums, PartitionRangeDatumKind *rb_kind,
|
||||
Datum *tuple_datums, int n_tuple_datums);
|
||||
extern int partition_list_bsearch(FmgrInfo *partsupfunc,
|
||||
Oid *partcollation,
|
||||
PartitionBoundInfo boundinfo,
|
||||
Datum value, bool *is_equal);
|
||||
extern int partition_range_bsearch(int partnatts, FmgrInfo *partsupfunc,
|
||||
@@ -114,11 +145,5 @@ extern int partition_range_datum_bsearch(FmgrInfo *partsupfunc,
|
||||
int nvalues, Datum *values, bool *is_equal);
|
||||
extern int partition_hash_bsearch(PartitionBoundInfo boundinfo,
|
||||
int modulus, int remainder);
|
||||
extern uint64 compute_hash_value(int partnatts, FmgrInfo *partsupfunc,
|
||||
Datum *values, bool *isnull);
|
||||
extern int32 partition_rbound_datum_cmp(FmgrInfo *partsupfunc,
|
||||
Oid *partcollation,
|
||||
Datum *rb_datums, PartitionRangeDatumKind *rb_kind,
|
||||
Datum *tuple_datums, int n_tuple_datums);
|
||||
|
||||
#endif /* PARTBOUNDS_H */
|
||||
|
||||
24
src/include/partitioning/partdefs.h
Normal file
24
src/include/partitioning/partdefs.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* partdefs.h
|
||||
* Base definitions for partitioned table handling
|
||||
*
|
||||
* Copyright (c) 2007-2018, PostgreSQL Global Development Group
|
||||
*
|
||||
* src/include/partitioning/partdefs.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef PARTDEFS_H
|
||||
#define PARTDEFS_H
|
||||
|
||||
|
||||
typedef struct PartitionBoundInfoData *PartitionBoundInfo;
|
||||
|
||||
typedef struct PartitionKeyData *PartitionKey;
|
||||
|
||||
typedef struct PartitionBoundSpec PartitionBoundSpec;
|
||||
|
||||
typedef struct PartitionDescData *PartitionDesc;
|
||||
|
||||
#endif /* PARTDEFS_H */
|
||||
@@ -14,9 +14,10 @@
|
||||
#ifndef PARTPRUNE_H
|
||||
#define PARTPRUNE_H
|
||||
|
||||
#include "catalog/partition.h"
|
||||
#include "nodes/execnodes.h"
|
||||
#include "nodes/relation.h"
|
||||
|
||||
|
||||
/*
|
||||
* PartitionPruneContext
|
||||
*
|
||||
|
||||
96
src/include/utils/partcache.h
Normal file
96
src/include/utils/partcache.h
Normal file
@@ -0,0 +1,96 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* partcache.h
|
||||
*
|
||||
* Copyright (c) 1996-2018, PostgreSQL Global Development Group
|
||||
*
|
||||
* src/include/utils/partcache.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef PARTCACHE_H
|
||||
#define PARTCACHE_H
|
||||
|
||||
#include "access/attnum.h"
|
||||
#include "fmgr.h"
|
||||
#include "nodes/pg_list.h"
|
||||
#include "nodes/primnodes.h"
|
||||
#include "partitioning/partdefs.h"
|
||||
#include "utils/relcache.h"
|
||||
|
||||
/*
|
||||
* Information about the partition key of a relation
|
||||
*/
|
||||
typedef struct PartitionKeyData
|
||||
{
|
||||
char strategy; /* partitioning strategy */
|
||||
int16 partnatts; /* number of columns in the partition key */
|
||||
AttrNumber *partattrs; /* attribute numbers of columns in the
|
||||
* partition key */
|
||||
List *partexprs; /* list of expressions in the partitioning
|
||||
* key, or NIL */
|
||||
|
||||
Oid *partopfamily; /* OIDs of operator families */
|
||||
Oid *partopcintype; /* OIDs of opclass declared input data types */
|
||||
FmgrInfo *partsupfunc; /* lookup info for support funcs */
|
||||
|
||||
/* Partitioning collation per attribute */
|
||||
Oid *partcollation;
|
||||
|
||||
/* Type information per attribute */
|
||||
Oid *parttypid;
|
||||
int32 *parttypmod;
|
||||
int16 *parttyplen;
|
||||
bool *parttypbyval;
|
||||
char *parttypalign;
|
||||
Oid *parttypcoll;
|
||||
} PartitionKeyData;
|
||||
|
||||
extern void RelationBuildPartitionKey(Relation relation);
|
||||
extern void RelationBuildPartitionDesc(Relation rel);
|
||||
extern List *RelationGetPartitionQual(Relation rel);
|
||||
extern Expr *get_partition_qual_relid(Oid relid);
|
||||
|
||||
/*
|
||||
* PartitionKey inquiry functions
|
||||
*/
|
||||
static inline int
|
||||
get_partition_strategy(PartitionKey key)
|
||||
{
|
||||
return key->strategy;
|
||||
}
|
||||
|
||||
static inline int
|
||||
get_partition_natts(PartitionKey key)
|
||||
{
|
||||
return key->partnatts;
|
||||
}
|
||||
|
||||
static inline List *
|
||||
get_partition_exprs(PartitionKey key)
|
||||
{
|
||||
return key->partexprs;
|
||||
}
|
||||
|
||||
/*
|
||||
* PartitionKey inquiry functions - one column
|
||||
*/
|
||||
static inline int16
|
||||
get_partition_col_attnum(PartitionKey key, int col)
|
||||
{
|
||||
return key->partattrs[col];
|
||||
}
|
||||
|
||||
static inline Oid
|
||||
get_partition_col_typid(PartitionKey key, int col)
|
||||
{
|
||||
return key->parttypid[col];
|
||||
}
|
||||
|
||||
static inline int32
|
||||
get_partition_col_typmod(PartitionKey key, int col)
|
||||
{
|
||||
return key->parttypmod[col];
|
||||
}
|
||||
|
||||
#endif /* PARTCACHE_H */
|
||||
@@ -46,36 +46,6 @@ typedef struct LockInfoData
|
||||
|
||||
typedef LockInfoData *LockInfo;
|
||||
|
||||
/*
|
||||
* Information about the partition key of a relation
|
||||
*/
|
||||
typedef struct PartitionKeyData
|
||||
{
|
||||
char strategy; /* partitioning strategy */
|
||||
int16 partnatts; /* number of columns in the partition key */
|
||||
AttrNumber *partattrs; /* attribute numbers of columns in the
|
||||
* partition key */
|
||||
List *partexprs; /* list of expressions in the partitioning
|
||||
* key, or NIL */
|
||||
|
||||
Oid *partopfamily; /* OIDs of operator families */
|
||||
Oid *partopcintype; /* OIDs of opclass declared input data types */
|
||||
FmgrInfo *partsupfunc; /* lookup info for support funcs */
|
||||
|
||||
/* Partitioning collation per attribute */
|
||||
Oid *partcollation;
|
||||
|
||||
/* Type information per attribute */
|
||||
Oid *parttypid;
|
||||
int32 *parttypmod;
|
||||
int16 *parttyplen;
|
||||
bool *parttypbyval;
|
||||
char *parttypalign;
|
||||
Oid *parttypcoll;
|
||||
} PartitionKeyData;
|
||||
|
||||
typedef struct PartitionKeyData *PartitionKey;
|
||||
|
||||
/*
|
||||
* Here are the contents of a relation cache entry.
|
||||
*/
|
||||
@@ -618,48 +588,6 @@ typedef struct ViewOptions
|
||||
*/
|
||||
#define RelationGetPartitionKey(relation) ((relation)->rd_partkey)
|
||||
|
||||
/*
|
||||
* PartitionKey inquiry functions
|
||||
*/
|
||||
static inline int
|
||||
get_partition_strategy(PartitionKey key)
|
||||
{
|
||||
return key->strategy;
|
||||
}
|
||||
|
||||
static inline int
|
||||
get_partition_natts(PartitionKey key)
|
||||
{
|
||||
return key->partnatts;
|
||||
}
|
||||
|
||||
static inline List *
|
||||
get_partition_exprs(PartitionKey key)
|
||||
{
|
||||
return key->partexprs;
|
||||
}
|
||||
|
||||
/*
|
||||
* PartitionKey inquiry functions - one column
|
||||
*/
|
||||
static inline int16
|
||||
get_partition_col_attnum(PartitionKey key, int col)
|
||||
{
|
||||
return key->partattrs[col];
|
||||
}
|
||||
|
||||
static inline Oid
|
||||
get_partition_col_typid(PartitionKey key, int col)
|
||||
{
|
||||
return key->parttypid[col];
|
||||
}
|
||||
|
||||
static inline int32
|
||||
get_partition_col_typmod(PartitionKey key, int col)
|
||||
{
|
||||
return key->parttypmod[col];
|
||||
}
|
||||
|
||||
/*
|
||||
* RelationGetPartitionDesc
|
||||
* Returns partition descriptor for a relation.
|
||||
|
||||
Reference in New Issue
Block a user