private boolean readBlock() throws IOException {
        int nColumns;
        try {
            nColumns = BinaryStreamReader.readVarInt(input);
        } catch (EOFException e) {
            endReached();
            return false;
        }
        int nRows = BinaryStreamReader.readVarInt(input);

        List<String> names = new ArrayList<>(nColumns);
        List<String> types = new ArrayList<>(nColumns);
        currentBlock = new Block(names, types, nRows);
        List<ClickHouseColumn> columns = new ArrayList<>(nColumns);
        for (int i = 0; i < nColumns; i++) {

            ClickHouseColumn column = ClickHouseColumn.of(BinaryStreamReader.readString(input),
                    BinaryStreamReader.readString(input));
            columns.add(column);

            names.add(column.getColumnName());
            types.add(column.getDataType().name());

            List<Object> values = new ArrayList<>(nRows);
            if (column.isArray()) {
                int[] sizes = new int[nRows];
                for (int j = 0; j < nRows; j++) {
                    sizes[j] = Math.toIntExact(binaryStreamReader.readLongLE());
                }
                for (int j = 0; j < nRows; j++) {
                    values.add(binaryStreamReader.readArrayItem(column.getNestedColumns().get(0), sizes[0]));
                }
            } else {
                for (int j = 0; j < nRows; j++) {
                    Object value = binaryStreamReader.readValue(column);
                    values.add(value);
                }
            }
            currentBlock.add(values);
        }
        TableSchema schema = new TableSchema(columns);

        setSchema(schema);

        blockRowIndex = 0;
        return true;
    }
For the backward compatibility server will not send TZ id in column type. Client should send version to a server
to get the correct column type.
(see: https://github.com/ClickHouse/ClickHouse/issues/38209)
client-v2/src/main/java/com/clickhouse/client/api/data_formats/NativeFormatReader.java