**Describe what's wrong**

In case of using `optimize_functions_to_subcolumns` ClickHouse doesn't use alias for column name.

**How to reproduce**

ClickHouse 21.13

```
CREATE TABLE test
(
    `key` UInt32,
    `value` Nullable(UInt32)
)
ENGINE = MergeTree
ORDER BY key

INSERT INTO test SELECT
    number,
    NULL
FROM numbers(10000000);


SELECT count(value) AS a
FROM test
SETTINGS optimize_functions_to_subcolumns = 0

┌─a─┐
│ 0 │
└───┘

1 rows in set. Elapsed: 0.028 sec. Processed 32.50 million rows, 162.52 MB (1.15 billion rows/s., 5.74 GB/s.)

SELECT count(value) AS a
FROM test
SETTINGS optimize_functions_to_subcolumns = 1

┌─sum(not(value.null))─┐
│                    0 │
└──────────────────────┘

1 rows in set. Elapsed: 0.032 sec. Processed 32.50 million rows, 32.50 MB (1.00 billion rows/s., 1.00 GB/s.)
```

**Expected behavior**

ClickHouse should use alias name.


{
    const auto & arguments = function.arguments->children;
    if (arguments.empty() || arguments.size() > 2)
        return;
    const auto * identifier = arguments[0]->as<ASTIdentifier>();
    if (!identifier)
        return;
    const auto & columns = metadata_snapshot->getColumns();
    const auto & name_in_storage = identifier->name();
    if (!columns.has(name_in_storage))
        return;
    const auto & column_type = columns.get(name_in_storage).type;
    TypeIndex column_type_id = column_type->getTypeId();
    if (arguments.size() == 1)
    {
        auto it = unary_function_to_subcolumn.find(function.name);
        if (it != unary_function_to_subcolumn.end())
        {
            const auto & [type_id, subcolumn_name, transformer] = it->second;
            if (column_type_id == type_id)
                ast = transformer(name_in_storage, subcolumn_name);
        }
    }
    else
    {
        if (function.name == "tupleElement" && column_type_id == TypeIndex::Tuple)
        {
            const auto * literal = arguments[1]->as<ASTLiteral>();