This is an automated email from the ASF dual-hosted git repository.
rameshkumar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new d06f891353 HIVE-26096: Select on single column MultiDelimitSerDe table
throws AIOBE (#3158)
d06f891353 is described below
commit d06f8913533d7a003f85e03a359e3ad50409745e
Author: Naresh P R <[email protected]>
AuthorDate: Fri Apr 8 17:22:47 2022 -0700
HIVE-26096: Select on single column MultiDelimitSerDe table throws AIOBE
(#3158)
---
.../queries/clientpositive/serde_multi_delimit.q | 8 +++++
.../clientpositive/llap/serde_multi_delimit.q.out | 41 ++++++++++++++++++++++
.../apache/hadoop/hive/serde2/lazy/LazyStruct.java | 2 +-
3 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/ql/src/test/queries/clientpositive/serde_multi_delimit.q
b/ql/src/test/queries/clientpositive/serde_multi_delimit.q
index e9e7f789d1..c23f264b3b 100644
--- a/ql/src/test/queries/clientpositive/serde_multi_delimit.q
+++ b/ql/src/test/queries/clientpositive/serde_multi_delimit.q
@@ -67,7 +67,15 @@ LOAD DATA LOCAL INPATH
"../../data/files/t4_multi_delimit.csv" INTO TABLE t4_mul
SELECT * FROM t4_multi_delimit;
+create table test_multidelim(col string)
+ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.MultiDelimitSerDe'
+with serdeproperties('field.delim'='!^') STORED AS TEXTFILE;
+
+insert into test_multidelim values('aa'),('bb'),('cc'),('dd');
+
+select * from test_multidelim;
+DROP TABLE test_multidelim;
DROP TABLE t1_multi_delimit;
DROP TABLE t11_csv_serde;
DROP TABLE t2_multi_delimit;
diff --git a/ql/src/test/results/clientpositive/llap/serde_multi_delimit.q.out
b/ql/src/test/results/clientpositive/llap/serde_multi_delimit.q.out
index 837f62012c..7bb2fdc9e3 100644
--- a/ql/src/test/results/clientpositive/llap/serde_multi_delimit.q.out
+++ b/ql/src/test/results/clientpositive/llap/serde_multi_delimit.q.out
@@ -235,6 +235,47 @@ POSTHOOK: Input: default@t4_multi_delimit
áűáűáűáű
űűű ááá óóó
+PREHOOK: query: create table test_multidelim(col string)
+ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.MultiDelimitSerDe'
+with serdeproperties('field.delim'='!^') STORED AS TEXTFILE
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@test_multidelim
+POSTHOOK: query: create table test_multidelim(col string)
+ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.MultiDelimitSerDe'
+with serdeproperties('field.delim'='!^') STORED AS TEXTFILE
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@test_multidelim
+PREHOOK: query: insert into test_multidelim values('aa'),('bb'),('cc'),('dd')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@test_multidelim
+POSTHOOK: query: insert into test_multidelim values('aa'),('bb'),('cc'),('dd')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@test_multidelim
+POSTHOOK: Lineage: test_multidelim.col SCRIPT []
+PREHOOK: query: select * from test_multidelim
+PREHOOK: type: QUERY
+PREHOOK: Input: default@test_multidelim
+#### A masked pattern was here ####
+POSTHOOK: query: select * from test_multidelim
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@test_multidelim
+#### A masked pattern was here ####
+aa
+bb
+cc
+dd
+PREHOOK: query: DROP TABLE test_multidelim
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@test_multidelim
+PREHOOK: Output: default@test_multidelim
+POSTHOOK: query: DROP TABLE test_multidelim
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@test_multidelim
+POSTHOOK: Output: default@test_multidelim
PREHOOK: query: DROP TABLE t1_multi_delimit
PREHOOK: type: DROPTABLE
PREHOOK: Input: default@t1_multi_delimit
diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyStruct.java
b/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyStruct.java
index 66b15374dd..2848d348e3 100644
--- a/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyStruct.java
+++ b/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyStruct.java
@@ -300,7 +300,7 @@ public class LazyStruct extends
LazyNonPrimitive<LazySimpleStructObjectInspector
// first field always starts from 0, even when missing
startPosition[0] = 0;
for (int i = 1; i <= fields.length; i++) {
- if (delimitIndexes[i - 1] != -1) {
+ if (fields.length > 1 && delimitIndexes[i - 1] != -1) {
int start = delimitIndexes[i - 1] + fieldDelimit.length;
startPosition[i] = start - i * diff;
} else {