PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ gserialized_joinsel_internal()

float8 gserialized_joinsel_internal ( PlannerInfo *  root,
List *  args,
JoinType  jointype,
int  mode 
)

Definition at line 1269 of file gserialized_estimate.c.

1270 {
1271  float8 selectivity;
1272  Oid relid1, relid2;
1273  ND_STATS *stats1, *stats2;
1274  Node *arg1 = (Node*) linitial(args);
1275  Node *arg2 = (Node*) lsecond(args);
1276  Var *var1 = (Var*) arg1;
1277  Var *var2 = (Var*) arg2;
1278 
1279  POSTGIS_DEBUGF(2, "%s: entered function", __func__);
1280 
1281  /* We only do column joins right now, no functional joins */
1282  /* TODO: handle g1 && ST_Expand(g2) */
1283  if (!IsA(arg1, Var) || !IsA(arg2, Var))
1284  {
1285  POSTGIS_DEBUGF(1, "%s called with arguments that are not column references", __func__);
1286  return DEFAULT_ND_JOINSEL;
1287  }
1288 
1289  /* What are the Oids of our tables/relations? */
1290  relid1 = rt_fetch(var1->varno, root->parse->rtable)->relid;
1291  relid2 = rt_fetch(var2->varno, root->parse->rtable)->relid;
1292 
1293  /* Pull the stats from the stats system. */
1294  stats1 = pg_get_nd_stats(relid1, var1->varattno, mode, false);
1295  stats2 = pg_get_nd_stats(relid2, var2->varattno, mode, false);
1296 
1297  /* If we can't get stats, we have to stop here! */
1298  if (!stats1)
1299  {
1300  POSTGIS_DEBUGF(2, "%s: cannot find stats for \"%s\"", __func__, get_rel_name(relid2) ? get_rel_name(relid2) : "NULL");
1301  return DEFAULT_ND_JOINSEL;
1302  }
1303  else if (!stats2)
1304  {
1305  POSTGIS_DEBUGF(2, "%s: cannot find stats for \"%s\"", __func__, get_rel_name(relid2) ? get_rel_name(relid2) : "NULL");
1306  return DEFAULT_ND_JOINSEL;
1307  }
1308 
1309  selectivity = estimate_join_selectivity(stats1, stats2);
1310  POSTGIS_DEBUGF(2, "got selectivity %g", selectivity);
1311  pfree(stats1);
1312  pfree(stats2);
1313  return selectivity;
1314 }
static ND_STATS * pg_get_nd_stats(const Oid table_oid, AttrNumber att_num, int mode, bool only_parent)
Pull the stats object from the PgSQL system catalogs.
#define DEFAULT_ND_JOINSEL
static float8 estimate_join_selectivity(const ND_STATS *s1, const ND_STATS *s2)
Given two statistics histograms, what is the selectivity of a join driven by the && or &&& operator?
args
Definition: ovdump.py:45
N-dimensional statistics structure.

References ovdump::args, DEFAULT_ND_JOINSEL, estimate_join_selectivity(), and pg_get_nd_stats().

Referenced by gserialized_gist_joinsel(), and postgis_index_supportfn().

Here is the call graph for this function:
Here is the caller graph for this function: