1126{
1127 float8 selectivity;
1128 Oid relid1, relid2;
1130 Node *arg1 = (Node*) linitial(args);
1131 Node *arg2 = (Node*) lsecond(args);
1132 Var *var1 = (Var*) arg1;
1133 Var *var2 = (Var*) arg2;
1134
1135 POSTGIS_DEBUGF(2, "%s: entered function", __func__);
1136
1137
1138
1139 if (!IsA(arg1, Var) || !IsA(arg2, Var))
1140 {
1141 POSTGIS_DEBUGF(1, "%s called with arguments that are not column references", __func__);
1143 }
1144
1145
1146 relid1 = rt_fetch(var1->varno, root->parse->rtable)->relid;
1147 relid2 = rt_fetch(var2->varno, root->parse->rtable)->relid;
1148
1149
1152
1153
1154 if (!stats1)
1155 {
1156 POSTGIS_DEBUGF(2, "%s: cannot find stats for \"%s\"", __func__, get_rel_name(relid2) ? get_rel_name(relid2) : "NULL");
1158 }
1159 else if (!stats2)
1160 {
1161 POSTGIS_DEBUGF(2, "%s: cannot find stats for \"%s\"", __func__, get_rel_name(relid2) ? get_rel_name(relid2) : "NULL");
1163 }
1164
1166 POSTGIS_DEBUGF(2, "got selectivity %g", selectivity);
1167 pfree(stats1);
1168 pfree(stats2);
1169 return selectivity;
1170}
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?