This function should return an estimation of the number of rows returned by a query involving an overlap check ( it's the restrict function for the && operator )
It can make use (if available) of the statistics collected by the geometry analyzer function.
2067{
2068 VariableStatData vardata;
2069 Node *other = NULL;
2070 bool varonleft;
2072
2074 float8 selectivity = 0;
2075 Const *otherConst;
2076
2077 POSTGIS_DEBUGF(2, "%s: entered function", __func__);
2078
2079 if (!get_restriction_variable(root, args, varRelid, &vardata, &other, &varonleft))
2080 {
2081 POSTGIS_DEBUGF(2, "%s: could not find vardata", __func__);
2083 }
2084
2085 if (!IsA(other, Const))
2086 {
2087 ReleaseVariableStats(vardata);
2088 POSTGIS_DEBUGF(2,
"%s: no constant argument, returning default selectivity %g", __func__,
DEFAULT_ND_SEL);
2090 }
2091
2092 otherConst = (Const*)other;
2093 if ((!otherConst) || otherConst->constisnull)
2094 {
2095 ReleaseVariableStats(vardata);
2096 POSTGIS_DEBUGF(2, "%s: constant argument is NULL", __func__);
2098 }
2099
2101 {
2102 ReleaseVariableStats(vardata);
2103 POSTGIS_DEBUGF(2, "%s: search box is EMPTY", __func__);
2104 return 0.0;
2105 }
2106
2107 if (!vardata.statsTuple)
2108 {
2109 POSTGIS_DEBUGF(1, "%s: no statistics available on table. Empty? Need to ANALYZE?", __func__);
2111 }
2112
2114 ReleaseVariableStats(vardata);
2116 if (nd_stats)
2117 pfree(nd_stats);
2118
2119 return selectivity;
2120}
static float8 estimate_selectivity(const GBOX *box, const ND_STATS *nd_stats, int mode)
This function returns an estimate of the selectivity of a search GBOX by looking at data in the ND_ST...
#define DEFAULT_ND_SEL
Default geometry selectivity factor.
static ND_STATS * pg_nd_stats_from_tuple(HeapTuple stats_tuple, int mode)
int gserialized_datum_get_gbox_p(Datum gsdatum, GBOX *gbox)
Given a GSERIALIZED datum, as quickly as possible (peaking into the top of the memory) return the gbo...