You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by kg...@apache.org on 2021/11/15 09:00:59 UTC

[hive] branch master updated: HIVE-25365: Insufficient privileges to show partitions when partition columns are authorized (#2515) (Zhihua Deng reviewed by Zoltan Haindrich)

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 <de...@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) {