**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.


if (!literal)
                return;
            String subcolumn_name;
            auto value_type = literal->value.getType();
            if (value_type == Field::Types::UInt64)
            {
                const auto & type_tuple = assert_cast<const DataTypeTuple &>(*column_type);
                auto index = get<UInt64>(literal->value);
                subcolumn_name = type_tuple.getNameByPosition(index);
            }
            else if (value_type == Field::Types::String)
                subcolumn_name = get<const String &>(literal->value);
            else
                return;
            ast = transformToSubcolumn(name_in_storage, subcolumn_name);
        }
        else
        {
            auto it = binary_function_to_subcolumn.find(function.name);
            if (it != binary_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, arguments[1]);
            }
        }
    }
}
}