**Describe the situation**

```
SELECT * FROM test.hits INTO OUTFILE 'dump.csv' FORMAT CSV

8873898 rows in set. Elapsed: 32.487 sec. Processed 8.87 million rows, 8.46 GB (273.15 thousand rows/s., 260.42 MB/s.)
```

is bounded by single CPU core. Too slow :(
current_format = insert->format;
    }
    auto source = global_context->getInputFormat(current_format, buf, sample, insert_format_max_block_size
    Pipe pipe(source
    if (columns_description.hasDefaults())
    {
        pipe.addSimpleTransform([&](const Block & header)
        {
            return std::make_shared<AddingDefaultsTransform>(header, columns_description, *source, global_context
        }
    }
    QueryPipeline pipeline(std::move(pipe)
    PullingAsyncPipelineExecutor executor(pipeline
    Block block;
    while (executor.pull(block))
    {
        /// Check if server send Log packet
        
        /// Check if server send Exception packet
        auto packet_type = connection->checkPacket(0
        if (packet_type && *packet_type == Protocol::Server::Exception)
        {
            /**
             * We're exiting with error, so it makes sense to kill the
             * input stream without waiting for it to complete.
             */
            executor.cancel(
            return;
        }
        if (block)