This is an automated email from the ASF dual-hosted git repository.
ayushsaxena 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 f58558d9a47 HIVE-29508: Iceberg: Fix alias resolution of Metadata
Tables (#6362)
f58558d9a47 is described below
commit f58558d9a47d66aaba082a3c6f35aaa16830fc1a
Author: Ayush Saxena <[email protected]>
AuthorDate: Wed Mar 18 14:19:33 2026 +0530
HIVE-29508: Iceberg: Fix alias resolution of Metadata Tables (#6362)
---
.../positive/iceberg_metadata_table_alias.q | 4 ++
.../positive/iceberg_metadata_table_alias.q.out | 51 ++++++++++++++++++++++
...berg_major_compaction_partition_evolution.q.out | 16 +++----
.../llap/puffin_col_stats_with_time_travel.q.out | 4 +-
.../test/results/positive/metadata_delete.q.out | 4 +-
.../test/results/positive/query_iceberg_tag.q.out | 4 +-
.../results/positive/write_iceberg_branch.q.out | 12 ++---
.../hadoop/hive/ql/parse/BaseSemanticAnalyzer.java | 5 ++-
8 files changed, 78 insertions(+), 22 deletions(-)
diff --git
a/iceberg/iceberg-handler/src/test/queries/positive/iceberg_metadata_table_alias.q
b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_metadata_table_alias.q
new file mode 100644
index 00000000000..d6ca7d992a3
--- /dev/null
+++
b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_metadata_table_alias.q
@@ -0,0 +1,4 @@
+create external table ice_t (id int) stored by iceberg;
+insert into ice_t values (1), (2), (3), (4);
+explain extended select * from default.ice_t.snapshots;;
+select `ice_t.snapshots`.operation from default.ice_t.snapshots;
\ No newline at end of file
diff --git
a/iceberg/iceberg-handler/src/test/results/positive/iceberg_metadata_table_alias.q.out
b/iceberg/iceberg-handler/src/test/results/positive/iceberg_metadata_table_alias.q.out
new file mode 100644
index 00000000000..b14d10551b0
--- /dev/null
+++
b/iceberg/iceberg-handler/src/test/results/positive/iceberg_metadata_table_alias.q.out
@@ -0,0 +1,51 @@
+PREHOOK: query: create external table ice_t (id int) stored by iceberg
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@ice_t
+POSTHOOK: query: create external table ice_t (id int) stored by iceberg
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@ice_t
+PREHOOK: query: insert into ice_t values (1), (2), (3), (4)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@ice_t
+POSTHOOK: query: insert into ice_t values (1), (2), (3), (4)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@ice_t
+PREHOOK: query: explain extended select * from default.ice_t.snapshots
+PREHOOK: type: QUERY
+PREHOOK: Input: default@ice_t
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: explain extended select * from default.ice_t.snapshots
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@ice_t
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+OPTIMIZED SQL: SELECT `committed_at` AS `ice_t.snapshots.committed_at`,
`snapshot_id` AS `ice_t.snapshots.snapshot_id`, `parent_id` AS
`ice_t.snapshots.parent_id`, `operation` AS `ice_t.snapshots.operation`,
`manifest_list` AS `ice_t.snapshots.manifest_list`, `summary` AS
`ice_t.snapshots.summary`
+FROM `default`.`ice_t`
+STAGE DEPENDENCIES:
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ TableScan
+ alias: ice_t.snapshots
+ GatherStats: false
+ Select Operator
+ expressions: committed_at (type: timestamp with local time zone),
snapshot_id (type: bigint), parent_id (type: bigint), operation (type: string),
manifest_list (type: string), summary (type: map<string,string>)
+ outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5
+ ListSink
+
+PREHOOK: query: select `ice_t.snapshots`.operation from default.ice_t.snapshots
+PREHOOK: type: QUERY
+PREHOOK: Input: default@ice_t
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select `ice_t.snapshots`.operation from
default.ice_t.snapshots
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@ice_t
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+append
diff --git
a/iceberg/iceberg-handler/src/test/results/positive/llap/iceberg_major_compaction_partition_evolution.q.out
b/iceberg/iceberg-handler/src/test/results/positive/llap/iceberg_major_compaction_partition_evolution.q.out
index 5f6cb0fd48c..981b8269ad5 100644
---
a/iceberg/iceberg-handler/src/test/results/positive/llap/iceberg_major_compaction_partition_evolution.q.out
+++
b/iceberg/iceberg-handler/src/test/results/positive/llap/iceberg_major_compaction_partition_evolution.q.out
@@ -384,7 +384,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice_orc
+ alias: ice_orc.tag_v1
Snapshot ref: tag_v1
Statistics: Num rows: 4 Data size: 792 Basic stats: COMPLETE
Column stats: COMPLETE
Select Operator
@@ -427,7 +427,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice_orc
+ alias: ice_orc.tag_v2
Snapshot ref: tag_v2
Statistics: Num rows: 8 Data size: 3136 Basic stats:
COMPLETE Column stats: NONE
Select Operator
@@ -470,7 +470,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice_orc
+ alias: ice_orc.tag_v3
Snapshot ref: tag_v3
Statistics: Num rows: 11 Data size: 4312 Basic stats:
COMPLETE Column stats: NONE
Select Operator
@@ -513,7 +513,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice_orc
+ alias: ice_orc.tag_v4
Snapshot ref: tag_v4
Statistics: Num rows: 9 Data size: 3528 Basic stats:
COMPLETE Column stats: NONE
Select Operator
@@ -598,7 +598,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice_orc
+ alias: ice_orc.tag_v1
filterExpr: company_id is not null (type: boolean)
Snapshot ref: tag_v1
Statistics: Num rows: 3 Data size: 594 Basic stats: COMPLETE
Column stats: COMPLETE
@@ -645,7 +645,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice_orc
+ alias: ice_orc.tag_v2
filterExpr: company_id is not null (type: boolean)
Snapshot ref: tag_v2
Statistics: Num rows: 8 Data size: 3136 Basic stats:
COMPLETE Column stats: NONE
@@ -692,7 +692,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice_orc
+ alias: ice_orc.tag_v3
filterExpr: company_id is not null (type: boolean)
Snapshot ref: tag_v3
Statistics: Num rows: 11 Data size: 4312 Basic stats:
COMPLETE Column stats: NONE
@@ -739,7 +739,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice_orc
+ alias: ice_orc.tag_v4
filterExpr: company_id is not null (type: boolean)
Snapshot ref: tag_v4
Statistics: Num rows: 9 Data size: 3528 Basic stats:
COMPLETE Column stats: NONE
diff --git
a/iceberg/iceberg-handler/src/test/results/positive/llap/puffin_col_stats_with_time_travel.q.out
b/iceberg/iceberg-handler/src/test/results/positive/llap/puffin_col_stats_with_time_travel.q.out
index bf0ec56f24e..3d75973ab98 100644
---
a/iceberg/iceberg-handler/src/test/results/positive/llap/puffin_col_stats_with_time_travel.q.out
+++
b/iceberg/iceberg-handler/src/test/results/positive/llap/puffin_col_stats_with_time_travel.q.out
@@ -94,7 +94,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: tbl_ice_puffin_time_travel
+ alias: tbl_ice_puffin_time_travel.tag_checkpoint
Snapshot ref: tag_checkpoint
Statistics: Num rows: 2 Data size: 190 Basic stats: COMPLETE
Column stats: COMPLETE
Select Operator
@@ -211,7 +211,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: tbl_ice_puffin_time_travel
+ alias: tbl_ice_puffin_time_travel.tag_checkpoint
Snapshot ref: tag_checkpoint
Statistics: Num rows: 2 Data size: 190 Basic stats: COMPLETE
Column stats: COMPLETE
Select Operator
diff --git
a/iceberg/iceberg-handler/src/test/results/positive/metadata_delete.q.out
b/iceberg/iceberg-handler/src/test/results/positive/metadata_delete.q.out
index 330d08b517b..35c39d9a078 100644
--- a/iceberg/iceberg-handler/src/test/results/positive/metadata_delete.q.out
+++ b/iceberg/iceberg-handler/src/test/results/positive/metadata_delete.q.out
@@ -219,11 +219,11 @@ POSTHOOK: Input: default@ice_branch_metadata_delete
PREHOOK: query: delete from default.ice_branch_metadata_delete.branch_test01
where a = 1
PREHOOK: type: QUERY
PREHOOK: Input: default@ice_branch_metadata_delete@branch_test01
-PREHOOK: Output: hdfs://### HDFS PATH ###
+PREHOOK: Output: default@ice_branch_metadata_delete@branch_test01
POSTHOOK: query: delete from default.ice_branch_metadata_delete.branch_test01
where a = 1
POSTHOOK: type: QUERY
POSTHOOK: Input: default@ice_branch_metadata_delete@branch_test01
-POSTHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: Output: default@ice_branch_metadata_delete@branch_test01
PREHOOK: query: select * from default.ice_branch_metadata_delete.branch_test01
PREHOOK: type: QUERY
PREHOOK: Input: default@ice_branch_metadata_delete@branch_test01
diff --git
a/iceberg/iceberg-handler/src/test/results/positive/query_iceberg_tag.q.out
b/iceberg/iceberg-handler/src/test/results/positive/query_iceberg_tag.q.out
index 7e5f0ed9373..27032bec47e 100644
--- a/iceberg/iceberg-handler/src/test/results/positive/query_iceberg_tag.q.out
+++ b/iceberg/iceberg-handler/src/test/results/positive/query_iceberg_tag.q.out
@@ -37,7 +37,7 @@ STAGE PLANS:
limit: -1
Processor Tree:
TableScan
- alias: ice01
+ alias: ice01.tag_test1
Snapshot ref: tag_test1
Select Operator
expressions: a (type: int), b (type: string), c (type: int)
@@ -75,7 +75,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice01
+ alias: ice01.tag_test1
Snapshot ref: tag_test1
Statistics: Num rows: 3 Data size: 285 Basic stats: COMPLETE
Column stats: COMPLETE
Select Operator
diff --git
a/iceberg/iceberg-handler/src/test/results/positive/write_iceberg_branch.q.out
b/iceberg/iceberg-handler/src/test/results/positive/write_iceberg_branch.q.out
index 9c80024e09b..37f0589a916 100644
---
a/iceberg/iceberg-handler/src/test/results/positive/write_iceberg_branch.q.out
+++
b/iceberg/iceberg-handler/src/test/results/positive/write_iceberg_branch.q.out
@@ -56,7 +56,7 @@ STAGE PLANS:
limit: -1
Processor Tree:
TableScan
- alias: ice01
+ alias: ice01.branch_test1
Snapshot ref: branch_test1
Select Operator
expressions: a (type: int), b (type: string), c (type: int)
@@ -231,7 +231,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice01
+ alias: ice01.branch_test1
filterExpr: (a = 22) (type: boolean)
Snapshot ref: branch_test1
Statistics: Num rows: 5 Data size: 960 Basic stats: COMPLETE
Column stats: NONE
@@ -313,7 +313,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice01
+ alias: ice01.branch_test1
filterExpr: (c = 66) (type: boolean)
Snapshot ref: branch_test1
Statistics: Num rows: 4 Data size: 768 Basic stats: COMPLETE
Column stats: NONE
@@ -448,7 +448,7 @@ STAGE PLANS:
Map 4
Map Operator Tree:
TableScan
- alias: ice01
+ alias: ice01.branch_test1
filterExpr: a is not null (type: boolean)
Snapshot ref: branch_test1
Statistics: Num rows: 4 Data size: 768 Basic stats: COMPLETE
Column stats: NONE
@@ -638,7 +638,7 @@ POSTHOOK: Input: default@source01
POSTHOOK: Output: default@ice01@branch_test1
POSTHOOK: Output: default@ice01@branch_test1
POSTHOOK: Output: default@merge_tmp_table
-POSTHOOK: Lineage: merge_tmp_table.val EXPRESSION [(ice01)ice01.null, ]
+POSTHOOK: Lineage: merge_tmp_table.val EXPRESSION
[(ice01)ice01.branch_test1.null, ]
PREHOOK: query: select * from default.ice01.branch_test1
PREHOOK: type: QUERY
PREHOOK: Input: default@ice01@branch_test1
@@ -793,7 +793,7 @@ STAGE PLANS:
Map 1
Map Operator Tree:
TableScan
- alias: ice01
+ alias: ice01.branch_test1
Snapshot ref: branch_test1
Statistics: Num rows: 1 Data size: 192 Basic stats: COMPLETE
Column stats: NONE
Select Operator
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
index a0a0f750080..986dcb7fcbb 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
@@ -548,13 +548,14 @@ public static String
getUnescapedUnqualifiedTableName(ASTNode node) throws Seman
assert node.getChildCount() <= 3;
assert node.getType() == HiveParser.TOK_TABNAME;
- if (node.getChildCount() == 2 || node.getChildCount() == 3) {
+ if (node.getChildCount() == 2) {
node = (ASTNode) node.getChild(1);
+ return getUnescapedName(node);
}
String tableName = getUnescapedName(node);
if (node.getChildCount() == 3) {
- tableName = tableName + "." + node.getChild(2);
+ tableName = getUnescapedName((ASTNode) node.getChild(1)) + "." +
node.getChild(2);
}
return tableName;
}