private ClickHouseValue nextValue() throws NoSuchElementException, UncheckedIOException {
        final DefaultSerDe s = getInitializedSerDe();
        final ClickHouseValue value = config.isReuseValueWrapper() ? s.templates[readPosition]
                : s.templates[readPosition].copy();
        try {
            readAndFill(value);
        } catch (EOFException e) {
            if (readPosition == 0) { // end of the stream, which is fine
                throw new NoSuchElementException("No more value");
            } else {
                throw new UncheckedIOException(ClickHouseUtils.format(ERROR_REACHED_END_OF_STREAM,
                        readPosition + 1, s.columns.length, s.columns[readPosition]), e);
            }
        } catch (IOException e) {
            throw new UncheckedIOException(
                    ClickHouseUtils.format(ERROR_FAILED_TO_READ, readPosition + 1, s.columns.length,
                            s.columns[readPosition]),
                    e);
        }

        return value;
    }
This method calls {@link #readAndFill(ClickHouseValue, ClickHouseColumn)} and
updates {@code readPosition} to point to next column.

@return non-null value
@throws NoSuchElementException when no more value to read
@throws UncheckedIOException   when failed to read data from input stream
clickhouse-data/src/main/java/com/clickhouse/data/ClickHouseDataProcessor.java