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 <daya.apa...@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])
+

Reply via email to