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).
break;
                if (!isInputStreaming(call_type))
                    throw Exception("next_query_info is allowed to be set only for streaming input", ErrorCodes::INVALID_GRPC_QUERY_INFO);
                readQueryInfo();
                if (!query_info.query().empty() || !query_info.query_id().empty() || !query_info.settings().empty()
                    || !query_info.database().empty() || !query_info.input_data_delimiter().empty() || !query_info.output_format().empty()
                    || query_info.external_tables_size() || !query_info.user_name().empty() || !query_info.password().empty()
                    || !query_info.quota().empty() || !query_info.session_id().empty())
                {
                    throw Exception("Extra query infos can be used only to add more input data. "
                                    "Only the following fields can be set: input_data, next_query_info, cancel",
                                    ErrorCodes::INVALID_GRPC_QUERY_INFO);
                }
                if (isQueryCancelled())
                    break;
                LOG_DEBUG(log, "Received extra QueryInfo: input_data: {} bytes", query_info.input_data().size());
                need_input_data_from_query_info = true;
            }
            return {nullptr, 0}; 
        });
        read_buffer = wrapReadBufferWithCompressionMethod(std::move(read_buffer), input_compression_method);
        assert(!pipeline);
        auto source = query_context->getInputFormat(
            input_format, *read_buffer, header, query_context->getSettings().max_insert_block_size);
        QueryPipelineBuilder builder;
        builder.init(Pipe(source));
        pipeline = std::make_unique<QueryPipeline>(QueryPipelineBuilder::getPipeline(std::move(builder)));
        pipeline_executor = std::make_unique<PullingPipelineExecutor>(*pipeline);
    }
    void Call::createExternalTables()