MCPcopy Create free account
hub / github.com/apache/cloudberry / calc_arraycontsel

Function calc_arraycontsel

src/backend/utils/adt/array_selfuncs.c:337–419  ·  view source on GitHub ↗

* Calculate selectivity for "arraycolumn @> const", "arraycolumn && const" * or "arraycolumn <@ const" based on the statistics * * This function is mainly responsible for extracting the pg_statistic data * to be used; we then pass the problem on to mcelem_array_selec(). */

Source from the content-addressed store, hash-verified

335 * to be used; we then pass the problem on to mcelem_array_selec().
336 */
337static Selectivity
338calc_arraycontsel(VariableStatData *vardata, Datum constval,
339 Oid elemtype, Oid operator)
340{
341 Selectivity selec;
342 TypeCacheEntry *typentry;
343 FmgrInfo *cmpfunc;
344 ArrayType *array;
345
346 /* Get element type's default comparison function */
347 typentry = lookup_type_cache(elemtype, TYPECACHE_CMP_PROC_FINFO);
348 if (!OidIsValid(typentry->cmp_proc_finfo.fn_oid))
349 return DEFAULT_SEL(operator);
350 cmpfunc = &typentry->cmp_proc_finfo;
351
352 /*
353 * The caller made sure the const is an array with same element type, so
354 * get it now
355 */
356 array = DatumGetArrayTypeP(constval);
357
358 if (HeapTupleIsValid(vardata->statsTuple) &&
359 statistic_proc_security_check(vardata, cmpfunc->fn_oid))
360 {
361 Form_pg_statistic stats;
362 AttStatsSlot sslot;
363 AttStatsSlot hslot;
364
365 stats = (Form_pg_statistic) GETSTRUCT(vardata->statsTuple);
366
367 /* MCELEM will be an array of same type as column */
368 if (get_attstatsslot(&sslot, vardata->statsTuple,
369 STATISTIC_KIND_MCELEM, InvalidOid,
370 ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS))
371 {
372 /*
373 * For "array <@ const" case we also need histogram of distinct
374 * element counts.
375 */
376 if (operator != OID_ARRAY_CONTAINED_OP ||
377 !get_attstatsslot(&hslot, vardata->statsTuple,
378 STATISTIC_KIND_DECHIST, InvalidOid,
379 ATTSTATSSLOT_NUMBERS))
380 memset(&hslot, 0, sizeof(hslot));
381
382 /* Use the most-common-elements slot for the array Var. */
383 selec = mcelem_array_selec(array, typentry,
384 sslot.values, sslot.nvalues,
385 sslot.numbers, sslot.nnumbers,
386 hslot.numbers, hslot.nnumbers,
387 operator);
388
389 free_attstatsslot(&hslot);
390 free_attstatsslot(&sslot);
391 }
392 else
393 {
394 /* No most-common-elements info, so do without */

Callers 1

arraycontselFunction · 0.85

Calls 6

lookup_type_cacheFunction · 0.85
get_attstatsslotFunction · 0.85
mcelem_array_selecFunction · 0.85
free_attstatsslotFunction · 0.85
pfreeFunction · 0.50

Tested by

no test coverage detected