1 /*-------------------------------------------------------------------------
2  *
3  * statistics.h
4  *	  Extended statistics and selectivity estimation functions.
5  *
6  * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * src/include/statistics/statistics.h
10  *
11  *-------------------------------------------------------------------------
12  */
13 #ifndef STATISTICS_H
14 #define STATISTICS_H
15 
16 #include "commands/vacuum.h"
17 #include "nodes/pathnodes.h"
18 
19 #define STATS_MAX_DIMENSIONS	8	/* max number of attributes */
20 
21 /* Multivariate distinct coefficients */
22 #define STATS_NDISTINCT_MAGIC		0xA352BFA4	/* struct identifier */
23 #define STATS_NDISTINCT_TYPE_BASIC	1	/* struct version */
24 
25 /* MVNDistinctItem represents a single combination of columns */
26 typedef struct MVNDistinctItem
27 {
28 	double		ndistinct;		/* ndistinct value for this combination */
29 	int			nattributes;	/* number of attributes */
30 	AttrNumber *attributes;		/* attribute numbers */
31 } MVNDistinctItem;
32 
33 /* A MVNDistinct object, comprising all possible combinations of columns */
34 typedef struct MVNDistinct
35 {
36 	uint32		magic;			/* magic constant marker */
37 	uint32		type;			/* type of ndistinct (BASIC) */
38 	uint32		nitems;			/* number of items in the statistic */
39 	MVNDistinctItem items[FLEXIBLE_ARRAY_MEMBER];
40 } MVNDistinct;
41 
42 /* Multivariate functional dependencies */
43 #define STATS_DEPS_MAGIC		0xB4549A2C	/* marks serialized bytea */
44 #define STATS_DEPS_TYPE_BASIC	1	/* basic dependencies type */
45 
46 /*
47  * Functional dependencies, tracking column-level relationships (values
48  * in one column determine values in another one).
49  */
50 typedef struct MVDependency
51 {
52 	double		degree;			/* degree of validity (0-1) */
53 	AttrNumber	nattributes;	/* number of attributes */
54 	AttrNumber	attributes[FLEXIBLE_ARRAY_MEMBER];	/* attribute numbers */
55 } MVDependency;
56 
57 typedef struct MVDependencies
58 {
59 	uint32		magic;			/* magic constant marker */
60 	uint32		type;			/* type of MV Dependencies (BASIC) */
61 	uint32		ndeps;			/* number of dependencies */
62 	MVDependency *deps[FLEXIBLE_ARRAY_MEMBER];	/* dependencies */
63 } MVDependencies;
64 
65 /* used to flag stats serialized to bytea */
66 #define STATS_MCV_MAGIC			0xE1A651C2	/* marks serialized bytea */
67 #define STATS_MCV_TYPE_BASIC	1	/* basic MCV list type */
68 
69 /* max items in MCV list (should be equal to max default_statistics_target) */
70 #define STATS_MCVLIST_MAX_ITEMS        10000
71 
72 /*
73  * Multivariate MCV (most-common value) lists
74  *
75  * A straightforward extension of MCV items - i.e. a list (array) of
76  * combinations of attribute values, together with a frequency and null flags.
77  */
78 typedef struct MCVItem
79 {
80 	double		frequency;		/* frequency of this combination */
81 	double		base_frequency; /* frequency if independent */
82 	bool	   *isnull;			/* NULL flags */
83 	Datum	   *values;			/* item values */
84 } MCVItem;
85 
86 /* multivariate MCV list - essentially an array of MCV items */
87 typedef struct MCVList
88 {
89 	uint32		magic;			/* magic constant marker */
90 	uint32		type;			/* type of MCV list (BASIC) */
91 	uint32		nitems;			/* number of MCV items in the array */
92 	AttrNumber	ndimensions;	/* number of dimensions */
93 	Oid			types[STATS_MAX_DIMENSIONS];	/* OIDs of data types */
94 	MCVItem		items[FLEXIBLE_ARRAY_MEMBER];	/* array of MCV items */
95 } MCVList;
96 
97 extern MVNDistinct *statext_ndistinct_load(Oid mvoid);
98 extern MVDependencies *statext_dependencies_load(Oid mvoid);
99 extern MCVList *statext_mcv_load(Oid mvoid);
100 
101 extern void BuildRelationExtStatistics(Relation onerel, double totalrows,
102 									   int numrows, HeapTuple *rows,
103 									   int natts, VacAttrStats **vacattrstats);
104 extern int	ComputeExtStatisticsRows(Relation onerel,
105 									 int natts, VacAttrStats **stats);
106 extern bool statext_is_kind_built(HeapTuple htup, char kind);
107 extern Selectivity dependencies_clauselist_selectivity(PlannerInfo *root,
108 													   List *clauses,
109 													   int varRelid,
110 													   JoinType jointype,
111 													   SpecialJoinInfo *sjinfo,
112 													   RelOptInfo *rel,
113 													   Bitmapset **estimatedclauses);
114 extern Selectivity statext_clauselist_selectivity(PlannerInfo *root,
115 												  List *clauses,
116 												  int varRelid,
117 												  JoinType jointype,
118 												  SpecialJoinInfo *sjinfo,
119 												  RelOptInfo *rel,
120 												  Bitmapset **estimatedclauses,
121 												  bool is_or);
122 extern bool has_stats_of_kind(List *stats, char requiredkind);
123 extern StatisticExtInfo *choose_best_statistics(List *stats, char requiredkind,
124 												Bitmapset **clause_attnums,
125 												List **clause_exprs,
126 												int nclauses);
127 extern HeapTuple statext_expressions_load(Oid stxoid, int idx);
128 
129 #endif							/* STATISTICS_H */
130