108 lines
4.6 KiB
C
108 lines
4.6 KiB
C
/* ---------------------------------------------------------------------------------------
|
|
*
|
|
* func_dependency.h
|
|
* functional dependency statistics declarations
|
|
*
|
|
* Portions Copyright (c) 2020 Huawei Technologies Co.,Ltd.
|
|
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* IDENTIFICATION
|
|
* src/include/optimizer/func_dependency.h
|
|
*
|
|
* ---------------------------------------------------------------------------------------
|
|
*/
|
|
#ifndef ENABLE_MULTIPLE_NODES
|
|
|
|
#ifndef FUNC_DEPENDENCY_H
|
|
#define FUNC_DEPENDENCY_H
|
|
|
|
#include "commands/vacuum.h"
|
|
#include "nodes/relation.h"
|
|
#include "utils/sortsupport.h"
|
|
|
|
/* Min number of attributes for functional dependency statistics */
|
|
#define FD_MIN_DIMENSIONS 2
|
|
|
|
/*
|
|
* Max number of attributes for functional dependency statistics
|
|
*
|
|
* This number can be set to a larger integer, but this will cause the time consumed by ANALYZE to increase
|
|
* exponentially when computing functional dependency statistics.
|
|
*/
|
|
#define FD_MAX_DIMENSIONS 4
|
|
|
|
|
|
/* Multivariate functional dependencies */
|
|
#define STATS_DEPS_MAGIC 0xB4549A2C /* marks serialized bytea */
|
|
#define STATS_DEPS_TYPE_BASIC 1 /* basic dependencies type */
|
|
|
|
/*
|
|
* Functional dependencies, tracking column-level relationships (values
|
|
* in one column determine values in another one).
|
|
*/
|
|
typedef struct MVDependency {
|
|
double degree; /* degree of validity (0-1) */
|
|
AttrNumber nattributes; /* number of attributes */
|
|
AttrNumber attributes[FLEXIBLE_ARRAY_MEMBER]; /* attribute numbers */
|
|
} MVDependency;
|
|
|
|
typedef struct MVDependencies {
|
|
uint32 magic; /* magic constant marker */
|
|
uint32 type; /* type of MV Dependencies (BASIC) */
|
|
int ndeps; /* number of dependencies */
|
|
MVDependency *deps[FLEXIBLE_ARRAY_MEMBER]; /* dependencies */
|
|
} MVDependencies;
|
|
|
|
/* multi-sort */
|
|
typedef struct MultiSortSupportData {
|
|
int ndims; /* number of dimensions */
|
|
/* sort support data for each dimension: */
|
|
SortSupportData ssup[FLEXIBLE_ARRAY_MEMBER];
|
|
} MultiSortSupportData;
|
|
|
|
typedef MultiSortSupportData *MultiSortSupport;
|
|
|
|
typedef struct SortItem {
|
|
Datum *values; /* value array extracted from a tuple */
|
|
bool *isnull; /* value array extracted from a tuple */
|
|
int count;
|
|
} SortItem;
|
|
|
|
/* a unified representation of the data the statistics is built on */
|
|
typedef struct StatsBuildData {
|
|
int numrows; /* total rows of data being analyzed */
|
|
int nattnums; /* total number of attributes being analyzed */
|
|
AttrNumber *attnums; /* attribute number array being analyzed */
|
|
VacAttrStats *stats; /* statistics for one attribute */
|
|
Datum **values; /* value matrix extracted from relation */
|
|
bool **nulls; /* null matrix extracted from relation */
|
|
} StatsBuildData;
|
|
|
|
extern void analyze_compute_dependencies(Relation onerel, int *slot_idx, const char *tableName,
|
|
AnalyzeSampleTableSpecInfo *spec, VacAttrStats *stats);
|
|
|
|
extern int get_slot_index_dependencies(HeapTuple statstuple, int reqkind);
|
|
extern bool get_attmultistatsslot_dependencies(bool dependencies_flag, HeapTuple statstuple, int reqkind,
|
|
MVDependencies **dependencies);
|
|
|
|
extern Selectivity dependencies_clauselist_selectivity(PlannerInfo *root, const List *clauses, int varRelid,
|
|
JoinType jointype, SpecialJoinInfo *sjinfo,
|
|
const RelOptInfo *rel, Bitmapset **estimatedclauses);
|
|
|
|
extern MVDependencies *statext_dependencies_build(StatsBuildData *data);
|
|
extern bytea *statext_dependencies_serialize(MVDependencies *dependencies);
|
|
extern MVDependencies *statext_dependencies_deserialize(bytea *data);
|
|
|
|
extern MultiSortSupport multi_sort_init(int ndims);
|
|
extern void multi_sort_add_dimension(MultiSortSupport mss, int sortdim, Oid oper, Oid collation);
|
|
extern int multi_sort_compare(const void *arr1, const void *arr2, void *arg);
|
|
extern int multi_sort_compare_dim(int dim, const SortItem *arr1, const SortItem *arr2, MultiSortSupport mss);
|
|
extern int multi_sort_compare_dims(int start, int end, const SortItem *arr1, const SortItem *arr2,
|
|
MultiSortSupport mss);
|
|
extern SortItem *build_sorted_items(const StatsBuildData *data, int *nitems, MultiSortSupport mss, int numattrs,
|
|
const AttrNumber *attnums);
|
|
|
|
#endif /* FUNC_DEPENDENCY_H */
|
|
|
|
#endif /* ENABLE_MULTIPLE_NODES */ |