This is an automated email from the ASF dual-hosted git repository.

gsaihemanth 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 abcca13414d HIVE-29215: Fix owner info for view in authorizable events 
for alter … (#6087)
abcca13414d is described below

commit abcca13414d4fe372975b823f80b9c19e189afcf
Author: Sai Hemanth Gantasala 
<[email protected]>
AuthorDate: Mon Oct 13 10:04:42 2025 -0700

    HIVE-29215: Fix owner info for view in authorizable events for alter … 
(#6087)
---
 .../org/apache/hadoop/hive/ql/ddl/DDLUtils.java    |  5 ++
 .../ql/ddl/view/create/AlterViewAsAnalyzer.java    | 11 +++--
 .../clientnegative/authorization_alter_view.q      | 24 ++++++++++
 .../clientnegative/authorization_alter_view.q.out  | 54 ++++++++++++++++++++++
 .../results/clientpositive/llap/lineage3.q.out     |  2 +-
 5 files changed, 91 insertions(+), 5 deletions(-)

diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/DDLUtils.java 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/DDLUtils.java
index 22a62e2c652..3ee8d74cea9 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/DDLUtils.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/DDLUtils.java
@@ -198,6 +198,11 @@ public static void addDbAndTableToOutputs(Database 
database, TableName tableName
     outputs.add(new WriteEntity(table, WriteEntity.WriteType.DDL_NO_LOCK));
   }
 
+  public static void addDbAndTableToOutputs(Database database, Table table, 
Set<WriteEntity> outputs) {
+    outputs.add(new WriteEntity(database, WriteEntity.WriteType.DDL_SHARED));
+    outputs.add(new WriteEntity(table, WriteEntity.WriteType.DDL_NO_LOCK));
+  }
+
   public static void setColumnsAndStorePartitionTransformSpecOfTable(
           List<FieldSchema> columns, List<FieldSchema> partitionColumns,
           HiveConf conf, Table tbl) {
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/create/AlterViewAsAnalyzer.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/create/AlterViewAsAnalyzer.java
index 329ed84a601..88f741f83eb 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/create/AlterViewAsAnalyzer.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/create/AlterViewAsAnalyzer.java
@@ -67,14 +67,16 @@ public void analyzeInternal(ASTNode root) throws 
SemanticException {
     String expandedText = 
ctx.getTokenRewriteStream().toString(select.getTokenStartIndex(), 
select.getTokenStopIndex());
 
     AlterViewAsDesc desc = new AlterViewAsDesc(fqViewName, schema, 
originalText, expandedText);
-    validateCreateView(desc, analyzer);
+    Table oldView = validateCreateView(desc, analyzer);
+    oldView.setDbName(viewName.getDb());
+    oldView.setTableName(viewName.getTable());
+    oldView.setTableType(TableType.VIRTUAL_VIEW);
 
     rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), 
desc)));
-    DDLUtils.addDbAndTableToOutputs(getDatabase(viewName.getDb()), viewName, 
TableType.VIRTUAL_VIEW, false,
-        null, outputs);
+    DDLUtils.addDbAndTableToOutputs(getDatabase(viewName.getDb()), oldView, 
outputs);
   }
 
-  private void validateCreateView(AlterViewAsDesc desc, SemanticAnalyzer 
analyzer) throws SemanticException {
+  private Table validateCreateView(AlterViewAsDesc desc, SemanticAnalyzer 
analyzer) throws SemanticException {
     validateTablesUsed(analyzer);
 
     Table oldView = null;
@@ -90,5 +92,6 @@ private void validateCreateView(AlterViewAsDesc desc, 
SemanticAnalyzer analyzer)
     }
 
     validateReplaceWithPartitions(desc.getViewName(), oldView, null);
+    return oldView;
   }
 }
