1/*-------------------------------------------------------------------------
2 *
3 * extended_stats_internal.h
4 * POSTGRES extended statistics internal declarations
5 *
6 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 * IDENTIFICATION
10 * src/include/statistics/extended_stats_internal.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef EXTENDED_STATS_INTERNAL_H
15#define EXTENDED_STATS_INTERNAL_H
16
17#include "utils/sortsupport.h"
18#include "statistics/statistics.h"
19
20
21typedef struct
22{
23 Oid eqopr; /* '=' operator for datatype, if any */
24 Oid eqfunc; /* and associated function */
25 Oid ltopr; /* '<' operator for datatype, if any */
26} StdAnalyzeData;
27
28typedef struct
29{
30 Datum value; /* a data value */
31 int tupno; /* position index for tuple it came from */
32} ScalarItem;
33
34/* (de)serialization info */
35typedef struct DimensionInfo
36{
37 int nvalues; /* number of deduplicated values */
38 int nbytes; /* number of bytes (serialized) */
39 int nbytes_aligned; /* size of deserialized data with alignment */
40 int typlen; /* pg_type.typlen */
41 bool typbyval; /* pg_type.typbyval */
42} DimensionInfo;
43
44/* multi-sort */
45typedef struct MultiSortSupportData
46{
47 int ndims; /* number of dimensions */
48 /* sort support data for each dimension: */
49 SortSupportData ssup[FLEXIBLE_ARRAY_MEMBER];
50} MultiSortSupportData;
51
52typedef MultiSortSupportData *MultiSortSupport;
53
54typedef struct SortItem
55{
56 Datum *values;
57 bool *isnull;
58 int count;
59} SortItem;
60
61extern MVNDistinct *statext_ndistinct_build(double totalrows,
62 int numrows, HeapTuple *rows,
63 Bitmapset *attrs, VacAttrStats **stats);
64extern bytea *statext_ndistinct_serialize(MVNDistinct *ndistinct);
65extern MVNDistinct *statext_ndistinct_deserialize(bytea *data);
66
67extern MVDependencies *statext_dependencies_build(int numrows, HeapTuple *rows,
68 Bitmapset *attrs, VacAttrStats **stats);
69extern bytea *statext_dependencies_serialize(MVDependencies *dependencies);
70extern MVDependencies *statext_dependencies_deserialize(bytea *data);
71
72extern MCVList *statext_mcv_build(int numrows, HeapTuple *rows,
73 Bitmapset *attrs, VacAttrStats **stats,
74 double totalrows);
75extern bytea *statext_mcv_serialize(MCVList *mcv, VacAttrStats **stats);
76extern MCVList *statext_mcv_deserialize(bytea *data);
77
78extern MultiSortSupport multi_sort_init(int ndims);
79extern void multi_sort_add_dimension(MultiSortSupport mss, int sortdim,
80 Oid oper, Oid collation);
81extern int multi_sort_compare(const void *a, const void *b, void *arg);
82extern int multi_sort_compare_dim(int dim, const SortItem *a,
83 const SortItem *b, MultiSortSupport mss);
84extern int multi_sort_compare_dims(int start, int end, const SortItem *a,
85 const SortItem *b, MultiSortSupport mss);
86extern int compare_scalars_simple(const void *a, const void *b, void *arg);
87extern int compare_datums_simple(Datum a, Datum b, SortSupport ssup);
88
89extern void *bsearch_arg(const void *key, const void *base,
90 size_t nmemb, size_t size,
91 int (*compar) (const void *, const void *, void *),
92 void *arg);
93
94extern AttrNumber *build_attnums_array(Bitmapset *attrs, int *numattrs);
95
96extern SortItem *build_sorted_items(int numrows, int *nitems, HeapTuple *rows,
97 TupleDesc tdesc, MultiSortSupport mss,
98 int numattrs, AttrNumber *attnums);
99
100extern bool examine_opclause_expression(OpExpr *expr, Var **varp,
101 Const **cstp, bool *varonleftp);
102
103extern Selectivity mcv_clauselist_selectivity(PlannerInfo *root,
104 StatisticExtInfo *stat,
105 List *clauses,
106 int varRelid,
107 JoinType jointype,
108 SpecialJoinInfo *sjinfo,
109 RelOptInfo *rel,
110 Selectivity *basesel,
111 Selectivity *totalsel);
112
113#endif /* EXTENDED_STATS_INTERNAL_H */
114