**Describe the issue**

```
SELECT
    extract(log, '\\*   Trying ([0-9a-z\\.\\:\\[\\]]+):\\d+\\.\\.\\.') AS resolved_address,
    toIPv4(resolved_address) AS ipv4
FROM minicrawl
LIMIT 10

┌─resolved_address─┬───────────ipv4─┐
│ 89.46.106.77     │   89.46.106.77 │
│ 13.33.243.83     │   13.33.243.83 │
│ 93.95.100.90     │   93.95.100.90 │
│ 23.227.38.32     │   23.227.38.32 │
│ 203.113.174.46   │ 203.113.174.46 │
│ 13.70.20.161     │   13.70.20.161 │
│ 60.199.172.227   │ 60.199.172.227 │
│                  │        0.0.0.0 │
│                  │        0.0.0.0 │
│ 82.149.228.245   │ 82.149.228.245 │
└──────────────────┴────────────────┘
```
String toString() const;
    };
    struct SubstreamPath : public std::vector<Substream>
    {
        String toString() const;
    };
    
    
    using SubstreamsCache = std::unordered_map<String, ColumnPtr>;
    using StreamCallback = std::function<void(const SubstreamPath &, const IDataType &)>;
    void enumerateStreams(const StreamCallback & callback, SubstreamPath & path) const;
    void enumerateStreams(const StreamCallback & callback, SubstreamPath && path) const { enumerateStreams(callback, path); }
    void enumerateStreams(const StreamCallback & callback) const { enumerateStreams(callback, {}); }
    virtual DataTypePtr tryGetSubcolumnType(const String & ) const { return nullptr; }
    DataTypePtr getSubcolumnType(const String & subcolumn_name) const;
    virtual ColumnPtr getSubcolumn(const String & subcolumn_name, const IColumn & column) const;
    Names getSubcolumnNames() const;
    using OutputStreamGetter = std::function<WriteBuffer*(const SubstreamPath &)>;
    using InputStreamGetter = std::function<ReadBuffer*(const SubstreamPath &)>;
    struct SerializeBinaryBulkState
    {
        virtual ~SerializeBinaryBulkState() = default;
    };
    struct DeserializeBinaryBulkState
    {
        virtual ~DeserializeBinaryBulkState() = default;