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

Block & block, size_t result, const IColumn * col_left_untyped, const IColumn * col_right_untyped,
        const DataTypePtr & left_type, const DataTypePtr & right_type, size_t input_rows_count) const
    {
        
        
        
        const ColumnConst * left_const = checkAndGetColumnConstStringOrFixedString(col_left_untyped);
        const ColumnConst * right_const = checkAndGetColumnConstStringOrFixedString(col_right_untyped);
        if (!left_const && !right_const)
            return false;
        const IDataType * type_string = left_const ? left_type.get() : right_type.get();
        const DataTypePtr & type_to_compare = !left_const ? left_type : right_type;
        Field string_value = left_const ? left_const->getField() : right_const->getField();
        Field converted = convertFieldToType(string_value, *type_to_compare, type_string);
        
        if (converted.isNull())
        {
            block.getByPosition(result).column = DataTypeUInt8().createColumnConst(input_rows_count,
                std::is_same_v<Op<int, int>, NotEqualsOp<int, int>>);
        }
        else
        {
            auto column_converted = type_to_compare->createColumnConst(input_rows_count, converted);
            Block tmp_block
            {
                { left_const ? column_converted : col_left_untyped->getPtr(), type_to_compare, "" },
                { !left_const ? column_converted : col_right_untyped->getPtr(), type_to_compare, "" },
                block.getByPosition(result)