This is an automated email from the ASF dual-hosted git repository. gopalv 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 5dda1b1 HIVE-22948: QueryCache: Treat query cache locations as temporary storage (Gopal V, reviewed by Vineet Garg) 5dda1b1 is described below commit 5dda1b1ae283493eea2387843cc35440363dfce3 Author: Gopal V <gop...@apache.org> AuthorDate: Sun Mar 29 23:26:18 2020 -0700 HIVE-22948: QueryCache: Treat query cache locations as temporary storage (Gopal V, reviewed by Vineet Garg) Signed-off-by: Gopal V <gop...@apache.org> --- .../plugin/TestHiveAuthorizerCheckInvocation.java | 14 ++++++++++++++ ql/src/java/org/apache/hadoop/hive/ql/Context.java | 16 ++++++++++++++++ .../apache/hadoop/hive/ql/parse/SemanticAnalyzer.java | 4 +++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/security/authorization/plugin/TestHiveAuthorizerCheckInvocation.java b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/security/authorization/plugin/TestHiveAuthorizerCheckInvocation.java index 09d142a..37bb6ad 100644 --- a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/security/authorization/plugin/TestHiveAuthorizerCheckInvocation.java +++ b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/security/authorization/plugin/TestHiveAuthorizerCheckInvocation.java @@ -98,6 +98,7 @@ public class TestHiveAuthorizerCheckInvocation { conf.setBoolVar(ConfVars.HIVE_SERVER2_ENABLE_DOAS, false); conf.setBoolVar(ConfVars.HIVE_SUPPORT_CONCURRENCY, true); conf.setVar(ConfVars.HIVE_TXN_MANAGER, DbTxnManager.class.getName()); + conf.setBoolVar(ConfVars.HIVE_QUERY_RESULTS_CACHE_ENABLED, true); conf.setVar(HiveConf.ConfVars.HIVEMAPREDMODE, "nonstrict"); SessionState.start(conf); @@ -161,6 +162,19 @@ public class TestHiveAuthorizerCheckInvocation { } @Test + public void testQueryCacheIgnored() throws Exception { + + reset(mockedAuthorizer); + int status = driver.compile("select i from " + acidTableName + + " where i > 0 ", true); + assertEquals(0, status); + List<HivePrivilegeObject> outputs = getHivePrivilegeObjectInputs().getRight(); + List<HivePrivilegeObject> inputs = getHivePrivilegeObjectInputs().getLeft(); + assertEquals("No outputs for a select", 0, outputs.size()); + assertEquals("One input for this select", 1, inputs.size()); + } + + @Test public void testInputSomeColumnsUsedJoin() throws Exception { reset(mockedAuthorizer); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/Context.java b/ql/src/java/org/apache/hadoop/hive/ql/Context.java index a85b94c..fd627c6 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/Context.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/Context.java @@ -727,6 +727,22 @@ public class Context { (uriStr.indexOf(MR_PREFIX) != -1); } + /** + * Check if the path is a result cache dir for this query. This doesn't work unless the result + * paths have already been set in SemanticAnalyzer::getDestinationFilePath to prevent someone from + * overriding LOCATION in a create table command to overwrite cached results + * + * @param destinationPath + * @return true if the path is a result cache dir + */ + + public boolean isResultCacheDir(Path destinationPath) { + if (this.fsResultCacheDirs != null) { + return this.fsResultCacheDirs.equals(destinationPath); + } + return false; + } + public Path getMRTmpPath(URI uri) { return new Path(getStagingDir(new Path(uri), !isExplainSkipExecution()), MR_PREFIX + nextPathId()); } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 679ae2e..98317d1 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -7767,7 +7767,9 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { } boolean isDestTempFile = true; - if (!ctx.isMRTmpFileURI(destinationPath.toUri().toString())) { + if (ctx.isMRTmpFileURI(destinationPath.toUri().toString()) == false + && ctx.isResultCacheDir(destinationPath) == false) { + // not a temp dir and not a result cache dir idToTableNameMap.put(String.valueOf(destTableId), destinationPath.toUri().toString()); currentTableId = destTableId; destTableId++;