public ClickHouseValue read(ClickHouseValue value) throws IOException {
        if (input == null) {
            throw new IllegalStateException("No input stream available to read");
        }
        DefaultSerDe s = getInitializedSerDe();
        int len = s.columns.length;
        int pos = readPosition;
        if (len == 0 || pos >= len) {
            throw new IllegalStateException(
                    ClickHouseUtils.format("No column to read(total=%d, readPosition=%d)", len, pos));
        }
        if (value == null) {
            value = config.isReuseValueWrapper() ? s.templates[pos] : s.templates[pos].copy();
        }

        readAndFill(value);
        return value;
    }
Reads deserialized value of next column(at {@code readPosition}) directly
from input stream. Unlike {@link #records()}, which reads multiple values at
a time, this method will only read one for each call.

@param value value to update, could be null
@return updated {@code value} or a new {@link ClickHouseValue} when it is
        null
@throws IOException when failed to read data from input stream
clickhouse-data/src/main/java/com/clickhouse/data/ClickHouseDataProcessor.java