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

size_t i = tuple_size - 1;
        while (i > 0)
        {
            --i;
            size_t and_lhs_pos = tmp_block.columns() - 1; 
            size_t and_rhs_pos = i * 4 + 3; 
            tmp_block.insert(ColumnWithTypeAndName());
            ColumnsWithTypeAndName and_args = {{ nullptr, tmp_block.getByPosition(and_lhs_pos).type, "" },
                                               { nullptr, tmp_block.getByPosition(and_rhs_pos).type, "" }};
            auto func_and_adaptor = func_and->build(and_args);
            tmp_block.getByPosition(tmp_block.columns() - 1).type = func_and_adaptor->getReturnType();
            func_and_adaptor->execute(tmp_block, {and_lhs_pos, and_rhs_pos}, tmp_block.columns() - 1, input_rows_count);
            size_t or_lhs_pos = tmp_block.columns() - 1; 
            size_t or_rhs_pos = i * 4 + 2; 
            tmp_block.insert(ColumnWithTypeAndName());
            ColumnsWithTypeAndName or_args = {{ nullptr, tmp_block.getByPosition(or_lhs_pos).type, "" },
                                              { nullptr, tmp_block.getByPosition(or_rhs_pos).type, "" }};
            auto func_or_adaptor = func_or->build(or_args);
            tmp_block.getByPosition(tmp_block.columns() - 1).type = func_or_adaptor->getReturnType();
            func_or_adaptor->execute(tmp_block, {or_lhs_pos, or_rhs_pos}, tmp_block.columns() - 1, input_rows_count);
        }
        block.getByPosition(result).column = tmp_block.getByPosition(tmp_block.columns() - 1).column;
    }
    void executeGenericIdenticalTypes(Block & block, size_t result, const IColumn * c0, const IColumn * c1) const