This is an automated email from the ASF dual-hosted git repository.
ngangam 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 2fccdf1 HIVE-24182: Fix ranger authorization issue with permanent
UDF(Kishen Das via Thejas Nair and Naveen Gangam)
2fccdf1 is described below
commit 2fccdf1cde50a0d326e4b95e1c3dfae9e8d44af6
Author: Kishen Das <[email protected]>
AuthorDate: Sat Sep 19 03:13:57 2020 -0700
HIVE-24182: Fix ranger authorization issue with permanent UDF(Kishen Das
via Thejas Nair and Naveen Gangam)
---
.../plugin/TestHiveAuthorizerCheckInvocation.java | 19 ++++++++++
.../apache/hadoop/hive/ql/exec/FunctionUtils.java | 4 ++
.../org/apache/hadoop/hive/ql/exec/Registry.java | 2 +-
.../hadoop/hive/ql/exec/TestFunctionUtils.java | 43 ++++++++++++++++++++++
4 files changed, 67 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 79d494f..d046822 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
@@ -40,6 +40,7 @@ import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hadoop.hive.metastore.txn.TxnDbUtil;
import org.apache.hadoop.hive.ql.Driver;
+import org.apache.hadoop.hive.ql.exec.Registry;
import org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
import org.apache.hadoop.hive.ql.security.HiveAuthenticationProvider;
import org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator;
@@ -221,6 +222,24 @@ public class TestHiveAuthorizerCheckInvocation {
}
@Test
+ public void testWindowingFunction() throws Exception {
+
+ reset(mockedAuthorizer);
+ int status = driver.compile("select AVG(`i`) OVER (PARTITION BY `city`) AS
iavg FROM " + tableName, true);
+ assertEquals(0, status);
+
+ List<HivePrivilegeObject> inputs =
getHivePrivilegeObjectInputs().getLeft();
+ checkSingleTableInput(inputs);
+ HivePrivilegeObject tableObj = inputs.get(0);
+ // Make sure none of the hive privilege object contain DB name with
WINDOW_FUNC_PREFIX prefix.
+ for (HivePrivilegeObject obj : inputs) {
+ assertTrue(!obj.getDbname().startsWith(Registry.WINDOW_FUNC_PREFIX));
+ }
+ assertEquals("no of columns used", 2, tableObj.getColumns().size());
+ assertEquals("Columns used", Arrays.asList("city", "i"),
getSortedList(tableObj.getColumns()));
+ }
+
+ @Test
public void testCreateTableWithDb() throws Exception {
final String newTable = "ctTableWithDb";
checkCreateViewOrTableWithDb(newTable, "create table " + dbName + "." +
newTable + "(i int)");
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionUtils.java
b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionUtils.java
index c86954c..9a91639 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionUtils.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionUtils.java
@@ -126,6 +126,10 @@ public final class FunctionUtils {
} else if (names.length > 2) {
throw new HiveException("Function name does not have correct format: " +
functionName);
}
+ // Remove the WINDOW_FUNC_PREFIX prefix, as that is not part of the
database name.
+ if (names[0].startsWith(Registry.WINDOW_FUNC_PREFIX)) {
+ names[0] = names[0].substring(Registry.WINDOW_FUNC_PREFIX.length());
+ }
return names;
}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java
b/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java
index 1f6ae08..d686cf5 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java
@@ -73,7 +73,7 @@ public class Registry {
private static final Logger LOG =
LoggerFactory.getLogger(FunctionRegistry.class);
// prefix for window functions, to discern LEAD/LAG UDFs from window
functions with the same name
- private static final String WINDOW_FUNC_PREFIX = "@_";
+ public static final String WINDOW_FUNC_PREFIX = "@_";
/**
* The mapping from expression function names to expression classes.
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionUtils.java
b/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionUtils.java
new file mode 100644
index 0000000..39a36e7
--- /dev/null
+++ b/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionUtils.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.exec;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestFunctionUtils {
+
+ @Test
+ public void testSplitQualifiedFunctionName() throws HiveException {
+
+ String function1 = Registry.WINDOW_FUNC_PREFIX + "database1.function1";
+ String function2 = "database2.function2";
+
+ String[] output1 = FunctionUtils.splitQualifiedFunctionName(function1);
+ Assert.assertEquals("database1", output1[0]);
+ Assert.assertEquals("function1", output1[1]);
+
+ String[] output2 = FunctionUtils.splitQualifiedFunctionName(function2);
+ Assert.assertEquals("database2", output2[0]);
+ Assert.assertEquals("function2", output2[1]);
+
+ }
+
+}
\ No newline at end of file