Skip to content
Snippets Groups Projects
  • Tom Lane's avatar
    71e58dcf
    Make equal() ignore CoercionForm fields for better planning with casts. · 71e58dcf
    Tom Lane authored
    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
    History
    Make equal() ignore CoercionForm fields for better planning with casts.
    Tom Lane authored
    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.