• T
    Make equal() ignore CoercionForm fields for better planning with casts. · 71e58dcf
    Tom Lane 提交于
    This change ensures that the planner will see implicit and explicit casts
    as equivalent for all purposes, except in the minority of cases where
    there's actually a semantic difference (as reflected by having a 3-argument
    cast function).  In particular, this fixes cases where the EquivalenceClass
    machinery failed to consider two references to a varchar column as
    equivalent if one was implicitly cast to text but the other was explicitly
    cast to text, as seen in bug #7598 from Vaclav Juza.  We have had similar
    bugs before in other parts of the planner, so I think it's time to fix this
    problem at the core instead of continuing to band-aid around it.
    
    Remove set_coercionform_dontcare(), which represents the band-aid
    previously in use for allowing matching of index and constraint expressions
    with inconsistent cast labeling.  (We can probably get rid of
    COERCE_DONTCARE altogether, but I don't think removing that enum value in
    back branches would be wise; it's possible there's third party code
    referring to it.)
    
    Back-patch to 9.2.  We could go back further, and might want to once this
    has been tested more; but for the moment I won't risk destabilizing plan
    choices in long-since-stable branches.
    71e58dcf
primnodes.h 49.5 KB