HIVE-4990. ORC seeks fail with non-zero offset or column project (omalley)
git-svn-id: https://svn.apache.org/repos/asf/hive/branches/branch-0.11@1512063 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java b/ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java
index 06103e3..3fbd5bf 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java
@@ -793,7 +793,9 @@
void seek(PositionProvider[] index) throws IOException {
super.seek(index);
for(TreeReader kid: fields) {
- kid.seek(index);
+ if (kid != null) {
+ kid.seek(index);
+ }
}
}
@@ -839,7 +841,9 @@
void skipRows(long items) throws IOException {
items = countNonNulls(items);
for(TreeReader field: fields) {
- field.skipRows(items);
+ if (field != null) {
+ field.skipRows(items);
+ }
}
}
}
@@ -1309,7 +1313,7 @@
readStripe();
}
readRowIndex();
- rowInStripe = rowNumber - rowBaseInStripe;
+ rowInStripe = rowNumber - rowBaseInStripe - firstRow;
if (rowIndexStride != 0) {
long entry = rowInStripe / rowIndexStride;
seekToRowEntry((int) entry);
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/io/orc/TestOrcFile.java b/ql/src/test/org/apache/hadoop/hive/ql/io/orc/TestOrcFile.java
index 4153a61..b28169b 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/io/orc/TestOrcFile.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/io/orc/TestOrcFile.java
@@ -58,6 +58,7 @@
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
@@ -905,6 +906,40 @@
compareList(expectedList, actualList);
compareList(expected.list, (List) row.getFieldValue(10));
}
+ rows.close();
+ Iterator<StripeInformation> stripeIterator =
+ reader.getStripes().iterator();
+ long offsetOfStripe2 = 0;
+ long offsetOfStripe4 = 0;
+ long lastRowOfStripe2 = 0;
+ for(int i = 0; i < 5; ++i) {
+ StripeInformation stripe = stripeIterator.next();
+ if (i < 2) {
+ lastRowOfStripe2 += stripe.getNumberOfRows();
+ } else if (i == 2) {
+ offsetOfStripe2 = stripe.getOffset();
+ lastRowOfStripe2 += stripe.getNumberOfRows() - 1;
+ } else if (i == 4) {
+ offsetOfStripe4 = stripe.getOffset();
+ }
+ }
+ boolean[] columns = new boolean[reader.getStatistics().length];
+ columns[5] = true; // long colulmn
+ columns[9] = true; // text column
+ rows = reader.rows(offsetOfStripe2, offsetOfStripe4 - offsetOfStripe2,
+ columns);
+ rows.seekToRow(lastRowOfStripe2);
+ for(int i = 0; i < 2; ++i) {
+ row = (OrcStruct) rows.next(row);
+ BigRow expected = createRandomRow(intValues, doubleValues,
+ stringValues, byteValues, words,
+ (int) (lastRowOfStripe2 + i));
+
+ assertEquals(expected.long1.longValue(),
+ ((LongWritable) row.getFieldValue(4)).get());
+ assertEquals(expected.string1, row.getFieldValue(8));
+ }
+ rows.close();
}
private void compareInner(InnerStruct expect,