diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
index 5912a3b..6ff2cd9 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
@@ -192,21 +192,23 @@
             columnReader.write(columnWriter, count);
         } catch (ColumnarValueException e) {
             ObjectNode node = e.createNode(getClass().getSimpleName());
-            node.put("numberOfWrittenPrimaryKeys", primaryKeyWriters[0].getCount());
-            node.put("writtenComponents", writtenComponents.toString());
+            appendExceptionCommonInfo(node, componentIndex, count);
             node.put("blockIndex", blockIndex);
-            node.put("componentIndex", componentIndex);
-            node.put("count", count);
-            node.put("numberOFAntiMatters", numberOfAntiMatter);
             throw e;
         }
     }
 
     private void skipReaders(int componentIndex, int count) throws HyracksDataException {
         MergeColumnTupleReference componentTuple = componentsTuples[componentIndex];
-        for (int j = columnMetadata.getNumberOfPrimaryKeys(); j < columnMetadata.getNumberOfColumns(); j++) {
-            IColumnValuesReader columnReader = componentTuple.getReader(j);
-            columnReader.skip(count);
+        try {
+            for (int j = columnMetadata.getNumberOfPrimaryKeys(); j < columnMetadata.getNumberOfColumns(); j++) {
+                IColumnValuesReader columnReader = componentTuple.getReader(j);
+                columnReader.skip(count);
+            }
+        } catch (ColumnarValueException e) {
+            ObjectNode node = e.createNode(getClass().getSimpleName());
+            appendExceptionCommonInfo(node, componentIndex, count);
+            throw e;
         }
     }
 
@@ -241,4 +243,12 @@
         }
         return Math.min(maxNumberOfTuples, numberOfTuplesUsingMaxSize);
     }
+
+    private void appendExceptionCommonInfo(ObjectNode node, int componentIndex, int count) {
+        node.put("numberOfWrittenPrimaryKeys", primaryKeyWriters[0].getCount());
+        node.put("writtenComponents", writtenComponents.toString());
+        node.put("numberOFAntiMatters", numberOfAntiMatter);
+        node.put("componentIndex", componentIndex);
+        node.put("count", count);
+    }
 }
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/RepeatedPrimitiveColumnValuesReader.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/RepeatedPrimitiveColumnValuesReader.java
index 4f9fdec..3f90a4b 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/RepeatedPrimitiveColumnValuesReader.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/RepeatedPrimitiveColumnValuesReader.java
@@ -18,7 +18,6 @@
  */
 package org.apache.asterix.column.values.reader;
 
-import java.io.IOException;
 import java.util.Arrays;
 
 import org.apache.asterix.column.values.IColumnValuesWriter;
@@ -96,23 +95,15 @@
     @Override
     public void write(IColumnValuesWriter writer, boolean callNext) throws HyracksDataException {
         //We always call next as repeated values cannot be primary keys
-        if (!next()) {
-            ColumnarValueException e = new ColumnarValueException();
-            appendReaderInformation(e.createNode(getClass().getSimpleName()));
-            throw e;
-        }
+        doNextAndCheck();
 
         if (isRepeatedValue()) {
             while (!isLastDelimiter()) {
                 writer.writeLevel(level);
                 if (isValue()) {
-                    try {
-                        writer.writeValue(this);
-                    } catch (IOException e) {
-                        throw HyracksDataException.create(e);
-                    }
+                    writer.writeValue(this);
                 }
-                next();
+                doNextAndCheck();
             }
         }
         //Add last delimiter, or NULL/MISSING
@@ -132,10 +123,10 @@
     @Override
     public void skip(int count) throws HyracksDataException {
         for (int i = 0; i < count; i++) {
-            next();
+            doNextAndCheck();
             if (isRepeatedValue()) {
                 while (!isLastDelimiter()) {
-                    next();
+                    doNextAndCheck();
                 }
             }
         }
@@ -162,4 +153,12 @@
         node.put("delimiterIndex", delimiterIndex);
         node.put("isDelimiter", isDelimiter());
     }
+
+    private void doNextAndCheck() throws HyracksDataException {
+        if (!next()) {
+            ColumnarValueException e = new ColumnarValueException();
+            appendReaderInformation(e.createNode(getClass().getSimpleName()));
+            throw e;
+        }
+    }
 }
