From 92f919d8c6f3a441df5f23998a46f9d1fb236733 Mon Sep 17 00:00:00 2001 From: Ayush Saxena Date: Sat, 14 Mar 2026 08:18:21 +0530 Subject: [PATCH 1/2] HIVE-29508: Iceberg: Fix alias resolution of Metadata Tables --- .../positive/iceberg_metadata_table_alias.q | 4 ++ .../iceberg_metadata_table_alias.q.out | 51 +++++++++++++++++++ .../hive/ql/parse/BaseSemanticAnalyzer.java | 5 +- 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 iceberg/iceberg-handler/src/test/queries/positive/iceberg_metadata_table_alias.q create mode 100644 iceberg/iceberg-handler/src/test/results/positive/iceberg_metadata_table_alias.q.out 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 000000000000..d6ca7d992a34 --- /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 000000000000..b14d10551b0e --- /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) + 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/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java index a0a0f7500806..986dcb7fcbbb 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; } From fd61df8843434bf9820606e343ef40494e41140b Mon Sep 17 00:00:00 2001 From: Ayush Saxena Date: Sat, 14 Mar 2026 12:07:07 +0530 Subject: [PATCH 2/2] Fix Tests --- ...rg_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 ++-- .../results/positive/query_iceberg_tag.q.out | 4 ++-- .../results/positive/write_iceberg_branch.q.out | 12 ++++++------ 5 files changed, 20 insertions(+), 20 deletions(-) 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 5f6cb0fd48c9..981b8269ad51 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 bf0ec56f24e3..3d75973ab98c 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 330d08b517bf..35c39d9a0783 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 7e5f0ed9373e..27032bec47e0 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 9c80024e09bb..37f0589a9167 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