• Tom Lane's avatar
    Improve handling of collations in contrib/postgres_fdw. · 76f965ff
    Tom Lane authored
    If we have a local Var of say varchar type with default collation, and
    we apply a RelabelType to convert that to text with default collation, we
    don't want to consider that as creating an FDW_COLLATE_UNSAFE situation.
    It should be okay to compare that to a remote Var, so long as the remote
    Var determines the comparison collation.  (When we actually ship such an
    expression to the remote side, the local Var would become a Param with
    default collation, meaning the remote Var would in fact control the
    comparison collation, because non-default implicit collation overrides
    default implicit collation in parse_collate.c.)  To fix, be more precise
    about what FDW_COLLATE_NONE means: it applies either to a noncollatable
    data type or to a collatable type with default collation, if that collation
    can't be traced to a remote Var.  (When it can, FDW_COLLATE_SAFE is
    appropriate.)  We were essentially using that interpretation already at
    the Var/Const/Param level, but we weren't bubbling it up properly.
    
    An alternative fix would be to introduce a separate FDW_COLLATE_DEFAULT
    value to describe the second situation, but that would add more code
    without changing the actual behavior, so it didn't seem worthwhile.
    
    Also, since we're clarifying the rule to be that we care about whether
    operator/function input collations match, there seems no need to fail
    immediately upon seeing a Const/Param/non-foreign-Var with nondefault
    collation.  We only have to reject if it appears in a collation-sensitive
    context (for example, "var IS NOT NULL" is perfectly safe from a collation
    standpoint, whatever collation the var has).  So just set the state to
    UNSAFE rather than failing immediately.
    
    Per report from Jeevan Chalke.  This essentially corrects some sloppy
    thinking in commit ed3ddf91, so back-patch
    to 9.3 where that logic appeared.
    76f965ff
postgres_fdw.out 196 KB