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

mchades pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 10d51bd966 [#12594][followup] fix(authz): Clarify semantic model 
privilege naming and filtering (#13718)
10d51bd966 is described below

commit 10d51bd966af6cf4d3cdebc6290de4def9f0b35c
Author: Akshay Thorat <[email protected]>
AuthorDate: Fri Oct 9 07:52:47 2026 -0700

    [#12594][followup] fix(authz): Clarify semantic model privilege naming and 
filtering (#13718)
    
    ### What changes were proposed in this pull request?
    
    Rename the unreleased `SELECT_SEMANTIC_MODEL` privilege and
    `Privileges.SelectSemanticModel` helper to `USE_SEMANTIC_MODEL` and
    `Privileges.UseSemanticModel`, retaining the same permission bit.
    
    Add `SKIP_APPLY_PRIVILEGES` for connector callback selection and
    privilege filtering, separate from the semantic-model privilege set used
    for catalog-type validation. Update authorization expressions, OpenAPI,
    documentation, and tests.
    
    ### Why are the changes needed?
    
    Addresses the post-merge review on #12867: align the privilege name with
    `USE_MODEL` and give connector exclusions a dedicated constant that can
    include other privileges.
    
    Fix: #12594.
    
    ### Does this PR introduce _any_ user-facing change?
    
    Clients use `USE_SEMANTIC_MODEL` and `Privileges.UseSemanticModel`. The
    old names are removed because they have not been released. The privilege
    still covers discovery and loading definitions, without authorizing
    access to underlying source data.
    
    ### How was this patch tested?
    
    - 80 focused tests passed on JDK 17 across API, core, server-common, and
    server. Coverage includes privilege parsing and binding, H2 persistence,
    mixed connector grants, and authorization expressions.
    - `./gradlew spotlessApply`, `./gradlew :docs:build`, and
    API/core/server-common Javadoc tasks passed. Javadoc emitted existing
    warnings in unrelated files.
    - Standards and specification reviews found no actionable issues.
    
    Docker integration suites were not run.
---
 .../apache/gravitino/authorization/Privilege.java  |  2 +-
 .../apache/gravitino/authorization/Privileges.java | 24 ++++++-------
 .../authorization/TestSecurableObjects.java        | 42 ++++++++++++++--------
 .../authorization/AuthorizationUtils.java          |  8 +++--
 .../TestAccessControlManagerForPermissions.java    |  2 +-
 .../authorization/TestAuthorizationUtils.java      |  2 +-
 .../authorization/TestFutureGrantManager.java      |  4 +--
 .../relational/TestSemanticModelJDBCBackend.java   |  6 ++--
 design-docs/gravitino-semantic-model-design.md     |  4 +--
 docs/open-api/roles.yaml                           |  2 +-
 docs/security/access-control.md                    |  4 +--
 .../AuthorizationExpressionConstants.java          |  6 ++--
 .../AuthorizationExpressionConverter.java          |  6 ++--
 .../TestSemanticModelAuthorizationExpression.java  | 21 ++++++-----
 14 files changed, 74 insertions(+), 59 deletions(-)

diff --git 
a/api/src/main/java/org/apache/gravitino/authorization/Privilege.java 
b/api/src/main/java/org/apache/gravitino/authorization/Privilege.java
index 110468adc2..083435cffa 100644
--- a/api/src/main/java/org/apache/gravitino/authorization/Privilege.java
+++ b/api/src/main/java/org/apache/gravitino/authorization/Privilege.java
@@ -175,7 +175,7 @@ public interface Privilege {
     /** The privilege to create a semantic model. */
     CREATE_SEMANTIC_MODEL(0L, 1L << 39),
     /** The privilege to discover a semantic model and load its definition. */
-    SELECT_SEMANTIC_MODEL(0L, 1L << 40),
+    USE_SEMANTIC_MODEL(0L, 1L << 40),
     /** The privilege to rename a semantic model or alter its definition and 
metadata. */
     MODIFY_SEMANTIC_MODEL(0L, 1L << 41);
 
diff --git 
a/api/src/main/java/org/apache/gravitino/authorization/Privileges.java 
b/api/src/main/java/org/apache/gravitino/authorization/Privileges.java
index 211b8c6754..95a15b6b7b 100644
--- a/api/src/main/java/org/apache/gravitino/authorization/Privileges.java
+++ b/api/src/main/java/org/apache/gravitino/authorization/Privileges.java
@@ -251,8 +251,8 @@ public class Privileges {
         // Semantic model
       case CREATE_SEMANTIC_MODEL:
         return CreateSemanticModel.allow();
-      case SELECT_SEMANTIC_MODEL:
-        return SelectSemanticModel.allow();
+      case USE_SEMANTIC_MODEL:
+        return UseSemanticModel.allow();
       case MODIFY_SEMANTIC_MODEL:
         return ModifySemanticModel.allow();
 
@@ -395,8 +395,8 @@ public class Privileges {
         // Semantic model
       case CREATE_SEMANTIC_MODEL:
         return CreateSemanticModel.deny();
-      case SELECT_SEMANTIC_MODEL:
-        return SelectSemanticModel.deny();
+      case USE_SEMANTIC_MODEL:
+        return UseSemanticModel.deny();
       case MODIFY_SEMANTIC_MODEL:
         return ModifySemanticModel.deny();
 
@@ -1770,27 +1770,27 @@ public class Privileges {
   }
 
   /** The privilege to discover a semantic model and load its definition. */
-  public static class SelectSemanticModel extends 
GenericPrivilege<SelectSemanticModel> {
-    private static final SelectSemanticModel ALLOW_INSTANCE =
-        new SelectSemanticModel(Condition.ALLOW, Name.SELECT_SEMANTIC_MODEL);
-    private static final SelectSemanticModel DENY_INSTANCE =
-        new SelectSemanticModel(Condition.DENY, Name.SELECT_SEMANTIC_MODEL);
+  public static class UseSemanticModel extends 
GenericPrivilege<UseSemanticModel> {
+    private static final UseSemanticModel ALLOW_INSTANCE =
+        new UseSemanticModel(Condition.ALLOW, Name.USE_SEMANTIC_MODEL);
+    private static final UseSemanticModel DENY_INSTANCE =
+        new UseSemanticModel(Condition.DENY, Name.USE_SEMANTIC_MODEL);
 
-    private SelectSemanticModel(Condition condition, Name name) {
+    private UseSemanticModel(Condition condition, Name name) {
       super(condition, name);
     }
 
     /**
      * @return The instance with allow condition of the privilege.
      */
-    public static SelectSemanticModel allow() {
+    public static UseSemanticModel allow() {
       return ALLOW_INSTANCE;
     }
 
     /**
      * @return The instance with deny condition of the privilege.
      */
-    public static SelectSemanticModel deny() {
+    public static UseSemanticModel deny() {
       return DENY_INSTANCE;
     }
 
diff --git 
a/api/src/test/java/org/apache/gravitino/authorization/TestSecurableObjects.java
 
b/api/src/test/java/org/apache/gravitino/authorization/TestSecurableObjects.java
index 86984a5917..acf9b93e39 100644
--- 
a/api/src/test/java/org/apache/gravitino/authorization/TestSecurableObjects.java
+++ 
b/api/src/test/java/org/apache/gravitino/authorization/TestSecurableObjects.java
@@ -114,7 +114,7 @@ public class TestSecurableObjects {
 
     SecurableObject semanticModel =
         SecurableObjects.ofSemanticModel(
-            schema, "sales_model", 
Lists.newArrayList(Privileges.SelectSemanticModel.allow()));
+            schema, "sales_model", 
Lists.newArrayList(Privileges.UseSemanticModel.allow()));
     Assertions.assertEquals("catalog.schema.sales_model", 
semanticModel.fullName());
     Assertions.assertEquals(MetadataObject.Type.SEMANTIC_MODEL, 
semanticModel.type());
 
@@ -122,7 +122,7 @@ public class TestSecurableObjects {
         SecurableObjects.of(
             MetadataObject.Type.SEMANTIC_MODEL,
             Lists.newArrayList("catalog", "schema", "sales_model"),
-            Lists.newArrayList(Privileges.SelectSemanticModel.allow()));
+            Lists.newArrayList(Privileges.UseSemanticModel.allow()));
     Assertions.assertEquals(semanticModel, anotherSemanticModel);
 
     Exception e =
@@ -199,7 +199,7 @@ public class TestSecurableObjects {
                 SecurableObjects.of(
                     MetadataObject.Type.SEMANTIC_MODEL,
                     Lists.newArrayList("metalake"),
-                    
Lists.newArrayList(Privileges.SelectSemanticModel.allow())));
+                    Lists.newArrayList(Privileges.UseSemanticModel.allow())));
     Assertions.assertTrue(e.getMessage().contains("the length of names must be 
3"));
   }
 
@@ -241,7 +241,7 @@ public class TestSecurableObjects {
     Privilege executeFunction = Privileges.ExecuteFunction.allow();
     Privilege modifyFunction = Privileges.ModifyFunction.allow();
     Privilege createSemanticModel = Privileges.CreateSemanticModel.allow();
-    Privilege selectSemanticModel = Privileges.SelectSemanticModel.allow();
+    Privilege useSemanticModel = Privileges.UseSemanticModel.allow();
     Privilege modifySemanticModel = Privileges.ModifySemanticModel.allow();
     Privilege useSecrets = Privileges.UseSecrets.allow();
     Privilege includeCredentialSecrets = 
Privileges.IncludeCredentialSecrets.allow();
@@ -624,15 +624,15 @@ public class TestSecurableObjects {
     
Assertions.assertFalse(createSemanticModel.canBindTo(MetadataObject.Type.ROLE));
     
Assertions.assertFalse(createSemanticModel.canBindTo(MetadataObject.Type.COLUMN));
 
-    // Test select semantic model
-    
Assertions.assertTrue(selectSemanticModel.canBindTo(MetadataObject.Type.METALAKE));
-    
Assertions.assertTrue(selectSemanticModel.canBindTo(MetadataObject.Type.CATALOG));
-    
Assertions.assertTrue(selectSemanticModel.canBindTo(MetadataObject.Type.SCHEMA));
-    
Assertions.assertTrue(selectSemanticModel.canBindTo(MetadataObject.Type.SEMANTIC_MODEL));
-    
Assertions.assertFalse(selectSemanticModel.canBindTo(MetadataObject.Type.TABLE));
-    
Assertions.assertFalse(selectSemanticModel.canBindTo(MetadataObject.Type.MODEL));
-    
Assertions.assertFalse(selectSemanticModel.canBindTo(MetadataObject.Type.ROLE));
-    
Assertions.assertFalse(selectSemanticModel.canBindTo(MetadataObject.Type.COLUMN));
+    // Test use semantic model
+    
Assertions.assertTrue(useSemanticModel.canBindTo(MetadataObject.Type.METALAKE));
+    
Assertions.assertTrue(useSemanticModel.canBindTo(MetadataObject.Type.CATALOG));
+    
Assertions.assertTrue(useSemanticModel.canBindTo(MetadataObject.Type.SCHEMA));
+    
Assertions.assertTrue(useSemanticModel.canBindTo(MetadataObject.Type.SEMANTIC_MODEL));
+    
Assertions.assertFalse(useSemanticModel.canBindTo(MetadataObject.Type.TABLE));
+    
Assertions.assertFalse(useSemanticModel.canBindTo(MetadataObject.Type.MODEL));
+    
Assertions.assertFalse(useSemanticModel.canBindTo(MetadataObject.Type.ROLE));
+    
Assertions.assertFalse(useSemanticModel.canBindTo(MetadataObject.Type.COLUMN));
 
     // Test modify semantic model
     
Assertions.assertTrue(modifySemanticModel.canBindTo(MetadataObject.Type.METALAKE));
@@ -646,7 +646,7 @@ public class TestSecurableObjects {
 
     // Deny instances must agree with their allow counterparts on binding
     Assertions.assertTrue(
-        
Privileges.SelectSemanticModel.deny().canBindTo(MetadataObject.Type.SEMANTIC_MODEL));
+        
Privileges.UseSemanticModel.deny().canBindTo(MetadataObject.Type.SEMANTIC_MODEL));
     Assertions.assertEquals(
         Privilege.Condition.DENY, 
Privileges.ModifySemanticModel.deny().condition());
     Assertions.assertEquals(
@@ -657,6 +657,20 @@ public class TestSecurableObjects {
         Privileges.deny(Privilege.Name.MODIFY_SEMANTIC_MODEL));
   }
 
+  @Test
+  public void testUseSemanticModelPrivilege() {
+    Assertions.assertEquals(
+        Privileges.UseSemanticModel.allow(), 
Privileges.allow("USE_SEMANTIC_MODEL"));
+    Assertions.assertEquals(
+        Privileges.UseSemanticModel.deny(), 
Privileges.deny("USE_SEMANTIC_MODEL"));
+    Assertions.assertEquals(
+        "ALLOW use semantic model", 
Privileges.UseSemanticModel.allow().simpleString());
+    Assertions.assertEquals(
+        "DENY use semantic model", 
Privileges.UseSemanticModel.deny().simpleString());
+    Assertions.assertEquals(1L << 40, 
Privilege.Name.USE_SEMANTIC_MODEL.getLowBits());
+    Assertions.assertEquals(0L, 
Privilege.Name.USE_SEMANTIC_MODEL.getHighBits());
+  }
+
   @Test
   public void testHashCodeConsistentWithUnorderedPrivileges() {
     SecurableObject one =
diff --git 
a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java 
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
index 1335f7e46a..1bf888d74e 100644
--- 
a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
+++ 
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
@@ -126,9 +126,11 @@ public class AuthorizationUtils {
   private static final Set<Privilege.Name> SEMANTIC_MODEL_PRIVILEGES =
       Sets.immutableEnumSet(
           Privilege.Name.CREATE_SEMANTIC_MODEL,
-          Privilege.Name.SELECT_SEMANTIC_MODEL,
+          Privilege.Name.USE_SEMANTIC_MODEL,
           Privilege.Name.MODIFY_SEMANTIC_MODEL);
 
+  private static final Set<Privilege.Name> SKIP_APPLY_PRIVILEGES = 
SEMANTIC_MODEL_PRIVILEGES;
+
   private AuthorizationUtils() {}
 
   public static void checkCurrentUser(String metalake, String user) {
@@ -266,7 +268,7 @@ public class AuthorizationUtils {
     if (securableObject.type() == MetadataObject.Type.METALAKE) {
       List<Privilege> privileges = securableObject.privileges();
       for (Privilege privilege : privileges) {
-        if (!SEMANTIC_MODEL_PRIVILEGES.contains(privilege.name())
+        if (!SKIP_APPLY_PRIVILEGES.contains(privilege.name())
             && privilege.canBindTo(MetadataObject.Type.CATALOG)) {
           return true;
         }
@@ -556,7 +558,7 @@ public class AuthorizationUtils {
       return List.of();
     }
     return object.privileges().stream()
-        .filter(privilege -> 
!SEMANTIC_MODEL_PRIVILEGES.contains(privilege.name()))
+        .filter(privilege -> !SKIP_APPLY_PRIVILEGES.contains(privilege.name()))
         .collect(Collectors.toList());
   }
 
diff --git 
a/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
 
b/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
index 5b4f55c4c0..cff2ad57c9 100644
--- 
a/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
+++ 
b/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
@@ -472,7 +472,7 @@ public class TestAccessControlManagerForPermissions {
             .build(),
         false);
     PermissionManager manager = new PermissionManager(entityStore, 
Mockito.mock(RoleManager.class));
-    Privilege semantic = Privileges.SelectSemanticModel.allow();
+    Privilege semantic = Privileges.UseSemanticModel.allow();
     Privilege table = Privileges.SelectTable.allow();
     SecurableObject tableObject = SecurableObjects.parse(fullName, type, 
List.of(table));
     SecurableObject semanticObject = SecurableObjects.parse(fullName, type, 
List.of(semantic));
diff --git 
a/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
 
b/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
index 611b9c47dd..db05fb9d04 100644
--- 
a/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
+++ 
b/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
@@ -543,7 +543,7 @@ class TestAuthorizationUtils {
         for (Privilege semantic :
             List.of(
                 Privileges.CreateSemanticModel.allow(),
-                Privileges.SelectSemanticModel.deny(),
+                Privileges.UseSemanticModel.deny(),
                 Privileges.ModifySemanticModel.allow())) {
           SecurableObject semanticOnly = SecurableObjects.parse(name, type, 
List.of(semantic));
           AuthorizationUtils.callAuthorizationPluginForSecurableObjects(
diff --git 
a/core/src/test/java/org/apache/gravitino/authorization/TestFutureGrantManager.java
 
b/core/src/test/java/org/apache/gravitino/authorization/TestFutureGrantManager.java
index a7c884235c..174e9e1346 100644
--- 
a/core/src/test/java/org/apache/gravitino/authorization/TestFutureGrantManager.java
+++ 
b/core/src/test/java/org/apache/gravitino/authorization/TestFutureGrantManager.java
@@ -207,12 +207,12 @@ public class TestFutureGrantManager {
         SecurableObjects.ofMetalake(
             METALAKE,
             Lists.newArrayList(
-                Privileges.SelectTable.allow(), 
Privileges.SelectSemanticModel.allow()));
+                Privileges.SelectTable.allow(), 
Privileges.UseSemanticModel.allow()));
     SecurableObject semanticModel =
         SecurableObjects.parse(
             "old_catalog.schema.model",
             MetadataObject.Type.SEMANTIC_MODEL,
-            Lists.newArrayList(Privileges.SelectSemanticModel.allow()));
+            Lists.newArrayList(Privileges.UseSemanticModel.allow()));
     SecurableObject otherTable =
         SecurableObjects.parse(
             "old_catalog.schema.table",
diff --git 
a/core/src/test/java/org/apache/gravitino/storage/relational/TestSemanticModelJDBCBackend.java
 
b/core/src/test/java/org/apache/gravitino/storage/relational/TestSemanticModelJDBCBackend.java
index 6fd96679c3..0ba494234e 100644
--- 
a/core/src/test/java/org/apache/gravitino/storage/relational/TestSemanticModelJDBCBackend.java
+++ 
b/core/src/test/java/org/apache/gravitino/storage/relational/TestSemanticModelJDBCBackend.java
@@ -100,7 +100,7 @@ public class TestSemanticModelJDBCBackend extends 
TestJDBCBackend {
         semanticModelRole(
             model,
             List.of(
-                Privileges.SelectSemanticModel.allow(),
+                Privileges.UseSemanticModel.allow(),
                 Privileges.ModifySemanticModel.allow(),
                 Privileges.ManageGrants.allow()));
     backend.insert(role, false);
@@ -125,7 +125,7 @@ public class TestSemanticModelJDBCBackend extends 
TestJDBCBackend {
                     .withAuditInfo(AUDIT_INFO)
                     .withProperties(ImmutableMap.of())
                     .withSecurableObjects(
-                        semanticModelRole(renamed, 
List.of(Privileges.SelectSemanticModel.allow()))
+                        semanticModelRole(renamed, 
List.of(Privileges.UseSemanticModel.allow()))
                             .securableObjects())
                     .build());
     loaded = backend.get(role.nameIdentifier(), Entity.EntityType.ROLE);
@@ -173,7 +173,7 @@ public class TestSemanticModelJDBCBackend extends 
TestJDBCBackend {
               .getOwner(entity.nameIdentifier(), entity.type())
               .orElseThrow());
       backend.insert(
-          semanticModelRole(entity, 
List.of(Privileges.SelectSemanticModel.allow())), false);
+          semanticModelRole(entity, 
List.of(Privileges.UseSemanticModel.allow())), false);
     }
     assertEquals(
         0,
diff --git a/design-docs/gravitino-semantic-model-design.md 
b/design-docs/gravitino-semantic-model-design.md
index 44abd65927..af2319d165 100644
--- a/design-docs/gravitino-semantic-model-design.md
+++ b/design-docs/gravitino-semantic-model-design.md
@@ -640,13 +640,13 @@ Semantic Models are new securable metadata objects. The 
design introduces:
 | Privilege               | Purpose                                           |
 |-------------------------|---------------------------------------------------|
 | `CREATE_SEMANTIC_MODEL` | Create a Semantic Model under a schema            |
-| `SELECT_SEMANTIC_MODEL` | Discover and load the model definition            |
+| `USE_SEMANTIC_MODEL` | Discover and load the model definition            |
 | `MODIFY_SEMANTIC_MODEL` | Rename or alter the model definition and metadata |
 
 - **Create.** A metalake or catalog owner may create directly; a schema owner 
also requires
   `USE_CATALOG`; otherwise, the caller requires `USE_CATALOG`, `USE_SCHEMA`, 
and
   `CREATE_SEMANTIC_MODEL`.
-- **List and load.** Return only models on which the caller has 
`SELECT_SEMANTIC_MODEL`,
+- **List and load.** Return only models on which the caller has 
`USE_SEMANTIC_MODEL`,
   `MODIFY_SEMANTIC_MODEL`, or ownership.
 - **Alter.** Requires `MODIFY_SEMANTIC_MODEL` or ownership.
 - **Drop.** A metalake or catalog owner may drop directly; a schema owner also 
requires
diff --git a/docs/open-api/roles.yaml b/docs/open-api/roles.yaml
index cbbbdca4df..411176b3f1 100644
--- a/docs/open-api/roles.yaml
+++ b/docs/open-api/roles.yaml
@@ -233,7 +233,7 @@ components:
             - CREATE_VIEW
             - SELECT_VIEW
             - CREATE_SEMANTIC_MODEL
-            - SELECT_SEMANTIC_MODEL
+            - USE_SEMANTIC_MODEL
             - MODIFY_SEMANTIC_MODEL
           description: The name of the privilege
         condition:
diff --git a/docs/security/access-control.md b/docs/security/access-control.md
index 8d59605c59..37deeb5d4d 100755
--- a/docs/security/access-control.md
+++ b/docs/security/access-control.md
@@ -209,7 +209,7 @@ sets the scope of the grant. Binding a privilege to a type 
not listed for it is
 | `EXECUTE_FUNCTION`   | Metalake, Catalog, Schema, Function                   
                      | Read the metadata of, and execute, any function in 
scope             |
 | `MODIFY_FUNCTION`    | Metalake, Catalog, Schema, Function                   
                      | Alter or drop any function in scope                     
             |
 | `CREATE_SEMANTIC_MODEL` | Metalake, Catalog, Schema           | Create 
semantic models in any schema in scope                      |
-| `SELECT_SEMANTIC_MODEL` | Metalake, Catalog, Schema, Semantic Model | 
Discover and load the definition of any semantic model in scope |
+| `USE_SEMANTIC_MODEL` | Metalake, Catalog, Schema, Semantic Model | Discover 
and load the definition of any semantic model in scope |
 | `MODIFY_SEMANTIC_MODEL` | Metalake, Catalog, Schema, Semantic Model | 
Rename, and alter the definition and metadata of, any semantic model in scope |
 
 Either `SELECT_TABLE` or `MODIFY_TABLE` is enough to load a table's metadata. 
Topics and filesets
@@ -281,7 +281,7 @@ return only the entries the caller is entitled to see, 
which for a metalake owne
 | Fileset  | `CREATE_FILESET`    | `READ_FILESET` or `WRITE_FILESET`       | 
`WRITE_FILESET`   | Owner |
 | Model    | `REGISTER_MODEL`    | `USE_MODEL`                             | 
Owner             | Owner |
 | Function | `REGISTER_FUNCTION` | `EXECUTE_FUNCTION` or `MODIFY_FUNCTION` | 
`MODIFY_FUNCTION` | Owner |
-| Semantic Model | `CREATE_SEMANTIC_MODEL` | `SELECT_SEMANTIC_MODEL` or 
`MODIFY_SEMANTIC_MODEL` | `MODIFY_SEMANTIC_MODEL` | Owner |
+| Semantic Model | `CREATE_SEMANTIC_MODEL` | `USE_SEMANTIC_MODEL` or 
`MODIFY_SEMANTIC_MODEL` | `MODIFY_SEMANTIC_MODEL` | Owner |
 
 Testing a catalog connection follows the catalog row. Testing a catalog before 
it is created takes
 `CREATE_CATALOG`. Testing an existing catalog with its stored configuration 
takes `USE_CATALOG`, the
diff --git 
a/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConstants.java
 
b/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConstants.java
index d1c227b559..d32f83bb06 100644
--- 
a/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConstants.java
+++ 
b/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConstants.java
@@ -315,7 +315,7 @@ public class AuthorizationExpressionConstants {
                   """;
 
   /**
-   * Semantic Model list and load. Only Semantic Models the caller can select, 
modify, or owns are
+   * Semantic Model list and load. Only Semantic Models the caller can use, 
modify, or owns are
    * returned; a metalake or catalog owner, or a schema owner holding 
USE_CATALOG, sees them all.
    */
   public static final String LOAD_SEMANTIC_MODEL_AUTHORIZATION_EXPRESSION =
@@ -323,7 +323,7 @@ public class AuthorizationExpressionConstants {
                   ANY(OWNER, METALAKE, CATALOG) ||
                   SCHEMA_OWNER_WITH_USE_CATALOG ||
                   ANY_USE_CATALOG && ANY_USE_SCHEMA &&
-                  (SEMANTIC_MODEL::OWNER || ANY_SELECT_SEMANTIC_MODEL || 
ANY_MODIFY_SEMANTIC_MODEL)
+                  (SEMANTIC_MODEL::OWNER || ANY_USE_SEMANTIC_MODEL || 
ANY_MODIFY_SEMANTIC_MODEL)
                   """;
 
   /** Semantic Model creation under a schema. */
@@ -357,7 +357,7 @@ public class AuthorizationExpressionConstants {
   public static final String FILTER_SEMANTIC_MODEL_AUTHORIZATION_EXPRESSION =
       """
                   ANY(OWNER, METALAKE, CATALOG, SCHEMA, SEMANTIC_MODEL) ||
-                  ANY_SELECT_SEMANTIC_MODEL ||
+                  ANY_USE_SEMANTIC_MODEL ||
                   ANY_MODIFY_SEMANTIC_MODEL
                   """;
 
diff --git 
a/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConverter.java
 
b/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConverter.java
index 7d0e28b5b6..ca6fdb448a 100644
--- 
a/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConverter.java
+++ 
b/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConverter.java
@@ -339,9 +339,9 @@ public class AuthorizationExpressionConverter {
                 + "&& !(ANY(DENY_CREATE_SEMANTIC_MODEL, METALAKE, CATALOG, 
SCHEMA)))");
     expression =
         expression.replaceAll(
-            "ANY_SELECT_SEMANTIC_MODEL",
-            "((ANY(SELECT_SEMANTIC_MODEL, METALAKE, CATALOG, SCHEMA, 
SEMANTIC_MODEL)) "
-                + "&& !(ANY(DENY_SELECT_SEMANTIC_MODEL, METALAKE, CATALOG, 
SCHEMA, SEMANTIC_MODEL)))");
+            "ANY_USE_SEMANTIC_MODEL",
+            "((ANY(USE_SEMANTIC_MODEL, METALAKE, CATALOG, SCHEMA, 
SEMANTIC_MODEL)) "
+                + "&& !(ANY(DENY_USE_SEMANTIC_MODEL, METALAKE, CATALOG, 
SCHEMA, SEMANTIC_MODEL)))");
     expression =
         expression.replaceAll(
             "ANY_MODIFY_SEMANTIC_MODEL",
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/authorization/TestSemanticModelAuthorizationExpression.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/authorization/TestSemanticModelAuthorizationExpression.java
index 5ab64844dc..9017aad549 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/authorization/TestSemanticModelAuthorizationExpression.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/authorization/TestSemanticModelAuthorizationExpression.java
@@ -28,8 +28,8 @@ import org.junit.jupiter.api.Test;
 /**
  * Verifies the Semantic Model authorization expressions against the rules in 
the Semantic Model
  * design: creation needs CREATE_SEMANTIC_MODEL under USE_CATALOG and 
USE_SCHEMA, list and load
- * accept SELECT_SEMANTIC_MODEL or MODIFY_SEMANTIC_MODEL, alter needs 
MODIFY_SEMANTIC_MODEL, and
- * drop needs ownership rather than any privilege.
+ * accept USE_SEMANTIC_MODEL or MODIFY_SEMANTIC_MODEL, alter needs 
MODIFY_SEMANTIC_MODEL, and drop
+ * needs ownership rather than any privilege.
  */
 public class TestSemanticModelAuthorizationExpression {
 
@@ -91,11 +91,11 @@ public class TestSemanticModelAuthorizationExpression {
             ImmutableSet.of(
                 "SEMANTIC_MODEL::OWNER", "CATALOG::USE_CATALOG", 
"SCHEMA::USE_SCHEMA")));
 
-    // Either SELECT or MODIFY loads the definition.
+    // Either USE or MODIFY loads the definition.
     assertTrue(
         evaluator.getResult(
             ImmutableSet.of(
-                "SEMANTIC_MODEL::SELECT_SEMANTIC_MODEL",
+                "SEMANTIC_MODEL::USE_SEMANTIC_MODEL",
                 "CATALOG::USE_CATALOG",
                 "SCHEMA::USE_SCHEMA")));
     assertTrue(
@@ -111,8 +111,8 @@ public class TestSemanticModelAuthorizationExpression {
     assertFalse(
         evaluator.getResult(
             ImmutableSet.of(
-                "METALAKE::SELECT_SEMANTIC_MODEL",
-                "SEMANTIC_MODEL::DENY_SELECT_SEMANTIC_MODEL",
+                "METALAKE::USE_SEMANTIC_MODEL",
+                "SEMANTIC_MODEL::DENY_USE_SEMANTIC_MODEL",
                 "CATALOG::USE_CATALOG",
                 "SCHEMA::USE_SCHEMA")));
   }
@@ -128,13 +128,12 @@ public class TestSemanticModelAuthorizationExpression {
     assertTrue(evaluator.getResult(ImmutableSet.of("CATALOG::OWNER")));
     assertTrue(evaluator.getResult(ImmutableSet.of("SCHEMA::OWNER")));
     assertTrue(evaluator.getResult(ImmutableSet.of("SEMANTIC_MODEL::OWNER")));
-    
assertTrue(evaluator.getResult(ImmutableSet.of("SCHEMA::SELECT_SEMANTIC_MODEL")));
+    
assertTrue(evaluator.getResult(ImmutableSet.of("SCHEMA::USE_SEMANTIC_MODEL")));
     
assertTrue(evaluator.getResult(ImmutableSet.of("SEMANTIC_MODEL::MODIFY_SEMANTIC_MODEL")));
     
assertFalse(evaluator.getResult(ImmutableSet.of("SCHEMA::CREATE_SEMANTIC_MODEL")));
     assertFalse(
         evaluator.getResult(
-            ImmutableSet.of(
-                "METALAKE::SELECT_SEMANTIC_MODEL", 
"SCHEMA::DENY_SELECT_SEMANTIC_MODEL")));
+            ImmutableSet.of("METALAKE::USE_SEMANTIC_MODEL", 
"SCHEMA::DENY_USE_SEMANTIC_MODEL")));
   }
 
   @Test
@@ -157,11 +156,11 @@ public class TestSemanticModelAuthorizationExpression {
                 "CATALOG::USE_CATALOG",
                 "SCHEMA::USE_SCHEMA")));
 
-    // SELECT_SEMANTIC_MODEL is read-only and must not permit an alter.
+    // USE_SEMANTIC_MODEL is read-only and must not permit an alter.
     assertFalse(
         evaluator.getResult(
             ImmutableSet.of(
-                "SEMANTIC_MODEL::SELECT_SEMANTIC_MODEL",
+                "SEMANTIC_MODEL::USE_SEMANTIC_MODEL",
                 "CATALOG::USE_CATALOG",
                 "SCHEMA::USE_SCHEMA")));
   }

Reply via email to