This is an automated email from the ASF dual-hosted git repository. kgyrtkirk 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 209b5e3 HIVE-25365: Insufficient privileges to show partitions when partition columns are authorized (#2515) (Zhihua Deng reviewed by Zoltan Haindrich) 209b5e3 is described below commit 209b5e37b43ddbe6ffcd37815d9600d24fa77882 Author: dengzh <dengzhhu...@gmail.com> AuthorDate: Mon Nov 15 17:00:48 2021 +0800 HIVE-25365: Insufficient privileges to show partitions when partition columns are authorized (#2515) (Zhihua Deng reviewed by Zoltan Haindrich) --- .../partition/show/ShowPartitionAnalyzer.java | 3 + .../hadoop/hive/ql/parse/TestColumnAccess.java | 65 ++++++++++++++-------- 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/show/ShowPartitionAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/show/ShowPartitionAnalyzer.java index a4158d6..40500f1 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/show/ShowPartitionAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/show/ShowPartitionAnalyzer.java @@ -38,6 +38,7 @@ import org.apache.hadoop.hive.ql.hooks.ReadEntity; import org.apache.hadoop.hive.ql.metadata.Table; import org.apache.hadoop.hive.ql.parse.ASTNode; import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer; +import org.apache.hadoop.hive.ql.parse.ColumnAccessInfo; import org.apache.hadoop.hive.ql.parse.HiveParser; import org.apache.hadoop.hive.ql.parse.HiveTableName; import org.apache.hadoop.hive.ql.parse.RowResolver; @@ -76,6 +77,8 @@ public class ShowPartitionAnalyzer extends BaseSemanticAnalyzer { Table table = getTable(HiveTableName.of(tableName)); inputs.add(new ReadEntity(table)); + setColumnAccessInfo(new ColumnAccessInfo()); + table.getPartColNames().forEach(col -> getColumnAccessInfo().add(table.getCompleteName(), col)); ExprNodeDesc filter = getShowPartitionsFilter(table, ast); String orderBy = getShowPartitionsOrder(table, ast); diff --git a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestColumnAccess.java b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestColumnAccess.java index c4e336a..305c170 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestColumnAccess.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestColumnAccess.java @@ -41,6 +41,7 @@ public class TestColumnAccess { Driver driver = createDriver(); driver.run("create table t1(id1 int, name1 string)"); driver.run("create table t2(id2 int, id1 int, name2 string)"); + driver.run("create table t3(id1 int) partitioned by (`date` int, p0 string)"); driver.run("create view v1 as select * from t1"); } @@ -49,6 +50,7 @@ public class TestColumnAccess { Driver driver = createDriver(); driver.run("drop table t1"); driver.run("drop table t2"); + driver.run("drop table t3"); driver.run("drop view v1"); } @@ -64,16 +66,16 @@ public class TestColumnAccess { List<String> cols = columnAccessInfo.getTableToColumnAccessMap().get("default@t1"); Assert.assertNotNull(cols); Assert.assertEquals(2, cols.size()); - Assert.assertNotNull(cols.contains("id1")); - Assert.assertNotNull(cols.contains("name1")); + Assert.assertTrue(cols.contains("id1")); + Assert.assertTrue(cols.contains("name1")); // check access columns from readEntity Map<String, List<String>> tableColsMap = getColsFromReadEntity(plan.getInputs()); cols = tableColsMap.get("default@t1"); Assert.assertNotNull(cols); Assert.assertEquals(2, cols.size()); - Assert.assertNotNull(cols.contains("id1")); - Assert.assertNotNull(cols.contains("name1")); + Assert.assertTrue(cols.contains("id1")); + Assert.assertTrue(cols.contains("name1")); } @Test @@ -88,14 +90,14 @@ public class TestColumnAccess { List<String> cols = columnAccessInfo.getTableToColumnAccessMap().get("default@t1"); Assert.assertNotNull(cols); Assert.assertEquals(2, cols.size()); - Assert.assertNotNull(cols.contains("id1")); - Assert.assertNotNull(cols.contains("name1")); + Assert.assertTrue(cols.contains("id1")); + Assert.assertTrue(cols.contains("name1")); cols = columnAccessInfo.getTableToColumnAccessMap().get("default@t2"); Assert.assertNotNull(cols); Assert.assertEquals(3, cols.size()); - Assert.assertNotNull(cols.contains("id2")); - Assert.assertNotNull(cols.contains("id1")); - Assert.assertNotNull(cols.contains("name1")); + Assert.assertTrue(cols.contains("id2")); + Assert.assertTrue(cols.contains("id1")); + Assert.assertTrue(cols.contains("name2")); // check access columns from readEntity @@ -103,14 +105,14 @@ public class TestColumnAccess { cols = tableColsMap.get("default@t1"); Assert.assertNotNull(cols); Assert.assertEquals(2, cols.size()); - Assert.assertNotNull(cols.contains("id1")); - Assert.assertNotNull(cols.contains("name1")); + Assert.assertTrue(cols.contains("id1")); + Assert.assertTrue(cols.contains("name1")); cols = tableColsMap.get("default@t2"); Assert.assertNotNull(cols); Assert.assertEquals(3, cols.size()); - Assert.assertNotNull(cols.contains("id2")); - Assert.assertNotNull(cols.contains("id1")); - Assert.assertNotNull(cols.contains("name1")); + Assert.assertTrue(cols.contains("id2")); + Assert.assertTrue(cols.contains("id1")); + Assert.assertTrue(cols.contains("name2")); } @Test @@ -129,14 +131,14 @@ public class TestColumnAccess { cols = columnAccessInfo.getTableToColumnAccessMap().get("default@v1"); Assert.assertNotNull(cols); Assert.assertEquals(2, cols.size()); - Assert.assertNotNull(cols.contains("id1")); - Assert.assertNotNull(cols.contains("name1")); + Assert.assertTrue(cols.contains("id1")); + Assert.assertTrue(cols.contains("name1")); cols = columnAccessInfo.getTableToColumnAccessMap().get("default@t2"); Assert.assertNotNull(cols); Assert.assertEquals(3, cols.size()); - Assert.assertNotNull(cols.contains("id2")); - Assert.assertNotNull(cols.contains("id1")); - Assert.assertNotNull(cols.contains("name1")); + Assert.assertTrue(cols.contains("id2")); + Assert.assertTrue(cols.contains("id1")); + Assert.assertTrue(cols.contains("name2")); // check access columns from readEntity @@ -146,14 +148,29 @@ public class TestColumnAccess { cols = tableColsMap.get("default@v1"); Assert.assertNotNull(cols); Assert.assertEquals(2, cols.size()); - Assert.assertNotNull(cols.contains("id1")); - Assert.assertNotNull(cols.contains("name1")); + Assert.assertTrue(cols.contains("id1")); + Assert.assertTrue(cols.contains("name1")); cols = tableColsMap.get("default@t2"); Assert.assertNotNull(cols); Assert.assertEquals(3, cols.size()); - Assert.assertNotNull(cols.contains("id2")); - Assert.assertNotNull(cols.contains("id1")); - Assert.assertNotNull(cols.contains("name1")); + Assert.assertTrue(cols.contains("id2")); + Assert.assertTrue(cols.contains("id1")); + Assert.assertTrue(cols.contains("name2")); + } + + @Test + public void testShowPartitions() throws Exception { + String query = "show partitions t3 where `date` > 20011113"; + Driver driver = createDriver(); + int rc = driver.compile(query, true); + Assert.assertEquals("Checking command success", 0, rc); + QueryPlan plan = driver.getPlan(); + ColumnAccessInfo columnAccessInfo = plan.getColumnAccessInfo(); + List<String> cols = columnAccessInfo.getTableToColumnAccessMap().get("default@t3"); + + Assert.assertEquals(2, cols.size()); + Assert.assertTrue(cols.contains("date")); + Assert.assertTrue(cols.contains("p0")); } private Map<String, List<String>> getColsFromReadEntity(Set<ReadEntity> inputs) {