27#include "utils/fmgrprotos.h"
51#define ITEM_SIZE(ndims) \
52 ((ndims) * (sizeof(uint16) + sizeof(bool)) + 2 * sizeof(double))
57#define MinSizeOfMCVList \
58 (VARHDRSZ + sizeof(uint32) * 3 + sizeof(AttrNumber))
66#define SizeOfMCVList(ndims,nitems) \
67 ((MinSizeOfMCVList + sizeof(Oid) * (ndims)) + \
68 ((ndims) * sizeof(DimensionInfo)) + \
69 ((nitems) * ITEM_SIZE(ndims)))
86#define RESULT_MERGE(value, is_or, match) \
87 ((is_or) ? ((value) || (match)) : ((value) && (match)))
98#define RESULT_IS_FINAL(value, is_or) ((is_or) ? (value) : (!(value)))
148 double n = samplerows;
154 denom = N - n + 0.04 * n * (N - 1);
203 numrows =
data->numrows;
361 elog(
ERROR,
"cache lookup failed for ordering operator for type %u",
383 for (
i = 1;
i < numrows;
i++)
406 if (
ia->count ==
ib->count)
408 else if (
ia->count >
ib->count)
435 for (
i = 1;
i < numrows;
i++)
470 ib->values[0],
ib->isnull[0],
507 for (dim = 0; dim <
mss->ndims; dim++)
542 result[dim][
ncounts[dim]] = result[dim][
i];
565 elog(
ERROR,
"cache lookup failed for statistics object %u",
mvoid);
572 "requested statistics kind \"%c\" is not yet built for statistics object %u",
623 int ndims =
mcvlist->ndimensions;
653 for (dim = 0; dim < ndims; dim++)
683 if (counts[dim] == 0)
703 for (
i = 1;
i < counts[dim];
i++)
727 if (info[dim].typbyval)
737 else if (info[dim].typlen > 0)
751 else if (info[dim].typlen == -1)
779 else if (info[dim].typlen == -2)
805 Assert(info[dim].nbytes > 0);
815 + (ndims *
sizeof(
Oid));
821 for (
i = 0;
i < ndims;
i++)
854 ptr += (
sizeof(
Oid) * ndims);
861 for (dim = 0; dim < ndims; dim++)
870 if (info[dim].typbyval)
885 memcpy(ptr, &tmp, info[dim].typlen);
888 else if (info[dim].typlen > 0)
894 else if (info[dim].typlen == -1)
906 else if (info[dim].typlen == -2)
937 ptr +=
sizeof(
bool) * ndims;
946 for (dim = 0; dim < ndims; dim++)
1029 elog(
ERROR,
"invalid MCV size %zu (expected at least %zu)",
1054 elog(
ERROR,
"invalid MCV magic %u (expected %u)",
1058 elog(
ERROR,
"invalid MCV type %u (expected %u)",
1061 if (
mcvlist->ndimensions == 0)
1062 elog(
ERROR,
"invalid zero-length dimension array in MCVList");
1065 elog(
ERROR,
"invalid length (%d) dimension array in MCVList",
1069 elog(
ERROR,
"invalid zero-length item array in MCVList");
1071 elog(
ERROR,
"invalid length (%u) item array in MCVList",
1090 elog(
ERROR,
"invalid MCV size %zu (expected %zu)",
1095 ptr += (
sizeof(
Oid) * ndims);
1104 for (dim = 0; dim < ndims; dim++)
1110 Assert(info[dim].nvalues >= 0);
1111 Assert(info[dim].nbytes >= 0);
1122 elog(
ERROR,
"invalid MCV size %zu (expected %zu)",
1137 for (dim = 0; dim < ndims; dim++)
1179 for (dim = 0; dim < ndims; dim++)
1184 if (info[dim].typbyval)
1191 memcpy(&v, ptr, info[dim].typlen);
1194 map[dim][
i] =
fetch_att(&v,
true, info[dim].typlen);
1205 if (info[dim].typlen > 0)
1209 memcpy(dataptr, ptr, info[dim].typlen);
1214 dataptr +=
MAXALIGN(info[dim].typlen);
1217 else if (info[dim].typlen == -1)
1240 else if (info[dim].typlen == -2)
1281 item->
isnull = (
bool *) isnullptr;
1282 isnullptr +=
MAXALIGN(
sizeof(
bool) * ndims);
1285 ptr +=
sizeof(
bool) * ndims;
1294 for (dim = 0; dim < ndims; dim++)
1315 for (dim = 0; dim < ndims; dim++)
1366 errmsg(
"function returning record called in context "
1367 "that cannot accept type record")));
1447 memset(nulls, 0,
sizeof(nulls));
1478 errmsg(
"cannot accept a value of type %s",
"pg_mcv_list")));
1509 errmsg(
"cannot accept a value of type %s",
"pg_mcv_list")));
1543 *
collid = var->varcollid;
1548 elog(
ERROR,
"variable not found in statistics object");
1571 elog(
ERROR,
"expression not found in statistics object");
1743 if (!
cst->constisnull)
1751 &elem_values, &elem_nulls, &num_elems);
1765 bool match = !expr->
useOr;
1787 for (
j = 0;
j < num_elems;
j++)
1842 match = (item->
isnull[
idx]) ?
true : match;
1846 match = (!item->
isnull[
idx]) ?
true : match;
1910 else if (
IsA(clause,
Var))
1914 Var *var = (
Var *) (clause);
2047 List *clauses,
int varRelid,
2139 stat->exprs, mcv,
false);
Datum idx(PG_FUNCTION_ARGS)
#define DatumGetArrayTypeP(X)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
void deconstruct_array(const ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
int bms_num_members(const Bitmapset *a)
int bms_member_index(Bitmapset *a, int x)
static Datum values[MAXATTR]
Datum byteaout(PG_FUNCTION_ARGS)
Datum byteasend(PG_FUNCTION_ARGS)
#define PG_USED_FOR_ASSERTS_ONLY
#define Assert(condition)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
bool equal(const void *a, const void *b)
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
AttInMetadata * TupleDescGetAttInMetadata(TupleDesc tupdesc)
int compare_scalars_simple(const void *a, const void *b, void *arg)
int compare_datums_simple(Datum a, Datum b, SortSupport ssup)
SortItem * build_sorted_items(StatsBuildData *data, int *nitems, MultiSortSupport mss, int numattrs, AttrNumber *attnums)
int multi_sort_compare(const void *a, const void *b, void *arg)
MultiSortSupport multi_sort_init(int ndims)
void multi_sort_add_dimension(MultiSortSupport mss, int sortdim, Oid oper, Oid collation)
bool examine_opclause_args(List *args, Node **exprp, Const **cstp, bool *expronleftp)
MultiSortSupportData * MultiSortSupport
#define palloc_array(type, count)
#define palloc0_array(type, count)
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
void fmgr_info(Oid functionId, FmgrInfo *finfo)
#define PG_DETOAST_DATUM(datum)
#define FunctionCall1(flinfo, arg1)
#define PG_GETARG_BYTEA_P(n)
#define DatumGetByteaP(X)
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
#define SRF_IS_FIRSTCALL()
#define SRF_PERCALL_SETUP()
#define SRF_RETURN_NEXT(_funcctx, _result)
#define SRF_FIRSTCALL_INIT()
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
#define SRF_RETURN_DONE(_funcctx)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
#define HeapTupleIsValid(tuple)
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, char *typalign)
RegProcedure get_opcode(Oid opno)
void statext_mcv_free(MCVList *mcvlist)
Datum pg_stats_ext_mcvlist_items(PG_FUNCTION_ARGS)
Datum pg_mcv_list_in(PG_FUNCTION_ARGS)
MCVList * statext_mcv_deserialize(bytea *data)
Selectivity mcv_clauselist_selectivity(PlannerInfo *root, StatisticExtInfo *stat, List *clauses, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo, RelOptInfo *rel, Selectivity *basesel, Selectivity *totalsel)
static MultiSortSupport build_mss(StatsBuildData *data)
static int compare_sort_item_count(const void *a, const void *b, void *arg)
MCVList * statext_mcv_load(Oid mvoid, bool inh)
Datum pg_mcv_list_out(PG_FUNCTION_ARGS)
static int count_distinct_groups(int numrows, SortItem *items, MultiSortSupport mss)
Datum pg_mcv_list_send(PG_FUNCTION_ARGS)
#define SizeOfMCVList(ndims, nitems)
static bool * mcv_get_match_bitmap(PlannerInfo *root, List *clauses, Bitmapset *keys, List *exprs, MCVList *mcvlist, bool is_or)
#define RESULT_MERGE(value, is_or, match)
static double get_mincount_for_mcv_list(int samplerows, double totalrows)
Selectivity mcv_combine_selectivities(Selectivity simple_sel, Selectivity mcv_sel, Selectivity mcv_basesel, Selectivity mcv_totalsel)
Selectivity mcv_clause_selectivity_or(PlannerInfo *root, StatisticExtInfo *stat, MCVList *mcv, Node *clause, bool **or_matches, Selectivity *basesel, Selectivity *overlap_mcvsel, Selectivity *overlap_basesel, Selectivity *totalsel)
#define RESULT_IS_FINAL(value, is_or)
static int mcv_match_expression(Node *expr, Bitmapset *keys, List *exprs, Oid *collid)
MCVList * statext_mcv_build(StatsBuildData *data, double totalrows, int stattarget)
Datum pg_mcv_list_recv(PG_FUNCTION_ARGS)
static int sort_item_compare(const void *a, const void *b, void *arg)
static SortItem ** build_column_frequencies(SortItem *groups, int ngroups, MultiSortSupport mss, int *ncounts)
bytea * statext_mcv_serialize(MCVList *mcvlist, VacAttrStats **stats)
static SortItem * build_distinct_groups(int numrows, SortItem *items, MultiSortSupport mss, int *ndistinct)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
Oid exprCollation(const Node *expr)
static bool is_andclause(const void *clause)
static bool is_orclause(const void *clause)
static bool is_opclause(const void *clause)
static bool is_notclause(const void *clause)
#define IsA(nodeptr, _type_)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static int list_length(const List *l)
void * bsearch_arg(const void *key, const void *base0, size_t nmemb, size_t size, int(*compar)(const void *, const void *, void *), void *arg)
void qsort_interruptible(void *base, size_t nel, size_t elsize, qsort_arg_comparator cmp, void *arg)
static bool DatumGetBool(Datum X)
static Datum PointerGetDatum(const void *X)
static Datum BoolGetDatum(bool X)
static Datum ObjectIdGetDatum(Oid X)
static char * DatumGetCString(Datum X)
static Pointer DatumGetPointer(Datum X)
static Datum Float8GetDatum(float8 X)
static Datum Int32GetDatum(int32 X)
#define CLAMP_PROBABILITY(p)
void PrepareSortSupportFromOrderingOp(Oid orderingOp, SortSupport ssup)
struct SortSupportData * SortSupport
static int ApplySortComparator(Datum datum1, bool isNull1, Datum datum2, bool isNull2, SortSupport ssup)
#define STATS_MCV_TYPE_BASIC
#define STATS_MCVLIST_MAX_ITEMS
#define STATS_MAX_DIMENSIONS
MCVItem items[FLEXIBLE_ARRAY_MEMBER]
SortSupportData ssup[FLEXIBLE_ARRAY_MEMBER]
NullTestType nulltesttype
void ReleaseSysCache(HeapTuple tuple)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
static Datum fetch_att(const void *T, bool attbyval, int attlen)
static void store_att_byval(void *T, Datum newdatum, int attlen)
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
static Size VARSIZE_ANY(const void *PTR)
static Size VARSIZE_ANY_EXHDR(const void *PTR)
static char * VARDATA(const void *PTR)
static char * VARDATA_ANY(const void *PTR)
static void SET_VARSIZE(void *PTR, Size len)
text * cstring_to_text(const char *s)