• Tom Lane's avatar
    Introduce "anycompatible" family of polymorphic types. · 24e2885e
    Tom Lane authored
    This patch adds the pseudo-types anycompatible, anycompatiblearray,
    anycompatiblenonarray, and anycompatiblerange.  They work much like
    anyelement, anyarray, anynonarray, and anyrange respectively, except
    that the actual input values need not match precisely in type.
    Instead, if we can find a common supertype (using the same rules
    as for UNION/CASE type resolution), then the parser automatically
    promotes the input values to that type.  For example,
    "myfunc(anycompatible, anycompatible)" can match a call with one
    integer and one bigint argument, with the integer automatically
    promoted to bigint.  With anyelement in the definition, the user
    would have had to cast the integer explicitly.
    
    The new types also provide a second, independent set of type variables
    for function matching; thus with "myfunc(anyelement, anyelement,
    anycompatible) returns anycompatible" the first two arguments are
    constrained to be the same type, but the third can be some other
    type, and the result has the type of the third argument.  The need
    for more than one set of type variables was foreseen back when we
    first invented the polymorphic types, but we never did anything
    about it.
    
    Pavel Stehule, revised a bit by me
    
    Discussion: https://postgr.es/m/CAFj8pRDna7VqNi8gR+Tt2Ktmz0cq5G93guc3Sbn_NVPLdXAkqA@mail.gmail.com
    24e2885e
pg_proc.c 34.3 KB