case TypeIndex::Decimal256:   return f(TypePair<T, Decimal256>());
            default:
                break;
        }
    }
    if constexpr (_float)
    {
        switch (number)
        {
            case TypeIndex::Float32:      return f(TypePair<T, Float32>());
            case TypeIndex::Float64:      return f(TypePair<T, Float64>());
            default:
                break;
        }
    }
    if constexpr (_datetime)
    {
        switch (number)
        {
            case TypeIndex::Date:         return f(TypePair<T, UInt16>());
            case TypeIndex::DateTime:     return f(TypePair<T, UInt32>());
            case TypeIndex::DateTime64:   return f(TypePair<T, DateTime64>());
            default:
                break;
        }
    }
    return false;
}
template <bool _int, bool _float, bool _decimal, bool _datetime, typename F>
inline bool callOnBasicTypes(TypeIndex type_num1, TypeIndex type_num2, F && f)