• T
    Clean up the loose ends in selectivity estimation left by my patch for semi · d4af2a64
    Tom Lane 提交于
    and anti joins.  To do this, pass the SpecialJoinInfo struct for the current
    join as an additional optional argument to operator join selectivity
    estimation functions.  This allows the estimator to tell not only what kind
    of join is being formed, but which variable is on which side of the join;
    a requirement long recognized but not dealt with till now.  This also leaves
    the door open for future improvements in the estimators, such as accounting
    for the null-insertion effects of lower outer joins.  I didn't do anything
    about that in the current patch but the information is in principle deducible
    from what's passed.
    
    The patch also clarifies the definition of join selectivity for semi/anti
    joins: it's the fraction of the left input that has (at least one) match
    in the right input.  This allows getting rid of some very fuzzy thinking
    that I had committed in the original 7.4-era IN-optimization patch.
    There's probably room to estimate this better than the present patch does,
    but at least we know what to estimate.
    
    Since I had to touch CREATE OPERATOR anyway to allow a variant signature
    for join estimator functions, I took the opportunity to add a couple of
    additional checks that were missing, per my recent message to -hackers:
    * Check that estimator functions return float8;
    * Require execute permission at the time of CREATE OPERATOR on the
    operator's function as well as the estimator functions;
    * Require ownership of any pre-existing operator that's modified by
    the command.
    I also moved the lookup of the functions out of OperatorCreate() and
    into operatorcmds.c, since that seemed more consistent with most of
    the other catalog object creation processes, eg CREATE TYPE.
    d4af2a64
opr_sanity.out 40.6 KB