This is an automated email from the ASF dual-hosted git repository.
zabetak 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 ad8701e4e76 HIVE-29029: ClassCastException when compiling query with
STACK UDTF in multiple UNION ALL branches (#5978)
ad8701e4e76 is described below
commit ad8701e4e76d6119330ee0624b2e600fa7959004
Author: Dayakar M <[email protected]>
AuthorDate: Mon Jul 21 15:16:39 2025 +0530
HIVE-29029: ClassCastException when compiling query with STACK UDTF in
multiple UNION ALL branches (#5978)
---
.../HiveUnionSimpleSelectsToInlineTableRule.java | 12 ++
.../queries/clientpositive/udtf_with_unionall.q | 39 +++++
.../clientpositive/llap/udtf_with_unionall.q.out | 168 +++++++++++++++++++++
3 files changed, 219 insertions(+)
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveUnionSimpleSelectsToInlineTableRule.java
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveUnionSimpleSelectsToInlineTableRule.java
index c5f316d5f7c..1e24970547c 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveUnionSimpleSelectsToInlineTableRule.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveUnionSimpleSelectsToInlineTableRule.java
@@ -218,6 +218,18 @@ private boolean isInlineTableOperand(RelNode input) {
if (input.getInputs().size() == 0) {
return true;
}
+ RexNode call = ((HiveTableFunctionScan) input).getCall();
+ if (!(call instanceof RexCall)) {
+ return false;
+ }
+ // there should be operands present, if not return false
+ if (((RexCall) call).getOperands().size() == 0) {
+ return false;
+ }
+ // the operands should be of type RexCall, if not return false
+ if (!(((RexCall) call).getOperands().get(0) instanceof RexCall)) {
+ return false;
+ }
return isDummyTableScan(input.getInput(0));
}
diff --git a/ql/src/test/queries/clientpositive/udtf_with_unionall.q
b/ql/src/test/queries/clientpositive/udtf_with_unionall.q
new file mode 100644
index 00000000000..f13f5c1c4f5
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/udtf_with_unionall.q
@@ -0,0 +1,39 @@
+SELECT STACK(3,'A',10,date '2015-01-01','z','B',20,date
'2016-01-01','y','C',30,date '2017-08-09','x') AS (col0,col1,col2,col3)
+ UNION ALL
+ SELECT STACK(3,'A',10,date '2015-01-01','n','B',20,date
'2016-01-01','m','C',30,date '2017-08-09','l') AS (col0,col1,col2,col3);
+
+EXPLAIN CBO SELECT stack(3,'A',10,date '2015-01-01','z','B',20,date
'2016-01-01','y','C',30,date '2017-08-09','x') AS (col0,col1,col2,col3)
+ UNION ALL
+ SELECT STACK(3,'A',10,date '2015-01-01','n','B',20,date
'2016-01-01','m','C',30,date '2017-08-09','l') AS (col0,col1,col2,col3);
+
+SELECT * FROM (VALUES(1, '1'), (2, 'orange'), (5, 'yellow')) AS Colors1
+ UNION ALL
+ SELECT * FROM (VALUES(10, 'green'), (11, 'blue'), (12, 'indigo'), (20,
'violet')) AS Colors2
+ UNION ALL
+ SELECT STACK(2,10,'X',20,'Y');
+
+EXPLAIN CBO SELECT * FROM (VALUES(1, '1'), (2, 'orange'), (5, 'yellow')) AS
Colors1
+ UNION ALL
+ SELECT * FROM (VALUES(10, 'green'), (11, 'blue'), (12, 'indigo'), (20,
'violet')) AS Colors2
+ UNION ALL
+ SELECT STACK(2,10,'X',20,'Y');
+
+SELECT INLINE(array(struct('A',10,date '2015-01-01'),struct('B',20,date
'2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')));
+
+EXPLAIN CBO SELECT INLINE(array(struct('A',10,date
'2015-01-01'),struct('B',20,date '2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')));
+
+SELECT INLINE(array(struct('A',10,date '2015-01-01'),struct('B',20,date
'2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')))
+ UNION ALL
+ SELECT STACK(2,'X',50,date '2017-01-01','Y',60,date '2017-01-01');
+
+EXPLAIN CBO SELECT INLINE(array(struct('A',10,date
'2015-01-01'),struct('B',20,date '2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')))
+ UNION ALL
+ SELECT STACK(2,'X',50,date '2017-01-01','Y',60,date '2017-01-01');
diff --git a/ql/src/test/results/clientpositive/llap/udtf_with_unionall.q.out
b/ql/src/test/results/clientpositive/llap/udtf_with_unionall.q.out
new file mode 100644
index 00000000000..5a56637cea2
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/udtf_with_unionall.q.out
@@ -0,0 +1,168 @@
+PREHOOK: query: SELECT STACK(3,'A',10,date '2015-01-01','z','B',20,date
'2016-01-01','y','C',30,date '2017-08-09','x') AS (col0,col1,col2,col3)
+ UNION ALL
+ SELECT STACK(3,'A',10,date '2015-01-01','n','B',20,date
'2016-01-01','m','C',30,date '2017-08-09','l') AS (col0,col1,col2,col3)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT STACK(3,'A',10,date '2015-01-01','z','B',20,date
'2016-01-01','y','C',30,date '2017-08-09','x') AS (col0,col1,col2,col3)
+ UNION ALL
+ SELECT STACK(3,'A',10,date '2015-01-01','n','B',20,date
'2016-01-01','m','C',30,date '2017-08-09','l') AS (col0,col1,col2,col3)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+A 10 2015-01-01 z
+B 20 2016-01-01 y
+C 30 2017-08-09 x
+A 10 2015-01-01 n
+B 20 2016-01-01 m
+C 30 2017-08-09 l
+PREHOOK: query: EXPLAIN CBO SELECT stack(3,'A',10,date
'2015-01-01','z','B',20,date '2016-01-01','y','C',30,date '2017-08-09','x') AS
(col0,col1,col2,col3)
+ UNION ALL
+ SELECT STACK(3,'A',10,date '2015-01-01','n','B',20,date
'2016-01-01','m','C',30,date '2017-08-09','l') AS (col0,col1,col2,col3)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: EXPLAIN CBO SELECT stack(3,'A',10,date
'2015-01-01','z','B',20,date '2016-01-01','y','C',30,date '2017-08-09','x') AS
(col0,col1,col2,col3)
+ UNION ALL
+ SELECT STACK(3,'A',10,date '2015-01-01','n','B',20,date
'2016-01-01','m','C',30,date '2017-08-09','l') AS (col0,col1,col2,col3)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+CBO PLAN:
+HiveUnion(all=[true])
+ HiveProject(col0=[$0], col1=[$1], col2=[$2], col3=[$3])
+ HiveTableFunctionScan(invocation=[stack(3,
_UTF-16LE'A':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 10, 2015-01-01:DATE,
_UTF-16LE'z':VARCHAR(2147483647) CHARACTER SET "UTF-16LE",
_UTF-16LE'B':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 20, 2016-01-01:DATE,
_UTF-16LE'y':VARCHAR(2147483647) CHARACTER SET "UTF-16LE",
_UTF-16LE'C':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 30, 2017-08-09:DATE,
_UTF-16LE'x':VARCHAR(2147483647) CHARACTER SET "UTF-16LE")],
rowType=[RecordType(VARCHA [...]
+ HiveTableScan(table=[[_dummy_database, _dummy_table]],
table:alias=[_dummy_table])
+ HiveProject(col0=[$0], col1=[$1], col2=[$2], col3=[$3])
+ HiveTableFunctionScan(invocation=[stack(3,
_UTF-16LE'A':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 10, 2015-01-01:DATE,
_UTF-16LE'n':VARCHAR(2147483647) CHARACTER SET "UTF-16LE",
_UTF-16LE'B':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 20, 2016-01-01:DATE,
_UTF-16LE'm':VARCHAR(2147483647) CHARACTER SET "UTF-16LE",
_UTF-16LE'C':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 30, 2017-08-09:DATE,
_UTF-16LE'l':VARCHAR(2147483647) CHARACTER SET "UTF-16LE")],
rowType=[RecordType(VARCHA [...]
+ HiveTableScan(table=[[_dummy_database, _dummy_table]],
table:alias=[_dummy_table])
+
+PREHOOK: query: SELECT * FROM (VALUES(1, '1'), (2, 'orange'), (5, 'yellow'))
AS Colors1
+ UNION ALL
+ SELECT * FROM (VALUES(10, 'green'), (11, 'blue'), (12, 'indigo'), (20,
'violet')) AS Colors2
+ UNION ALL
+ SELECT STACK(2,10,'X',20,'Y')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * FROM (VALUES(1, '1'), (2, 'orange'), (5, 'yellow'))
AS Colors1
+ UNION ALL
+ SELECT * FROM (VALUES(10, 'green'), (11, 'blue'), (12, 'indigo'), (20,
'violet')) AS Colors2
+ UNION ALL
+ SELECT STACK(2,10,'X',20,'Y')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+10 X
+20 Y
+1 1
+2 orange
+5 yellow
+10 green
+11 blue
+12 indigo
+20 violet
+PREHOOK: query: EXPLAIN CBO SELECT * FROM (VALUES(1, '1'), (2, 'orange'), (5,
'yellow')) AS Colors1
+ UNION ALL
+ SELECT * FROM (VALUES(10, 'green'), (11, 'blue'), (12, 'indigo'), (20,
'violet')) AS Colors2
+ UNION ALL
+ SELECT STACK(2,10,'X',20,'Y')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: EXPLAIN CBO SELECT * FROM (VALUES(1, '1'), (2, 'orange'), (5,
'yellow')) AS Colors1
+ UNION ALL
+ SELECT * FROM (VALUES(10, 'green'), (11, 'blue'), (12, 'indigo'), (20,
'violet')) AS Colors2
+ UNION ALL
+ SELECT STACK(2,10,'X',20,'Y')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+CBO PLAN:
+HiveUnion(all=[true])
+ HiveProject(col0=[$0], col1=[$1])
+ HiveTableFunctionScan(invocation=[stack(2, 10,
_UTF-16LE'X':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 20,
_UTF-16LE'Y':VARCHAR(2147483647) CHARACTER SET "UTF-16LE")],
rowType=[RecordType(INTEGER col0, VARCHAR(2147483647) col1)])
+ HiveTableScan(table=[[_dummy_database, _dummy_table]],
table:alias=[_dummy_table])
+ HiveProject(col1=[$0], col2=[$1])
+ HiveTableFunctionScan(invocation=[inline(ARRAY(ROW(1,
_UTF-16LE'1':VARCHAR(2147483647) CHARACTER SET "UTF-16LE"), ROW(2,
_UTF-16LE'orange':VARCHAR(2147483647) CHARACTER SET "UTF-16LE"), ROW(5,
_UTF-16LE'yellow':VARCHAR(2147483647) CHARACTER SET "UTF-16LE"), ROW(10,
_UTF-16LE'green':VARCHAR(2147483647) CHARACTER SET "UTF-16LE"), ROW(11,
_UTF-16LE'blue':VARCHAR(2147483647) CHARACTER SET "UTF-16LE"), ROW(12,
_UTF-16LE'indigo':VARCHAR(2147483647) CHARACTER SET "UTF-16LE"), ROW(20, _UTF-1
[...]
+ HiveTableScan(table=[[_dummy_database, _dummy_table]],
table:alias=[_dummy_table])
+
+PREHOOK: query: SELECT INLINE(array(struct('A',10,date
'2015-01-01'),struct('B',20,date '2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')))
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT INLINE(array(struct('A',10,date
'2015-01-01'),struct('B',20,date '2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')))
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+A 10 2015-01-01
+B 20 2015-02-02
+C 30 2016-01-01
+D 40 2016-02-02
+PREHOOK: query: EXPLAIN CBO SELECT INLINE(array(struct('A',10,date
'2015-01-01'),struct('B',20,date '2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')))
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: EXPLAIN CBO SELECT INLINE(array(struct('A',10,date
'2015-01-01'),struct('B',20,date '2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')))
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+CBO PLAN:
+HiveTableFunctionScan(invocation=[inline(ARRAY(ROW(_UTF-16LE'A':VARCHAR(2147483647)
CHARACTER SET "UTF-16LE", 10, 2015-01-01:DATE),
ROW(_UTF-16LE'B':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 20,
2015-02-02:DATE), ROW(_UTF-16LE'C':VARCHAR(2147483647) CHARACTER SET
"UTF-16LE", 30, 2016-01-01:DATE), ROW(_UTF-16LE'D':VARCHAR(2147483647)
CHARACTER SET "UTF-16LE", 40, 2016-02-02:DATE)))],
rowType=[RecordType(VARCHAR(2147483647) col1, INTEGER col2, DATE col3)])
+ HiveTableScan(table=[[_dummy_database, _dummy_table]],
table:alias=[_dummy_table])
+
+PREHOOK: query: SELECT INLINE(array(struct('A',10,date
'2015-01-01'),struct('B',20,date '2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')))
+ UNION ALL
+ SELECT STACK(2,'X',50,date '2017-01-01','Y',60,date '2017-01-01')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT INLINE(array(struct('A',10,date
'2015-01-01'),struct('B',20,date '2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')))
+ UNION ALL
+ SELECT STACK(2,'X',50,date '2017-01-01','Y',60,date '2017-01-01')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+X 50 2017-01-01
+Y 60 2017-01-01
+A 10 2015-01-01
+B 20 2015-02-02
+C 30 2016-01-01
+D 40 2016-02-02
+PREHOOK: query: EXPLAIN CBO SELECT INLINE(array(struct('A',10,date
'2015-01-01'),struct('B',20,date '2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')))
+ UNION ALL
+ SELECT STACK(2,'X',50,date '2017-01-01','Y',60,date '2017-01-01')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: EXPLAIN CBO SELECT INLINE(array(struct('A',10,date
'2015-01-01'),struct('B',20,date '2015-02-02')))
+ UNION ALL
+ SELECT INLINE(array(struct('C',30,date '2016-01-01'),struct('D',40,date
'2016-02-02')))
+ UNION ALL
+ SELECT STACK(2,'X',50,date '2017-01-01','Y',60,date '2017-01-01')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+CBO PLAN:
+HiveUnion(all=[true])
+ HiveProject(col0=[$0], col1=[$1], col2=[$2])
+ HiveTableFunctionScan(invocation=[stack(2,
_UTF-16LE'X':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 50, 2017-01-01:DATE,
_UTF-16LE'Y':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 60,
2017-01-01:DATE)], rowType=[RecordType(VARCHAR(2147483647) col0, INTEGER col1,
DATE col2)])
+ HiveTableScan(table=[[_dummy_database, _dummy_table]],
table:alias=[_dummy_table])
+ HiveProject(col1=[$0], col2=[$1], col3=[$2])
+
HiveTableFunctionScan(invocation=[inline(ARRAY(ROW(_UTF-16LE'A':VARCHAR(2147483647)
CHARACTER SET "UTF-16LE", 10, 2015-01-01:DATE),
ROW(_UTF-16LE'B':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 20,
2015-02-02:DATE), ROW(_UTF-16LE'C':VARCHAR(2147483647) CHARACTER SET
"UTF-16LE", 30, 2016-01-01:DATE), ROW(_UTF-16LE'D':VARCHAR(2147483647)
CHARACTER SET "UTF-16LE", 40, 2016-02-02:DATE)))],
rowType=[RecordType(VARCHAR(2147483647) col1, INTEGER col2, DATE col3)])
+ HiveTableScan(table=[[_dummy_database, _dummy_table]],
table:alias=[_dummy_table])
+