You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by za...@apache.org on 2025/07/21 09:46:46 UTC
(hive) branch master updated: HIVE-29029: ClassCastException when compiling query with STACK UDTF in multiple UNION ALL branches (#5978)
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 <da...@gmail.com>
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])
+