diff --git a/ql/src/test/queries/clientnegative/authorization_alter_view.q 
b/ql/src/test/queries/clientnegative/authorization_alter_view.q
new file mode 100644
index 00000000000..25ce3defc30
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/authorization_alter_view.q
@@ -0,0 +1,24 @@
+--! qt:authorizer
+set hive.test.authz.sstd.hs2.mode=true;
+set 
hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryForTest;
+set 
hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+
+-- create db1, tab1, view1 as hive_admin_user
+set user.name=hive_admin_user;
+set role ADMIN;
+
+create database db1;
+create table db1.tab1(i int);
+create view db1.view1 as select * from db1.tab1;
+
+-- grant select privileges on db1 and view1
+GRANT select ON DATABASE db1 TO USER user2;
+GRANT select ON TABLE db1.view1 to USER user2;
+
+-- create db2, tab2 as user2
+set user.name=user2;
+create database db2;
+create table db2.tab2(i int);
+
+-- try to alter view1 as user2 and it should fail as user2 doesn't have 
required privilege
+alter view db1.view1 as select * from db2.tab2
\ No newline at end of file
diff --git a/ql/src/test/results/clientnegative/authorization_alter_view.q.out 
b/ql/src/test/results/clientnegative/authorization_alter_view.q.out
new file mode 100644
index 00000000000..68c0fab6416
--- /dev/null
+++ b/ql/src/test/results/clientnegative/authorization_alter_view.q.out
@@ -0,0 +1,54 @@
+PREHOOK: query: set role ADMIN
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role ADMIN
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: create database db1
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:db1
+POSTHOOK: query: create database db1
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:db1
+PREHOOK: query: create table db1.tab1(i int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:db1
+PREHOOK: Output: db1@tab1
+POSTHOOK: query: create table db1.tab1(i int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:db1
+POSTHOOK: Output: db1@tab1
+PREHOOK: query: create view db1.view1 as select * from db1.tab1
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: db1@tab1
+PREHOOK: Output: database:db1
+PREHOOK: Output: db1@view1
+POSTHOOK: query: create view db1.view1 as select * from db1.tab1
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: db1@tab1
+POSTHOOK: Output: database:db1
+POSTHOOK: Output: db1@view1
+POSTHOOK: Lineage: view1.i SIMPLE [(tab1)tab1.FieldSchema(name:i, type:int, 
comment:null), ]
+PREHOOK: query: GRANT select ON DATABASE db1 TO USER user2
+PREHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: query: GRANT select ON DATABASE db1 TO USER user2
+POSTHOOK: type: GRANT_PRIVILEGE
+PREHOOK: query: GRANT select ON TABLE db1.view1 to USER user2
+PREHOOK: type: GRANT_PRIVILEGE
+PREHOOK: Output: db1@view1
+POSTHOOK: query: GRANT select ON TABLE db1.view1 to USER user2
+POSTHOOK: type: GRANT_PRIVILEGE
+POSTHOOK: Output: db1@view1
+PREHOOK: query: create database db2
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:db2
+POSTHOOK: query: create database db2
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:db2
+PREHOOK: query: create table db2.tab2(i int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:db2
+PREHOOK: Output: db2@tab2
+POSTHOOK: query: create table db2.tab2(i int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:db2
+POSTHOOK: Output: db2@tab2
+FAILED: HiveAccessControlException Permission denied: Principal [name=user2, 
type=USER] does not have following privileges for operation ALTERVIEW_AS 
[[OBJECT OWNERSHIP] on Object [type=DATABASE, name=db1], [OBJECT OWNERSHIP] on 
Object [type=TABLE_OR_VIEW, name=db1.view1]]
diff --git a/ql/src/test/results/clientpositive/llap/lineage3.q.out 
b/ql/src/test/results/clientpositive/llap/lineage3.q.out
index 8ea78bcc827..e00fcd21fd0 100644
--- a/ql/src/test/results/clientpositive/llap/lineage3.q.out
+++ b/ql/src/test/results/clientpositive/llap/lineage3.q.out
@@ -321,7 +321,7 @@ PREHOOK: type: ALTERVIEW_AS
 PREHOOK: Input: default@alltypesorc
 PREHOOK: Output: database:default
 PREHOOK: Output: default@dest_v3
-{"version":"1.0","engine":"tez","database":"default","hash":"81bb549360513aeae39a3bd971405be3","queryText":"alter
 view dest_v3 as\n  select * from (\n    select sum(a.ctinyint) over (partition 
by a.csmallint order by a.csmallint) a,\n      count(b.cstring1) x, 
b.cboolean1\n    from alltypesorc a join alltypesorc b on (a.cint = b.cint)\n   
 where a.cboolean2 = true and b.cfloat > 0\n    group by a.ctinyint, 
a.csmallint, b.cboolean1\n    having count(a.cint) > 10\n    order by a, x, 
b.cboo [...]
+{"version":"1.0","engine":"tez","database":"default","hash":"81bb549360513aeae39a3bd971405be3","queryText":"alter
 view dest_v3 as\n  select * from (\n    select sum(a.ctinyint) over (partition 
by a.csmallint order by a.csmallint) a,\n      count(b.cstring1) x, 
b.cboolean1\n    from alltypesorc a join alltypesorc b on (a.cint = b.cint)\n   
 where a.cboolean2 = true and b.cfloat > 0\n    group by a.ctinyint, 
a.csmallint, b.cboolean1\n    having count(a.cint) > 10\n    order by a, x, 
b.cboo [...]
 PREHOOK: query: select * from dest_v3 limit 2
 PREHOOK: type: QUERY
 PREHOOK: Input: default@alltypesorc

Reply via email to