diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java index 0f472e7..dda2140 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java @@ -3024,7 +3024,9 @@ private void analyzeMetastoreCheck(CommonTree ast) throws SemanticException { tableName = getUnescapedName((ASTNode) ast.getChild(1)); } } - List> specs = getPartitionSpecs(getTable(tableName), ast); + Table tab = getTable(tableName); + List> specs = getPartitionSpecs(tab, ast); + outputs.add(new WriteEntity(tab, WriteEntity.WriteType.DDL_SHARED)); MsckDesc checkDesc = new MsckDesc(tableName, specs, ctx.getResFile(), repair); rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), diff --git a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java index e7bbd54..18b0e1c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/Operation2Privilege.java @@ -161,9 +161,12 @@ public HivePrivilegeObjectType getObjectType() { op2Priv.put(HiveOperationType.DESCFUNCTION, PrivRequirement.newIOPrivRequirement (null, null)); - // meta store check command - require admin priv + // meta store check command - equivalent to add partition command + // no input objects are passed to it currently, but keeping admin priv + // requirement on inputs just in case some input object like file + // uri is added later op2Priv.put(HiveOperationType.MSCK, PrivRequirement.newIOPrivRequirement -(ADMIN_PRIV_AR, null)); +(ADMIN_PRIV_AR, INS_NOGRANT_AR)); //alter table commands require table ownership diff --git a/ql/src/test/queries/clientnegative/authorization_msck.q b/ql/src/test/queries/clientnegative/authorization_msck.q new file mode 100644 index 0000000..8c7edce --- /dev/null +++ b/ql/src/test/queries/clientnegative/authorization_msck.q @@ -0,0 +1,20 @@ +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; +set hive.security.authorization.enabled=true; +set user.name=user1; + +-- check if alter table fails as different user +create table t1(i int); +msck repair table t1; + + +set user.name=user1; +GRANT INSERT ON t1 TO USER user2; + +set user.name=user2; +msck repair table t1; + +set user.name=user3; +msck repair table t1; + diff --git a/ql/src/test/results/clientnegative/authorization_msck.q.out b/ql/src/test/results/clientnegative/authorization_msck.q.out new file mode 100644 index 0000000..7e36488 --- /dev/null +++ b/ql/src/test/results/clientnegative/authorization_msck.q.out @@ -0,0 +1,27 @@ +PREHOOK: query: create table t1(i int) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t1 +POSTHOOK: query: create table t1(i int) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t1 +PREHOOK: query: msck repair table t1 +PREHOOK: type: MSCK +PREHOOK: Output: default@t1 +POSTHOOK: query: msck repair table t1 +POSTHOOK: type: MSCK +POSTHOOK: Output: default@t1 +PREHOOK: query: GRANT INSERT ON t1 TO USER user2 +PREHOOK: type: GRANT_PRIVILEGE +PREHOOK: Output: default@t1 +POSTHOOK: query: GRANT INSERT ON t1 TO USER user2 +POSTHOOK: type: GRANT_PRIVILEGE +POSTHOOK: Output: default@t1 +PREHOOK: query: msck repair table t1 +PREHOOK: type: MSCK +PREHOOK: Output: default@t1 +POSTHOOK: query: msck repair table t1 +POSTHOOK: type: MSCK +POSTHOOK: Output: default@t1 +FAILED: HiveAccessControlException Permission denied: Principal [name=user3, type=USER] does not have following privileges for operation MSCK [[INSERT] on Object [type=TABLE_OR_VIEW, name=default.t1]] diff --git a/ql/src/test/results/clientnegative/msck_repair_1.q.out b/ql/src/test/results/clientnegative/msck_repair_1.q.out index c5f644d..174419f 100644 --- a/ql/src/test/results/clientnegative/msck_repair_1.q.out +++ b/ql/src/test/results/clientnegative/msck_repair_1.q.out @@ -12,8 +12,11 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask diff --git a/ql/src/test/results/clientnegative/msck_repair_2.q.out b/ql/src/test/results/clientnegative/msck_repair_2.q.out index c5f644d..174419f 100644 --- a/ql/src/test/results/clientnegative/msck_repair_2.q.out +++ b/ql/src/test/results/clientnegative/msck_repair_2.q.out @@ -12,8 +12,11 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask diff --git a/ql/src/test/results/clientnegative/msck_repair_3.q.out b/ql/src/test/results/clientnegative/msck_repair_3.q.out index c5f644d..174419f 100644 --- a/ql/src/test/results/clientnegative/msck_repair_3.q.out +++ b/ql/src/test/results/clientnegative/msck_repair_3.q.out @@ -12,8 +12,11 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask diff --git a/ql/src/test/results/clientnegative/table_nonprintable_negative.q.out b/ql/src/test/results/clientnegative/table_nonprintable_negative.q.out index 15af756..8b22480 100644 --- a/ql/src/test/results/clientnegative/table_nonprintable_negative.q.out +++ b/ql/src/test/results/clientnegative/table_nonprintable_negative.q.out @@ -16,4 +16,5 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@table_external PREHOOK: query: msck repair table table_external PREHOOK: type: MSCK +PREHOOK: Output: default@table_external FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask diff --git a/ql/src/test/results/clientpositive/llap/table_nonprintable.q.out b/ql/src/test/results/clientpositive/llap/table_nonprintable.q.out index d7c93f2..c9b962e 100644 --- a/ql/src/test/results/clientpositive/llap/table_nonprintable.q.out +++ b/ql/src/test/results/clientpositive/llap/table_nonprintable.q.out @@ -20,8 +20,10 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@table_external PREHOOK: query: msck repair table table_external PREHOOK: type: MSCK +PREHOOK: Output: default@table_external POSTHOOK: query: msck repair table table_external POSTHOOK: type: MSCK +POSTHOOK: Output: default@table_external Partitions not in metastore: table_external:day=¢Bar Repair: Cannot add partition table_external:day=Foo due to invalid characters in the name Repair: Added partition to metastore table_external:day=¢Bar diff --git a/ql/src/test/results/clientpositive/msck_repair_0.q.out b/ql/src/test/results/clientpositive/msck_repair_0.q.out index c394f9b..3f2fe75 100644 --- a/ql/src/test/results/clientpositive/msck_repair_0.q.out +++ b/ql/src/test/results/clientpositive/msck_repair_0.q.out @@ -12,23 +12,31 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=c/p2=a PREHOOK: query: MSCK REPAIR TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK REPAIR TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=c/p2=a Repair: Added partition to metastore default.repairtable:p1=c/p2=a PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: DROP TABLE default.repairtable PREHOOK: type: DROPTABLE PREHOOK: Input: default@repairtable diff --git a/ql/src/test/results/clientpositive/msck_repair_1.q.out b/ql/src/test/results/clientpositive/msck_repair_1.q.out index c394f9b..3f2fe75 100644 --- a/ql/src/test/results/clientpositive/msck_repair_1.q.out +++ b/ql/src/test/results/clientpositive/msck_repair_1.q.out @@ -12,23 +12,31 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=c/p2=a PREHOOK: query: MSCK REPAIR TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK REPAIR TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=c/p2=a Repair: Added partition to metastore default.repairtable:p1=c/p2=a PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: DROP TABLE default.repairtable PREHOOK: type: DROPTABLE PREHOOK: Input: default@repairtable diff --git a/ql/src/test/results/clientpositive/msck_repair_2.q.out b/ql/src/test/results/clientpositive/msck_repair_2.q.out index c394f9b..3f2fe75 100644 --- a/ql/src/test/results/clientpositive/msck_repair_2.q.out +++ b/ql/src/test/results/clientpositive/msck_repair_2.q.out @@ -12,23 +12,31 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=c/p2=a PREHOOK: query: MSCK REPAIR TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK REPAIR TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=c/p2=a Repair: Added partition to metastore default.repairtable:p1=c/p2=a PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: DROP TABLE default.repairtable PREHOOK: type: DROPTABLE PREHOOK: Input: default@repairtable diff --git a/ql/src/test/results/clientpositive/msck_repair_3.q.out b/ql/src/test/results/clientpositive/msck_repair_3.q.out index c394f9b..3f2fe75 100644 --- a/ql/src/test/results/clientpositive/msck_repair_3.q.out +++ b/ql/src/test/results/clientpositive/msck_repair_3.q.out @@ -12,23 +12,31 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=c/p2=a PREHOOK: query: MSCK REPAIR TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK REPAIR TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=c/p2=a Repair: Added partition to metastore default.repairtable:p1=c/p2=a PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: DROP TABLE default.repairtable PREHOOK: type: DROPTABLE PREHOOK: Input: default@repairtable diff --git a/ql/src/test/results/clientpositive/msck_repair_batchsize.q.out b/ql/src/test/results/clientpositive/msck_repair_batchsize.q.out index 0300f20..a0180b7 100644 --- a/ql/src/test/results/clientpositive/msck_repair_batchsize.q.out +++ b/ql/src/test/results/clientpositive/msck_repair_batchsize.q.out @@ -12,25 +12,33 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=a/p2=a repairtable:p1=b/p2=a repairtable:p1=c/p2=a PREHOOK: query: MSCK REPAIR TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK REPAIR TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=a/p2=a repairtable:p1=b/p2=a repairtable:p1=c/p2=a Repair: Added partition to metastore default.repairtable:p1=a/p2=a Repair: Added partition to metastore default.repairtable:p1=b/p2=a Repair: Added partition to metastore default.repairtable:p1=c/p2=a PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: DROP TABLE default.repairtable PREHOOK: type: DROPTABLE PREHOOK: Input: default@repairtable diff --git a/ql/src/test/results/clientpositive/repair.q.out b/ql/src/test/results/clientpositive/repair.q.out index 86ac031..c183464 100644 --- a/ql/src/test/results/clientpositive/repair.q.out +++ b/ql/src/test/results/clientpositive/repair.q.out @@ -12,24 +12,32 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: MSCK TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=a/p2=a repairtable:p1=b/p2=a PREHOOK: query: MSCK REPAIR TABLE default.repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK REPAIR TABLE default.repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable Partitions not in metastore: repairtable:p1=a/p2=a repairtable:p1=b/p2=a Repair: Added partition to metastore default.repairtable:p1=a/p2=a Repair: Added partition to metastore default.repairtable:p1=b/p2=a PREHOOK: query: MSCK TABLE repairtable PREHOOK: type: MSCK +PREHOOK: Output: default@repairtable POSTHOOK: query: MSCK TABLE repairtable POSTHOOK: type: MSCK +POSTHOOK: Output: default@repairtable PREHOOK: query: DROP TABLE default.repairtable PREHOOK: type: DROPTABLE PREHOOK: Input: default@repairtable