This is an automated email from the ASF dual-hosted git repository.
soumyakantidas 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 cadc3df7afd HIVE-29456: HiveProjectSortExchangeTransposeRule throws
NoElementException when SORT BY columns are not in SELECT list
cadc3df7afd is described below
commit cadc3df7afdde6a78794f0e672b8afa73bfad3b2
Author: Soumyakanti Das <[email protected]>
AuthorDate: Mon Feb 23 10:36:56 2026 -0800
HIVE-29456: HiveProjectSortExchangeTransposeRule throws NoElementException
when SORT BY columns are not in SELECT list
---
.../hive/ql/optimizer/calcite/HiveRelOptUtil.java | 7 ++-
.../select_columns_subset_of_sort_by_order_by.q | 15 ++++++
...select_columns_subset_of_sort_by_order_by.q.out | 54 ++++++++++++++++++++++
3 files changed, 75 insertions(+), 1 deletion(-)
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
index 91f2f488d11..9ad18817134 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
@@ -1107,7 +1107,12 @@ public static List<RelFieldCollation>
getNewRelFieldCollations(
Set<Integer> needed = new HashSet<>();
for (RelFieldCollation fc : sortCollation.getFieldCollations()) {
needed.add(fc.getFieldIndex());
- final RexNode node =
project.getProjects().get(map.getTarget(fc.getFieldIndex()));
+ int target = map.getTargetOpt(fc.getFieldIndex());
+ if (target == -1) {
+ // If there is no mapping for this field, we return null early.
+ return null;
+ }
+ final RexNode node = project.getProjects().get(target);
if (node.isA(SqlKind.CAST)) {
// Check whether it is a monotonic preserving cast, otherwise we
cannot push
final RexCall cast = (RexCall) node;
diff --git
a/ql/src/test/queries/clientpositive/select_columns_subset_of_sort_by_order_by.q
b/ql/src/test/queries/clientpositive/select_columns_subset_of_sort_by_order_by.q
new file mode 100644
index 00000000000..737148946a5
--- /dev/null
+++
b/ql/src/test/queries/clientpositive/select_columns_subset_of_sort_by_order_by.q
@@ -0,0 +1,15 @@
+CREATE TABLE test (
+ col1 STRING,
+ col2 STRING
+);
+
+EXPLAIN CBO
+SELECT col1
+FROM test
+SORT BY col1, col2;
+
+set hive.optimize.limittranspose=true;
+EXPLAIN CBO
+SELECT col1
+FROM test
+ORDER BY col1, col2;
diff --git
a/ql/src/test/results/clientpositive/llap/select_columns_subset_of_sort_by_order_by.q.out
b/ql/src/test/results/clientpositive/llap/select_columns_subset_of_sort_by_order_by.q.out
new file mode 100644
index 00000000000..e1f942110d0
--- /dev/null
+++
b/ql/src/test/results/clientpositive/llap/select_columns_subset_of_sort_by_order_by.q.out
@@ -0,0 +1,54 @@
+PREHOOK: query: CREATE TABLE test (
+ col1 STRING,
+ col2 STRING
+)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@test
+POSTHOOK: query: CREATE TABLE test (
+ col1 STRING,
+ col2 STRING
+)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@test
+PREHOOK: query: EXPLAIN CBO
+SELECT col1
+FROM test
+SORT BY col1, col2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@test
+#### A masked pattern was here ####
+POSTHOOK: query: EXPLAIN CBO
+SELECT col1
+FROM test
+SORT BY col1, col2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@test
+#### A masked pattern was here ####
+CBO PLAN:
+HiveProject(col1=[$0])
+ HiveSortExchange(distribution=[any], collation=[[0, 1]])
+ HiveProject(col1=[$0], col2=[$1])
+ HiveTableScan(table=[[default, test]], table:alias=[test])
+
+PREHOOK: query: EXPLAIN CBO
+SELECT col1
+FROM test
+ORDER BY col1, col2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@test
+#### A masked pattern was here ####
+POSTHOOK: query: EXPLAIN CBO
+SELECT col1
+FROM test
+ORDER BY col1, col2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@test
+#### A masked pattern was here ####
+CBO PLAN:
+HiveProject(col1=[$0])
+ HiveSortLimit(sort0=[$0], sort1=[$1], dir0=[ASC], dir1=[ASC])
+ HiveProject(col1=[$0], col2=[$1])
+ HiveTableScan(table=[[default, test]], table:alias=[test])
+