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

stigahuang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git


The following commit(s) were added to refs/heads/master by this push:
     new ed91dc69a IMPALA-10986 (Addendum): Add and refactor some E2E tests
ed91dc69a is described below

commit ed91dc69a16d764093b84ba65452259c49e9f34e
Author: Fang-Yu Rao <[email protected]>
AuthorDate: Mon Jan 2 11:49:54 2023 -0800

    IMPALA-10986 (Addendum): Add and refactor some E2E tests
    
    This patch adds an additional test case in test_select_function to
    verify Impala's behavior when a user tries to execute a UDF in an INSERT
    statement. Moreover, some test functions added in IMPALA-10986 are
    refactored according to reviewers' suggestion.
    
    Change-Id: Ieb4f69934401a745da66a983528a7a3679279c28
    Reviewed-on: http://gerrit.cloudera.org:8080/19394
    Reviewed-by: Impala Public Jenkins <[email protected]>
    Tested-by: Impala Public Jenkins <[email protected]>
---
 tests/authorization/test_ranger.py | 491 ++++++++++++++++++-------------------
 1 file changed, 244 insertions(+), 247 deletions(-)

diff --git a/tests/authorization/test_ranger.py 
b/tests/authorization/test_ranger.py
index 95e64cf43..e90e27055 100644
--- a/tests/authorization/test_ranger.py
+++ b/tests/authorization/test_ranger.py
@@ -190,6 +190,12 @@ class TestRanger(CustomClusterTestSuite):
       admin_client.execute("drop database if exists {0} 
cascade".format(unique_database),
                            user=ADMIN)
 
+  def _update_privileges_and_verify(self, admin_client, update_stmt, 
show_grant_stmt,
+                                    expected_privileges):
+    admin_client.execute(update_stmt)
+    result = self.client.execute(show_grant_stmt)
+    TestRanger._check_privileges(result, expected_privileges)
+
   @pytest.mark.execute_serially
   @CustomClusterTestSuite.with_args(
     impalad_args=IMPALAD_ARGS, catalogd_args=CATALOGD_ARGS)
@@ -320,39 +326,39 @@ class TestRanger(CustomClusterTestSuite):
   def _test_show_grant_mask_on_udf(self, admin_client, kw, id, 
unique_database, udf):
     try:
       # Grant the CREATE privilege and verify.
