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 ca0d487..ed17106 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/Context.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/Context.java @@ -114,6 +114,7 @@ new HashMap>(); private final String stagingDir; + private String userName; // Current user name public Context(Configuration conf) throws IOException { this(conf, generateExecutionId()); @@ -713,4 +714,12 @@ public void setCboSucceeded(boolean cboSucceeded) { this.cboSucceeded = cboSucceeded; } + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUserName() { + return this.userName; + } + } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java index 4030075..46f9330 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java @@ -392,6 +392,7 @@ public int compile(String command, boolean resetTaskIds) { command = new VariableSubstitution().substitute(conf, command); ctx = new Context(conf); + ctx.setUserName(userName); ctx.setTryCount(getTryCount()); ctx.setCmd(command); ctx.setHDFSCleanup(true); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/index/AbstractIndexHandler.java b/ql/src/java/org/apache/hadoop/hive/ql/index/AbstractIndexHandler.java index 1d27306..10e87f6 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/index/AbstractIndexHandler.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/index/AbstractIndexHandler.java @@ -34,7 +34,9 @@ * plugin implementations. */ public abstract class AbstractIndexHandler implements HiveIndexHandler { - + protected String userName; // Current user name running indexing. Used if + // integrated with 3rd party security products. + public static String getColumnNames(List fieldSchemas) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < fieldSchemas.size(); i++) { @@ -55,4 +57,12 @@ public void generateIndexQuery(Index index, ExprNodeDesc predicate, public boolean checkQuerySize(long inputSize, HiveConf conf) { return false; } + + /** + * Set the current user name running indexing. + * @param userName + */ + public void setUserName(String userName) { + this.userName = userName; + } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/index/AggregateIndexHandler.java b/ql/src/java/org/apache/hadoop/hive/ql/index/AggregateIndexHandler.java index e67996d..61ac087 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/index/AggregateIndexHandler.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/index/AggregateIndexHandler.java @@ -151,7 +151,7 @@ private void createAggregationFunction(List indexTblCols, String pr builderConf.setBoolVar(HiveConf.ConfVars.HIVEMERGEMAPFILES, false); builderConf.setBoolVar(HiveConf.ConfVars.HIVEMERGEMAPREDFILES, false); builderConf.setBoolVar(HiveConf.ConfVars.HIVEMERGETEZFILES, false); - Task rootTask = IndexUtils.createRootTask(builderConf, inputs, outputs, + Task rootTask = IndexUtils.createRootTask(this.userName, builderConf, inputs, outputs, command, (LinkedHashMap) partSpec, indexTableName, dbName); super.setStatsDir(builderConf); return rootTask; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/index/bitmap/BitmapIndexHandler.java b/ql/src/java/org/apache/hadoop/hive/ql/index/bitmap/BitmapIndexHandler.java index b076933..2ededb6 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/index/bitmap/BitmapIndexHandler.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/index/bitmap/BitmapIndexHandler.java @@ -287,8 +287,8 @@ public void analyzeIndexDefinition(Table baseTable, Index index, throw new HiveException("Cannot construct index without map-side aggregation"); } - Task rootTask = IndexUtils.createRootTask(builderConf, inputs, outputs, - command, partSpec, indexTableName, dbName); + Task rootTask = IndexUtils.createRootTask(this.userName, builderConf, + inputs, outputs, command, partSpec, indexTableName, dbName); super.setStatsDir(builderConf); return rootTask; } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/index/compact/CompactIndexHandler.java b/ql/src/java/org/apache/hadoop/hive/ql/index/compact/CompactIndexHandler.java index 1dbe230..a65425d 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/index/compact/CompactIndexHandler.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/index/compact/CompactIndexHandler.java @@ -148,8 +148,8 @@ public void analyzeIndexDefinition(Table baseTable, Index index, builderConf.setBoolVar(HiveConf.ConfVars.HIVEMERGEMAPFILES, false); builderConf.setBoolVar(HiveConf.ConfVars.HIVEMERGEMAPREDFILES, false); builderConf.setBoolVar(HiveConf.ConfVars.HIVEMERGETEZFILES, false); - Task rootTask = IndexUtils.createRootTask(builderConf, inputs, outputs, - command, partSpec, indexTableName, dbName); + Task rootTask = IndexUtils.createRootTask(this.userName, builderConf, + inputs, outputs, command, partSpec, indexTableName, dbName); super.setStatsDir(builderConf); return rootTask; } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/IndexUtils.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/IndexUtils.java index 92cae67..1d48c8b 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/IndexUtils.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/IndexUtils.java @@ -213,13 +213,30 @@ private static boolean isIndexTableFresh(Hive hive, List indexes, Table s return hive.getIndexes(table.getTTable().getDbName(), table.getTTable().getTableName(), max); } - public static Task createRootTask(HiveConf builderConf, Set inputs, - Set outputs, StringBuilder command, + public static Task createRootTask( + HiveConf builderConf, + Set inputs, + Set outputs, + StringBuilder command, LinkedHashMap partSpec, - String indexTableName, String dbName){ + String indexTableName, + String dbName){ + return createRootTask(null,builderConf, inputs, outputs, command, + partSpec, indexTableName, dbName); + } + + public static Task createRootTask( + String userName, + HiveConf builderConf, + Set inputs, + Set outputs, + StringBuilder command, + LinkedHashMap partSpec, + String indexTableName, + String dbName){ // Don't try to index optimize the query to build the index HiveConf.setBoolVar(builderConf, HiveConf.ConfVars.HIVEOPTINDEXFILTER, false); - Driver driver = new Driver(builderConf); + Driver driver = new Driver(builderConf, userName); driver.compile(command.toString(), false); Task rootTask = driver.getPlan().getRootTasks().get(0); 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 9f8c756..68a8836 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 @@ -19,6 +19,7 @@ package org.apache.hadoop.hive.ql.parse; import com.google.common.collect.Lists; + import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.Tree; import org.apache.commons.logging.Log; @@ -49,6 +50,7 @@ import org.apache.hadoop.hive.ql.exec.Utilities; import org.apache.hadoop.hive.ql.hooks.ReadEntity; import org.apache.hadoop.hive.ql.hooks.WriteEntity; +import org.apache.hadoop.hive.ql.index.AbstractIndexHandler; import org.apache.hadoop.hive.ql.index.HiveIndex; import org.apache.hadoop.hive.ql.index.HiveIndex.IndexType; import org.apache.hadoop.hive.ql.index.HiveIndexHandler; @@ -1215,6 +1217,9 @@ private void analyzeAlterIndexProps(ASTNode ast) String handlerCls = index.getIndexHandlerClass(); HiveIndexHandler handler = HiveUtils.getIndexHandler(conf, handlerCls); + if (handler instanceof AbstractIndexHandler) { + ((AbstractIndexHandler)handler).setUserName(ctx.getUserName()); + } List indexTblPartitions = null; List baseTblPartitions = null;