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

};
            executeImpl(tmp_block, {0, 1}, 2, input_rows_count);
            block.getByPosition(result).column = std::move(tmp_block.getByPosition(2).column);
        }
        return true;
    }
    void executeTuple(Block & block, size_t result, const ColumnWithTypeAndName & c0, const ColumnWithTypeAndName & c1,
                          size_t input_rows_count) const
    {
        /** We will lexicographically compare the tuples. This is done as follows:
          * x == y : x1 == y1 && x2 == y2 ...
          * x != y : x1 != y1 || x2 != y2 ...
          *
          * x < y:   x1 < y1 || (x1 == y1 && (x2 < y2 || (x2 == y2 ... && xn < yn))
          * x > y:   x1 > y1 || (x1 == y1 && (x2 > y2 || (x2 == y2 ... && xn > yn))
          * x <= y:  x1 < y1 || (x1 == y1 && (x2 < y2 || (x2 == y2 ... && xn <= yn))
          *
          * Recursive form:
          * x <= y:  x1 < y1 || (x1 == y1 && x_tail <= y_tail)
          *
          * x >= y:  x1 > y1 || (x1 == y1 && (x2 > y2 || (x2 == y2 ... && xn >= yn))
          */
        const size_t tuple_size = typeid_cast<const DataTypeTuple &>(*c0.type).getElements().size();
        if (0 == tuple_size)
            throw Exception("Comparison of zero-sized tuples is not implemented.", ErrorCodes::NOT_IMPLEMENTED);
        if (tuple_size != typeid_cast<const DataTypeTuple &>(*c1.type).getElements().size())
            throw Exception("Cannot compare tuples of different sizes.", ErrorCodes::BAD_ARGUMENTS);
        auto & res = block.getByPosition(result);
        if (res.type->onlyNull())
        {