42#define SizeOfHeader (3 * sizeof(uint32))
45#define SizeOfItem(natts) \
46 (sizeof(double) + sizeof(int) + (natts) * sizeof(AttrNumber))
49#define MinSizeOfItem SizeOfItem(2)
52#define MinSizeOfItems(nitems) \
53 (SizeOfHeader + (nitems) * MinSizeOfItem)
117 for (
j = 0;
j < k;
j++)
155 elog(
ERROR,
"cache lookup failed for statistics object %u",
mvoid);
161 "requested statistics kind \"%c\" is not yet built for statistics object %u",
226 memcpy(tmp, &nmembers,
sizeof(
int));
260 elog(
ERROR,
"invalid MVNDistinct size %zu (expected at least %zu)",
275 elog(
ERROR,
"invalid ndistinct magic %08x (expected %08x)",
278 elog(
ERROR,
"invalid ndistinct type %d (expected %d)",
280 if (
ndist.nitems == 0)
281 elog(
ERROR,
"invalid zero-length item array in MVNDistinct");
286 elog(
ERROR,
"invalid MVNDistinct size %zu (expected at least %zu)",
334 for (
int i = 0;
i < ndistinct->
nitems;
i++)
359 for (
int i = 0;
i < ndistinct->
nitems;
i++)
375 for (
int k = 0; k <
stxkeys->dim1; k++)
394 errmsg(
"could not validate \"%s\" object: invalid attribute number %d found",
395 "pg_ndistinct",
attnum)));
428 int numrows =
data->numrows;
442 for (
i = 0;
i < numrows;
i++)
445 items[
i].isnull = &isnull[
i * k];
455 for (
i = 0;
i < k;
i++)
467 elog(
ERROR,
"cache lookup failed for ordering operator for type %u",
474 for (
j = 0;
j < numrows;
j++)
490 for (
i = 1;
i < numrows;
i++)
526 if (ndistinct < (
double) d)
527 ndistinct = (
double) d;
532 return floor(ndistinct + 0.5);
546 Assert((k > 0) && (n >= k));
552 for (d = 1; d <= k; ++d)
568 return (1 << n) - (n + 1);
584 Assert((n >= k) && (k > 0));
673 current,
state->k *
sizeof(
int));
#define AttributeNumberIsValid(attributeNumber)
static Datum values[MAXATTR]
#define Assert(condition)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
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)
#define palloc_object(type)
#define palloc_array(type, count)
#define palloc0_array(type, count)
#define DatumGetByteaPP(X)
#define HeapTupleIsValid(tuple)
void pfree(void *pointer)
void * palloc0(Size size)
static int n_choose_k(int n, int k)
void statext_ndistinct_free(MVNDistinct *ndistinct)
static double estimate_ndistinct(double totalrows, int numrows, int d, int f1)
static void generate_combinations_recurse(CombinationGenerator *state, int index, int start, int *current)
MVNDistinct * statext_ndistinct_deserialize(bytea *data)
static double ndistinct_for_combination(double totalrows, StatsBuildData *data, int k, int *combination)
bytea * statext_ndistinct_serialize(MVNDistinct *ndistinct)
static void generate_combinations(CombinationGenerator *state)
MVNDistinct * statext_ndistinct_load(Oid mvoid, bool inh)
static int num_combinations(int n)
MVNDistinct * statext_ndistinct_build(double totalrows, StatsBuildData *data)
#define SizeOfItem(natts)
static void generator_free(CombinationGenerator *state)
static CombinationGenerator * generator_init(int n, int k)
#define MinSizeOfItems(nitems)
bool statext_ndistinct_validate(const MVNDistinct *ndistinct, const int2vector *stxkeys, int numexprs, int elevel)
static int * generator_next(CombinationGenerator *state)
void qsort_interruptible(void *base, size_t nel, size_t elsize, qsort_arg_comparator cmp, void *arg)
static Datum BoolGetDatum(bool X)
static Datum ObjectIdGetDatum(Oid X)
#define STATS_NDISTINCT_MAGIC
#define STATS_NDISTINCT_TYPE_BASIC
#define STATS_MAX_DIMENSIONS
MVNDistinctItem items[FLEXIBLE_ARRAY_MEMBER]
void ReleaseSysCache(HeapTuple tuple)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
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)