-      admin_client.execute("grant create on user_defined_fn {0}.{1} to {2} {3}"
-                           .format(unique_database, udf, kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
{2}.{3}"
-                                   .format(kw, id, unique_database, udf))
-      TestRanger._check_privileges(result, [
-        [kw, id, unique_database, "", "", "", "", "", udf, "create", "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant create on user_defined_fn {0}.{1} to {2} {3}"
+          .format(unique_database, udf, kw, id),
+          "show grant {0} {1} on user_defined_fn {2}.{3}"
+          .format(kw, id, unique_database, udf), [
+              [kw, id, unique_database, "", "", "", "", "", udf, "create", 
"false"]])
 
       # Grant the DROP privilege and verify.
-      admin_client.execute("grant drop on user_defined_fn {0}.{1} to {2} {3}"
-                           .format(unique_database, udf, kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
{2}.{3}"
-                                   .format(kw, id, unique_database, udf))
-      TestRanger._check_privileges(result, [
-        [kw, id, unique_database, "", "", "", "", "", udf, "create", "false"],
-        [kw, id, unique_database, "", "", "", "", "", udf, "drop", "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant drop on user_defined_fn {0}.{1} to {2} {3}"
+          .format(unique_database, udf, kw, id),
+          "show grant {0} {1} on user_defined_fn {2}.{3}"
+          .format(kw, id, unique_database, udf), [
+              [kw, id, unique_database, "", "", "", "", "", udf, "create", 
"false"],
+              [kw, id, unique_database, "", "", "", "", "", udf, "drop", 
"false"]])
 
       # Grant the SELECT privilege and verify.
-      admin_client.execute("grant select on user_defined_fn {0}.{1} to {2} {3}"
-                           .format(unique_database, udf, kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
{2}.{3}"
-                                   .format(kw, id, unique_database, udf))
-      TestRanger._check_privileges(result, [
-        [kw, id, unique_database, "", "", "", "", "", udf, "create", "false"],
-        [kw, id, unique_database, "", "", "", "", "", udf, "drop", "false"],
-        [kw, id, unique_database, "", "", "", "", "", udf, "select", "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant select on user_defined_fn {0}.{1} to {2} {3}"
+          .format(unique_database, udf, kw, id),
+          "show grant {0} {1} on user_defined_fn {2}.{3}"
+          .format(kw, id, unique_database, udf), [
+              [kw, id, unique_database, "", "", "", "", "", udf, "create", 
"false"],
+              [kw, id, unique_database, "", "", "", "", "", udf, "drop", 
"false"],
+              [kw, id, unique_database, "", "", "", "", "", udf, "select", 
"false"]])
 
       # Grant the ALL privilege and verify other privileges are masked.
-      admin_client.execute("grant all on user_defined_fn {0}.{1} to {2} {3}"
-                           .format(unique_database, udf, kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
{2}.{3}"
-                                   .format(kw, id, unique_database, udf))
-      TestRanger._check_privileges(result, [
-        [kw, id, unique_database, "", "", "", "", "", udf, "all", "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant all on user_defined_fn {0}.{1} to {2} {3}"
+          .format(unique_database, udf, kw, id),
+          "show grant {0} {1} on user_defined_fn {2}.{3}"
+          .format(kw, id, unique_database, udf), [
+              [kw, id, unique_database, "", "", "", "", "", udf, "all", 
"false"]])
     finally:
       admin_client.execute("revoke create on user_defined_fn {0}.{1} from {2} 
{3}"
                            .format(unique_database, udf, kw, id))
@@ -371,176 +377,164 @@ class TestRanger(CustomClusterTestSuite):
     storagehandler_uri = 'kudu://localhost/impala::tpch_kudu.nation'
     try:
       # Grant server privileges and verify
-      admin_client.execute("grant all on server to {0} {1}".format(kw, id), 
user=ADMIN)
-      result = self.client.execute("show grant {0} {1} on server".format(kw, 
id))
-      TestRanger._check_privileges(result, [
-          [kw, id, "", "", "", "", "*", "*", "", "rwstorage", "false"],
-          [kw, id, "", "", "", "*", "", "", "", "all", "false"],
-          [kw, id, "*", "", "", "", "", "", "*", "all", "false"],
-          [kw, id, "*", "*", "*", "", "", "", "", "all", "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant all on server to {0} {1}".format(kw, id),
+          "show grant {0} {1} on server".format(kw, id), [
+              [kw, id, "", "", "", "", "*", "*", "", "rwstorage", "false"],
+              [kw, id, "", "", "", "*", "", "", "", "all", "false"],
+              [kw, id, "*", "", "", "", "", "", "*", "all", "false"],
+              [kw, id, "*", "*", "*", "", "", "", "", "all", "false"]])
 
       # Revoke server privileges and verify
-      admin_client.execute("revoke all on server from {0} {1}".format(kw, id))
-      result = self.client.execute("show grant {0} {1} on server".format(kw, 
id))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client, "revoke all on server from {0} {1}".format(kw, id),
+          "show grant {0} {1} on server".format(kw, id), [])
 
       # Grant uri privileges and verify
-      admin_client.execute("grant all on uri '{0}' to {1} {2}"
-                           .format(uri, kw, id))
-      result = self.client.execute("show grant {0} {1} on uri '{2}'"
-                                   .format(kw, id, uri))
-      TestRanger._check_privileges(result, [
-          [kw, id, "", "", "", "{0}{1}".format(NAMENODE, '/tmp'), "", "", "", 
"all",
-           "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant all on uri '{0}' to {1} {2}".format(uri, kw, 
id),
+          "show grant {0} {1} on uri '{2}'".format(kw, id, uri), [
+              [kw, id, "", "", "", "{0}{1}".format(NAMENODE, '/tmp'), "", "", 
"", "all",
+               "false"]])
 
       # Revoke uri privileges and verify
-      admin_client.execute("revoke all on uri '{0}' from {1} {2}"
-                           .format(uri, kw, id))
-      result = self.client.execute("show grant {0} {1} on uri '{2}'"
-                                   .format(kw, id, uri))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client, "revoke all on uri '{0}' from {1} {2}".format(uri, kw, 
id),
+          "show grant {0} {1} on uri '{2}'".format(kw, id, uri), [])
 
       # Grant storage handler URI privilege and verify
-      admin_client.execute("grant rwstorage on storagehandler_uri '{0}' to {1} 
{2}"
-                          .format(storagehandler_uri, kw, id))
-      result = self.client.execute("show grant {0} {1} on storagehandler_uri 
'{2}'"
-                                   .format(kw, id, storagehandler_uri))
-      TestRanger._check_privileges(result, [
-          [kw, id, "", "", "", "", "kudu", 
"localhost/impala::tpch_kudu.nation", "",
-          "rwstorage", "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant rwstorage on storagehandler_uri '{0}' to {1} 
{2}"
+          .format(storagehandler_uri, kw, id),
+          "show grant {0} {1} on storagehandler_uri '{2}'"
+          .format(kw, id, storagehandler_uri), [
+              [kw, id, "", "", "", "", "kudu", 
"localhost/impala::tpch_kudu.nation", "",
+               "rwstorage", "false"]])
 
       # Grant the rwstorage privilege on a database does not result in the 
grantee being
       # granted the privilege on the database.
-      admin_client.execute("grant rwstorage on database {0} to {1} {2}"
-                          .format(database, kw, id))
-      result = self.client.execute("show grant {0} {1} on database {2}"
-                                  .format(kw, id, database))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client,
+          "grant rwstorage on database {0} to {1} {2}".format(database, kw, 
id),
+          "show grant {0} {1} on database {2}".format(kw, id, database), [])
 
       # Grant the rwstorage privilege on a table does not result in the 
grantee being
       # granted the privilege on the table.
-      admin_client.execute("grant rwstorage on table {0}.{1} to {2} {3}"
-                          .format(database, table, kw, id))
-      result = self.client.execute("show grant {0} {1} on table {2}.{3}"
-                                  .format(kw, id, database, table))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client,
+          "grant rwstorage on table {0}.{1} to {2} {3}".format(database, 
table, kw, id),
+          "show grant {0} {1} on table {2}.{3}".format(kw, id, database, 
table), [])
 
       # Revoke storage handler URI privilege and verify
-      admin_client.execute("revoke rwstorage on storagehandler_uri '{0}' from 
{1} {2}"
-                           .format(storagehandler_uri, kw, id))
-      result = self.client.execute("show grant {0} {1} on storagehandler_uri 
'{2}'"
-                                   .format(kw, id, storagehandler_uri))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client, "revoke rwstorage on storagehandler_uri '{0}' from {1} 
{2}"
+          .format(storagehandler_uri, kw, id),
+          "show grant {0} {1} on storagehandler_uri '{2}'"
+          .format(kw, id, storagehandler_uri), [])
 
       # Grant database privileges and verify
-      admin_client.execute("grant select on database {0} to {1} {2}"
-                           .format(unique_database, kw, id))
-      result = self.client.execute("show grant {0} {1} on database {2}"
-                                   .format(kw, id, unique_database))
-      TestRanger._check_privileges(result, [
-          [kw, id, unique_database, "", "", "", "", "", "*", "select", 
"false"],
-          [kw, id, unique_database, "*", "*", "", "", "", "", "select", 
"false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant select on database {0} to {1} {2}"
+          .format(unique_database, kw, id),
+          "show grant {0} {1} on database {2}".format(kw, id, 
unique_database), [
+              [kw, id, unique_database, "", "", "", "", "", "*", "select", 
"false"],
+              [kw, id, unique_database, "*", "*", "", "", "", "", "select", 
"false"]])
 
       # Revoke database privileges and verify
-      admin_client.execute("revoke select on database {0} from {1} {2}"
-                           .format(unique_database, kw, id))
-      result = self.client.execute("show grant {0} {1} on database {2}"
-                                   .format(kw, id, unique_database))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client, "revoke select on database {0} from {1} {2}"
+          .format(unique_database, kw, id),
+          "show grant {0} {1} on database {2}".format(kw, id, 
unique_database), [])
 
       # Grant table privileges and verify
-      admin_client.execute("grant select on table {0}.{1} to {2} {3}"
-                           .format(unique_database, unique_table, kw, id))
-      result = self.client.execute("show grant {0} {1} on table {2}.{3}"
-                                   .format(kw, id, unique_database, 
unique_table))
-      TestRanger._check_privileges(result, [
-          [kw, id, unique_database, unique_table, "*", "", "", "", "", 
"select",
-           "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant select on table {0}.{1} to {2} {3}"
+          .format(unique_database, unique_table, kw, id),
+          "show grant {0} {1} on table {2}.{3}"
+          .format(kw, id, unique_database, unique_table), [
+              [kw, id, unique_database, unique_table, "*", "", "", "", "", 
"select",
+               "false"]])
 
       # Revoke table privileges and verify
-      admin_client.execute("revoke select on table {0}.{1} from {2} {3}"
-                           .format(unique_database, unique_table, kw, id))
-      result = self.client.execute("show grant {0} {1} on table {2}.{3}"
-                                   .format(kw, id, unique_database, 
unique_table))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client, "revoke select on table {0}.{1} from {2} {3}"
+          .format(unique_database, unique_table, kw, id),
+          "show grant {0} {1} on table {2}.{3}"
+          .format(kw, id, unique_database, unique_table), [])
 
       # Grant a privilege on a UDF with a wildcard for both database name and 
function
       # name.
-      admin_client.execute("grant select on user_defined_fn `*`.`*` to {0} {1}"
-                           .format(kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
`*`.`*`"
-                                   .format(kw, id))
-      TestRanger._check_privileges(result, [
-        [kw, id, "*", "", "", "", "", "", "*", "select", "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant select on user_defined_fn `*`.`*` to {0} {1}"
+          .format(kw, id),
+          "show grant {0} {1} on user_defined_fn `*`.`*`".format(kw, id), [
+              [kw, id, "*", "", "", "", "", "", "*", "select", "false"]])
 
       # Revoke the granted privilege and verify.
-      admin_client.execute("revoke select on user_defined_fn `*`.`*` from {0} 
{1}"
-                           .format(kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
`*`.`*`"
-                                   .format(kw, id))
-      TestRanger._check_privileges(result, [])
-
-      # Grant a privilege on a UDF with a wildcard for functional name.
-      admin_client.execute("grant select on user_defined_fn {0}.`*` to {1} {2}"
-                           .format(unique_database, kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
{2}.`*`"
-                                   .format(kw, id, unique_database))
-      TestRanger._check_privileges(result, [
-        [kw, id, unique_database, "", "", "", "", "", "*", "select", "false"]])
+      self._update_privileges_and_verify(
+          admin_client,
+          "revoke select on user_defined_fn `*`.`*` from {0} {1}".format(kw, 
id),
+          "show grant {0} {1} on user_defined_fn `*`.`*`".format(kw, id), [])
+
+      # Grant a privilege on a UDF with functional name in wildcard.
+      self._update_privileges_and_verify(
+          admin_client, "grant select on user_defined_fn {0}.`*` to {1} {2}"
+          .format(unique_database, kw, id),
+          "show grant {0} {1} on user_defined_fn {2}.`*`"
+          .format(kw, id, unique_database), [
+              [kw, id, unique_database, "", "", "", "", "", "*", "select", 
"false"]])
 
       # Revoke the granted privilege and verify.
-      admin_client.execute("revoke select on user_defined_fn {0}.`*` from {1} 
{2}"
-                           .format(unique_database, kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
{2}.`*`"
-                                   .format(kw, id, unique_database))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client, "revoke select on user_defined_fn {0}.`*` from {1} {2}"
+          .format(unique_database, kw, id),
+          "show grant {0} {1} on user_defined_fn {2}.`*`"
+          .format(kw, id, unique_database), [])
 
       # Grant a privilege on a UDF with a wildcard for database name but a
       # non-wildcard for functional name.
-      admin_client.execute("grant select on user_defined_fn `*`.{0} to {1} {2}"
-                           .format(udf, kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
`*`.{2}"
-                                   .format(kw, id, udf))
-      TestRanger._check_privileges(result, [
-        [kw, id, "*", "", "", "", "", "", udf, "select", "false"]])
+      self._update_privileges_and_verify(
+          admin_client,
+          "grant select on user_defined_fn `*`.{0} to {1} {2}".format(udf, kw, 
id),
+          "show grant {0} {1} on user_defined_fn `*`.{2}".format(kw, id, udf), 
[
+              [kw, id, "*", "", "", "", "", "", udf, "select", "false"]])
 
       # Revoke the granted privilege and verify.
-      admin_client.execute("revoke select on user_defined_fn `*`.{0} from {1} 
{2}"
-                           .format(udf, kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
`*`.{2}"
-                                   .format(kw, id, udf))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client,
+          "revoke select on user_defined_fn `*`.{0} from {1} {2}".format(udf, 
kw, id),
+          "show grant {0} {1} on user_defined_fn `*`.{2}".format(kw, id, udf), 
[])
 
       # Grant a privilege on a UDF and verify.
-      admin_client.execute("grant select on user_defined_fn {0}.{1} to {2} {3}"
-                           .format(unique_database, udf, kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
{2}.{3}"
-                                   .format(kw, id, unique_database, udf))
-      TestRanger._check_privileges(result, [
-        [kw, id, unique_database, "", "", "", "", "", udf, "select", "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant select on user_defined_fn {0}.{1} to {2} {3}"
+          .format(unique_database, udf, kw, id),
+          "show grant {0} {1} on user_defined_fn {2}.{3}"
+          .format(kw, id, unique_database, udf), [
+              [kw, id, unique_database, "", "", "", "", "", udf, "select", 
"false"]])
 
       # Revoke the granted privilege and verify.
-      admin_client.execute("revoke select on user_defined_fn {0}.{1} from {2} 
{3}"
-                           .format(unique_database, udf, kw, id))
-      result = self.client.execute("show grant {0} {1} on user_defined_fn 
{2}.{3}"
-                                   .format(kw, id, unique_database, udf))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client, "revoke select on user_defined_fn {0}.{1} from {2} {3}"
+          .format(unique_database, udf, kw, id),
+          "show grant {0} {1} on user_defined_fn {2}.{3}"
+          .format(kw, id, unique_database, udf), [])
 
       # Grant column privileges and verify
-      admin_client.execute("grant select(x) on table {0}.{1} to {2} {3}"
-                           .format(unique_database, unique_table, kw, id))
-      result = self.client.execute("show grant {0} {1} on column {2}.{3}.x"
-                                   .format(kw, id, unique_database, 
unique_table))
-      TestRanger._check_privileges(result, [
-          [kw, id, unique_database, unique_table, "x", "", "", "", "", 
"select",
-           "false"]])
+      self._update_privileges_and_verify(
+          admin_client, "grant select(x) on table {0}.{1} to {2} {3}"
+          .format(unique_database, unique_table, kw, id),
+          "show grant {0} {1} on column {2}.{3}.x"
+          .format(kw, id, unique_database, unique_table), [
+              [kw, id, unique_database, unique_table, "x", "", "", "", "", 
"select",
+               "false"]])
 
       # Revoke column privileges and verify
-      admin_client.execute("revoke select(x) on table {0}.{1} from {2} {3}"
-                           .format(unique_database, unique_table, kw, id))
-      result = self.client.execute("show grant {0} {1} on column {2}.{3}.x"
-                                   .format(kw, id, unique_database, 
unique_table))
-      TestRanger._check_privileges(result, [])
+      self._update_privileges_and_verify(
+          admin_client, "revoke select(x) on table {0}.{1} from {2} {3}"
+          .format(unique_database, unique_table, kw, id),
+          "show grant {0} {1} on column {2}.{3}.x"
+          .format(kw, id, unique_database, unique_table), [])
     finally:
       admin_client.execute("revoke all on server from {0} {1}".format(kw, id))
       admin_client.execute("revoke all on uri '{0}' from {1} {2}"
@@ -1186,102 +1180,105 @@ class TestRanger(CustomClusterTestSuite):
                            "'{1}/test-warehouse/impala-hive-udfs.jar' "
                            "SYMBOL='org.apache.impala.TestUdf'"
                            .format(unique_database, fs_prefix), user=ADMIN)
-
-      # A user not granted any privilege is not allowed to execute the UDF.
-      result = self._run_query_as_user("select 
{0}.identity(1)".format(unique_database),
-                                       test_user, False)
-      err = "User '{0}' does not have privileges to SELECT functions in: " \
-            "{1}.identity".format(test_user, unique_database)
-      assert err in str(result)
-
-      view_metadata_privileges = ["select", "insert", "refresh"]
-      for privilege_on_database in view_metadata_privileges:
-        try:
-          # A user is allowed to execute a UDF in a database if the user has 
been granted
-          # the SELECT privilege on the database. Such a privilege covers all 
the tables,
-          # columns, as well as UDFs in the database.
-          admin_client.execute("grant {0} on database {1} to user {2}"
-                               .format(privilege_on_database, unique_database, 
test_user),
-                               user=ADMIN)
-          result = admin_client.execute("show grant user {0} on database {1}"
-                               .format(test_user, unique_database), user=ADMIN)
-          TestRanger._check_privileges(result, [
-              ["USER", test_user, unique_database, "", "", "", "", "", "*",
-               privilege_on_database, "false"],
-              ["USER", test_user, unique_database, "*", "*", "", "", "", "",
-               privilege_on_database, "false"]])
-          # Query succeeds only if 'privilege_on_database' is "select".
-          if privilege_on_database != "select":
-            result = self._run_query_as_user("select {0}.identity(1)"
-                                             .format(unique_database), 
test_user, False)
+      # Create a temporary table and grant 'test_user' the INSERT privilege on 
the table,
+      # which is necessary for 'test_user' to insert values into a table.
+      admin_client.execute("create table {0}.tbl (id 
bigint)".format(unique_database))
+      admin_client.execute("grant insert on table {0}.tbl to user {1}"
+                           .format(unique_database, test_user))
+
+      stmts = ["select {0}.identity(1)".format(unique_database),
+               "insert into {0}.tbl values 
({0}.identity(1))".format(unique_database)]
+      for stmt in stmts:
+        # A user not granted any privilege is not allowed to execute the UDF.
+        result = self._run_query_as_user(stmt, test_user, False)
+        err = "User '{0}' does not have privileges to SELECT functions in: " \
+              "{1}.identity".format(test_user, unique_database)
+        assert err in str(result)
+
+        view_metadata_privileges = ["select", "insert", "refresh"]
+        for privilege_on_database in view_metadata_privileges:
+          try:
+            # A user is allowed to execute a UDF in a database if the user has 
been
+            # granted the SELECT privilege on the database. Such a privilege 
covers all
+            # the tables, columns, as well as UDFs in the database.
+            self._update_privileges_and_verify(
+                admin_client, "grant {0} on database {1} to user {2}"
+                .format(privilege_on_database, unique_database, test_user),
+                "show grant user {0} on database {1}"
+                .format(test_user, unique_database), [
+                    ["USER", test_user, unique_database, "", "", "", "", "", 
"*",
+                     privilege_on_database, "false"],
+                    ["USER", test_user, unique_database, "*", "*", "", "", "", 
"",
+                     privilege_on_database, "false"]])
+            # Query succeeds only if 'privilege_on_database' is "select".
+            if privilege_on_database != "select":
+              result = self._run_query_as_user(stmt, test_user, False)
+              err = "User '{0}' does not have privileges to SELECT functions 
in: " \
+                    "{1}.identity".format(test_user, unique_database)
+              assert err in str(result)
+            else:
+              self._run_query_as_user(stmt, test_user, True)
+
+            # A user not being granted the SELECT privilege on any UDF in the 
database is
+            # not allowed to execute the UDF even though the user has
+            # the 'privilege_on_database' privilege on all the tables, columns 
in the
+            # database.
+            self._update_privileges_and_verify(
+                admin_client, "revoke {0} on user_defined_fn {1}.`*` from user 
{2}"
+                .format(privilege_on_database, unique_database, test_user),
+                "show grant user {0} on database {1}"
+                .format(test_user, unique_database), [
+                    ["USER", test_user, unique_database, "*", "*", "", "", "", 
"",
+                     privilege_on_database, "false"]])
+            result = self._run_query_as_user(stmt, test_user, False)
             err = "User '{0}' does not have privileges to SELECT functions in: 
" \
                   "{1}.identity".format(test_user, unique_database)
             assert err in str(result)
-          else:
-            self._run_query_as_user("select 
{0}.identity(1)".format(unique_database),
-                                    test_user, True)
-
-          # A user not being granted the SELECT privilege on any UDF in the 
database is
-          # not allowed to execute the UDF even though the user has
-          # the 'privilege_on_database' privilege on all the tables, columns 
in the
-          # database.
-          admin_client.execute("revoke {0} on user_defined_fn {1}.`*` from 
user {2}"
-                               .format(privilege_on_database, unique_database,
-                               test_user), user=ADMIN)
-          result = admin_client.execute("show grant user {0} on database {1}"
-                                        .format(test_user, unique_database), 
user=ADMIN)
-          TestRanger._check_privileges(result, [
-            ["USER", test_user, unique_database, "*", "*", "", "", "", "",
-             privilege_on_database, "false"]])
-          result = self._run_query_as_user("select {0}.identity(1)"
-                                           .format(unique_database), 
test_user, False)
-          err = "User '{0}' does not have privileges to SELECT functions in: " 
\
-                "{1}.identity".format(test_user, unique_database)
-          assert err in str(result)
-
-          # A user is allowed to execute the UDF if the user is explicitly 
granted the
-          # SELECT privilege on the UDF.
-          admin_client.execute("grant select on user_defined_fn {0}.identity 
to user {1}"
-                               .format(unique_database, test_user), user=ADMIN)
-          result = admin_client.execute("show grant user {0} "
-                                        "on user_defined_fn {1}.identity"
-                                        .format(test_user, unique_database), 
user=ADMIN)
-          TestRanger._check_privileges(result, [
-              ["USER", test_user, unique_database, "", "", "", "", "", 
"identity",
-               "select", "false"]])
-          self._run_query_as_user("select 
{0}.identity(1)".format(unique_database),
-                                  test_user, True)
-
-          # Even though a user is explicitly granted the SELECT privilege on 
the UDF, the
-          # user is not allowed to execute the UDF if the user is not granted 
any of the
-          # SELECT, INSERT, or REFRESH privileges on all the tables and 
columns in the
-          # database.
-          admin_client.execute("revoke {0} on database {1} from user {2}"
-                               .format(privilege_on_database, unique_database,
-                                       test_user), user=ADMIN)
-          result = admin_client.execute("show grant user {0} on database {1}"
-                                        .format(test_user, unique_database), 
user=ADMIN)
-          TestRanger._check_privileges(result, [])
-          result = admin_client.execute("show grant user {0} "
-                                        "on user_defined_fn {1}.identity"
-                                        .format(test_user, unique_database), 
user=ADMIN)
-          TestRanger._check_privileges(result, [
-              ["USER", test_user, unique_database, "", "", "", "", "", 
"identity",
-               "select", "false"]])
-          result = self._run_query_as_user("select {0}.identity(1)"
-                                           .format(unique_database), 
test_user, False)
-          err = "User '{0}' does not have privileges to access: {1}"\
-                .format(test_user, unique_database)
-          assert err in str(result)
-        finally:
-          # Revoke the granted privileges.
-          admin_client.execute("revoke {0} on database {1} from user {2}"
-                               .format(privilege_on_database, unique_database,
-                                       test_user), user=ADMIN)
-          admin_client.execute("revoke select on user_defined_fn {0}.identity "
-                               "from user {1}"
-                               .format(unique_database, test_user), user=ADMIN)
+
+            # A user is allowed to execute the UDF if the user is explicitly 
granted the
+            # SELECT privilege on the UDF.
+            self._update_privileges_and_verify(
+                admin_client, "grant select on user_defined_fn {0}.identity to 
user {1}"
+                .format(unique_database, test_user),
+                "show grant user {0} on user_defined_fn {1}.identity"
+                .format(test_user, unique_database), [
+                    ["USER", test_user, unique_database, "", "", "", "", "", 
"identity",
+                     "select", "false"]])
+            self._run_query_as_user(stmt, test_user, True)
+
+            # Even though a user is explicitly granted the SELECT privilege on 
the UDF,
+            # the user is not allowed to execute the UDF if the user is not 
granted any
+            # of the SELECT, INSERT, or REFRESH privileges on all the tables 
and columns
+            # in the database.
+            self._update_privileges_and_verify(
+                admin_client, "revoke {0} on database {1} from user {2}"
+                .format(privilege_on_database, unique_database, test_user),
+                "show grant user {0} on database {1}".format(test_user, 
unique_database),
+                [])
+            result = admin_client.execute("show grant user {0} "
+                                          "on user_defined_fn {1}.identity"
+                                          .format(test_user, unique_database),
+                                          user=ADMIN)
+            TestRanger._check_privileges(result, [
+                ["USER", test_user, unique_database, "", "", "", "", "", 
"identity",
+                 "select", "false"]])
+            result = self._run_query_as_user(stmt, test_user, False)
+            err = "User '{0}' does not have privileges to access: {1}"\
+                  .format(test_user, unique_database)
+            assert err in str(result)
+          finally:
+            # Revoke the granted privileges.
+            admin_client.execute("revoke {0} on database {1} from user {2}"
+                                 .format(privilege_on_database, 
unique_database,
+                                         test_user), user=ADMIN)
+            admin_client.execute("revoke select on user_defined_fn 
{0}.identity "
+                                 "from user {1}"
+                                 .format(unique_database, test_user), 
user=ADMIN)
     finally:
+      # Revoke the granted privilege on the temporary table.
+      self._run_query_as_user("revoke insert on table {0}.tbl from user {1}"
+                              .format(unique_database, test_user),
+                              ADMIN, True)
       # Drop the database.
       self._run_query_as_user("drop database {0} 
cascade".format(unique_database),
                               ADMIN, True)
@@ -1338,8 +1335,8 @@ class TestRanger(CustomClusterTestSuite):
       # test_user should not be authorized to run the queries anymore.
       result = self._run_query_as_user(
           "select * from {0}.foo".format(test_db), test_user, False)
-      err = ("AuthorizationException: User '{0}' does not have privileges to 
execute" +
-             " 'SELECT' on: {1}.foo").format(test_user, test_db)
+      err = ("AuthorizationException: User '{0}' does not have privileges to 
execute"
+             + " 'SELECT' on: {1}.foo").format(test_user, test_db)
       assert err in str(result)
     finally:
       self._run_query_as_user("drop database {0} cascade".format(test_db), 
ADMIN, True)


Reply via email to