Hi @vitlibar,
In http implementation, ClickHouse will return format of query result in header `X-ClickHouse-Format`. Can we return format in gRPC response as well? This helps client like JDBC driver for deserialization(without the need for parsing the query).
"Only the following fields can be set: input_data, external_tables, next_query_info, cancel",
                                ErrorCodes::INVALID_GRPC_QUERY_INFO);
            }
            if (isQueryCancelled())
                break;
            LOG_DEBUG(log, "Received extra QueryInfo: external tables: {}", query_info.external_tables_size());
        }
    }
    void Call::generateOutput()
    {
        if (!io.pipeline.initialized() || io.pipeline.pushing())
            return;
        Block header;
        if (io.pipeline.pulling())
            header = io.pipeline.getHeader();
        if (output_compression_method != CompressionMethod::None)
            output.resize(DBMS_DEFAULT_BUFFER_SIZE); 
        write_buffer = std::make_unique<WriteBufferFromVector<PODArray<char>>>(output);
        nested_write_buffer = static_cast<WriteBufferFromVector<PODArray<char>> *>(write_buffer.get());
        if (output_compression_method != CompressionMethod::None)
        {
            write_buffer = wrapWriteBufferWithCompressionMethod(std::move(write_buffer), output_compression_method, output_compression_level);
            compressing_write_buffer = write_buffer.get();
        }
        auto has_output = [&] { return (nested_write_buffer->position() != output.data()) || (compressing_write_buffer && compressing_write_buffer->offset()); };
        output_format_processor = query_context->getOutputFormat(output_format, *write_buffer, header);
        Stopwatch after_send_progress;
        
        if (!input_function_is_used)
            check_query_info_contains_cancel_only = true;