```
SET compile_expressions = 1
SELECT GREATEST(2,0)
```

bool isInjective(const Block &) const override { return is_injective; }
    bool useDefaultImplementationForConstants() const override { return true; }
    DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
    {
        DataTypePtr result;
        bool valid = castType(arguments[0].get(), [&](const auto & type)
        {
            using DataType = std::decay_t<decltype(type)>;
            if constexpr (std::is_same_v<DataTypeFixedString, DataType>)
            {
                if constexpr (!Op<DataTypeFixedString>::allow_fixed_string)
                    return false;
                result = std::make_shared<DataType>(type.getN());
            }
            else
            {
                using T0 = typename DataType::FieldType;
                if constexpr (IsDataTypeDecimal<DataType>)
                {
                    if constexpr (!allow_decimal)
                        return false;
                    result = std::make_shared<DataType>(type.getPrecision(), type.getScale());
                }
                else
                    result = std::make_shared<DataTypeNumber<typename Op<T0>::ResultType>>();
            }
            return true;
        });
        if (!valid)