Files
openGauss-server/src/include/optimizer/func_dependency.h
2022-09-03 16:22:35 +08:00

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 */