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 21 typedef 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 28 typedef 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 */ 35 typedef 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 */ 45 typedef 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 52 typedef MultiSortSupportData *MultiSortSupport; 53 54 typedef struct SortItem 55 { 56 Datum *values; 57 bool *isnull; 58 int count; 59 } SortItem; 60 61 extern MVNDistinct *statext_ndistinct_build(double totalrows, 62 int numrows, HeapTuple *rows, 63 Bitmapset *attrs, VacAttrStats **stats); 64 extern bytea *statext_ndistinct_serialize(MVNDistinct *ndistinct); 65 extern MVNDistinct *statext_ndistinct_deserialize(bytea *data); 66 67 extern MVDependencies *statext_dependencies_build(int numrows, HeapTuple *rows, 68 Bitmapset *attrs, VacAttrStats **stats); 69 extern bytea *statext_dependencies_serialize(MVDependencies *dependencies); 70 extern MVDependencies *statext_dependencies_deserialize(bytea *data); 71 72 extern MCVList *statext_mcv_build(int numrows, HeapTuple *rows, 73 Bitmapset *attrs, VacAttrStats **stats, 74 double totalrows); 75 extern bytea *statext_mcv_serialize(MCVList *mcv, VacAttrStats **stats); 76 extern MCVList *statext_mcv_deserialize(bytea *data); 77 78 extern MultiSortSupport multi_sort_init(int ndims); 79 extern void multi_sort_add_dimension(MultiSortSupport mss, int sortdim, 80 Oid oper, Oid collation); 81 extern int multi_sort_compare(const void *a, const void *b, void *arg); 82 extern int multi_sort_compare_dim(int dim, const SortItem *a, 83 const SortItem *b, MultiSortSupport mss); 84 extern int multi_sort_compare_dims(int start, int end, const SortItem *a, 85 const SortItem *b, MultiSortSupport mss); 86 extern int compare_scalars_simple(const void *a, const void *b, void *arg); 87 extern int compare_datums_simple(Datum a, Datum b, SortSupport ssup); 88 89 extern 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 94 extern AttrNumber *build_attnums_array(Bitmapset *attrs, int *numattrs); 95 96 extern SortItem *build_sorted_items(int numrows, int *nitems, HeapTuple *rows, 97 TupleDesc tdesc, MultiSortSupport mss, 98 int numattrs, AttrNumber *attnums); 99 100 extern bool examine_opclause_expression(OpExpr *expr, Var **varp, 101 Const **cstp, bool *varonleftp); 102 103 extern 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