1 /*------------------------------------------------------------------------- 2 * 3 * extended_stats_internal.h 4 * POSTGRES extended statistics internal declarations 5 * 6 * Portions Copyright (c) 1996-2021, 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 "statistics/statistics.h" 18 #include "utils/sortsupport.h" 19 20 typedef struct 21 { 22 Oid eqopr; /* '=' operator for datatype, if any */ 23 Oid eqfunc; /* and associated function */ 24 Oid ltopr; /* '<' operator for datatype, if any */ 25 } StdAnalyzeData; 26 27 typedef struct 28 { 29 Datum value; /* a data value */ 30 int tupno; /* position index for tuple it came from */ 31 } ScalarItem; 32 33 /* (de)serialization info */ 34 typedef struct DimensionInfo 35 { 36 int nvalues; /* number of deduplicated values */ 37 int nbytes; /* number of bytes (serialized) */ 38 int nbytes_aligned; /* size of deserialized data with alignment */ 39 int typlen; /* pg_type.typlen */ 40 bool typbyval; /* pg_type.typbyval */ 41 } DimensionInfo; 42 43 /* multi-sort */ 44 typedef struct MultiSortSupportData 45 { 46 int ndims; /* number of dimensions */ 47 /* sort support data for each dimension: */ 48 SortSupportData ssup[FLEXIBLE_ARRAY_MEMBER]; 49 } MultiSortSupportData; 50 51 typedef MultiSortSupportData *MultiSortSupport; 52 53 typedef struct SortItem 54 { 55 Datum *values; 56 bool *isnull; 57 int count; 58 } SortItem; 59 60 /* a unified representation of the data the statistics is built on */ 61 typedef struct StatsBuildData 62 { 63 int numrows; 64 int nattnums; 65 AttrNumber *attnums; 66 VacAttrStats **stats; 67 Datum **values; 68 bool **nulls; 69 } StatsBuildData; 70 71 72 extern MVNDistinct *statext_ndistinct_build(double totalrows, StatsBuildData *data); 73 extern bytea *statext_ndistinct_serialize(MVNDistinct *ndistinct); 74 extern MVNDistinct *statext_ndistinct_deserialize(bytea *data); 75 76 extern MVDependencies *statext_dependencies_build(StatsBuildData *data); 77 extern bytea *statext_dependencies_serialize(MVDependencies *dependencies); 78 extern MVDependencies *statext_dependencies_deserialize(bytea *data); 79 80 extern MCVList *statext_mcv_build(StatsBuildData *data, 81 double totalrows, int stattarget); 82 extern bytea *statext_mcv_serialize(MCVList *mcv, VacAttrStats **stats); 83 extern MCVList *statext_mcv_deserialize(bytea *data); 84 85 extern MultiSortSupport multi_sort_init(int ndims); 86 extern void multi_sort_add_dimension(MultiSortSupport mss, int sortdim, 87 Oid oper, Oid collation); 88 extern int multi_sort_compare(const void *a, const void *b, void *arg); 89 extern int multi_sort_compare_dim(int dim, const SortItem *a, 90 const SortItem *b, MultiSortSupport mss); 91 extern int multi_sort_compare_dims(int start, int end, const SortItem *a, 92 const SortItem *b, MultiSortSupport mss); 93 extern int compare_scalars_simple(const void *a, const void *b, void *arg); 94 extern int compare_datums_simple(Datum a, Datum b, SortSupport ssup); 95 96 extern AttrNumber *build_attnums_array(Bitmapset *attrs, int nexprs, int *numattrs); 97 98 extern SortItem *build_sorted_items(StatsBuildData *data, int *nitems, 99 MultiSortSupport mss, 100 int numattrs, AttrNumber *attnums); 101 102 extern bool examine_opclause_args(List *args, Node **exprp, 103 Const **cstp, bool *expronleftp); 104 105 extern Selectivity mcv_combine_selectivities(Selectivity simple_sel, 106 Selectivity mcv_sel, 107 Selectivity mcv_basesel, 108 Selectivity mcv_totalsel); 109 110 extern Selectivity mcv_clauselist_selectivity(PlannerInfo *root, 111 StatisticExtInfo *stat, 112 List *clauses, 113 int varRelid, 114 JoinType jointype, 115 SpecialJoinInfo *sjinfo, 116 RelOptInfo *rel, 117 Selectivity *basesel, 118 Selectivity *totalsel); 119 120 extern Selectivity mcv_clause_selectivity_or(PlannerInfo *root, 121 StatisticExtInfo *stat, 122 MCVList *mcv, 123 Node *clause, 124 bool **or_matches, 125 Selectivity *basesel, 126 Selectivity *overlap_mcvsel, 127 Selectivity *overlap_basesel, 128 Selectivity *totalsel); 129 130 #endif /* EXTENDED_STATS_INTERNAL_H */ 131