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

dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new a0b2195ca08 branch-3.0: [fix](vault) fix `CreateTableLikeStmt` cannot 
work in stoarge vault mode #46625 (#46654)
a0b2195ca08 is described below

commit a0b2195ca082d899d8db9526253bae8a0b29b652
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Mon Jan 13 21:36:52 2025 +0800

    branch-3.0: [fix](vault) fix `CreateTableLikeStmt` cannot work in stoarge 
vault mode #46625 (#46654)
    
    Cherry-picked from #46625
    
    Co-authored-by: Lei Zhang <zhang...@selectdb.com>
---
 .../apache/doris/common/util/PropertyAnalyzer.java | 45 ++++++++++++++++++++--
 .../apache/doris/datasource/InternalCatalog.java   | 42 +++++---------------
 .../test_vault_privilege_with_role.groovy          | 20 +++++-----
 3 files changed, 60 insertions(+), 47 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java
index e093c3db13d..2548f8142c5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java
@@ -34,6 +34,7 @@ import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.DdlException;
+import org.apache.doris.common.Pair;
 import org.apache.doris.datasource.CatalogIf;
 import org.apache.doris.datasource.CatalogMgr;
 import org.apache.doris.datasource.ExternalCatalog;
@@ -1177,14 +1178,50 @@ public class PropertyAnalyzer {
         return storagePolicy;
     }
 
-    public static String analyzeStorageVault(Map<String, String> properties) {
-        String storageVault = null;
+    /**
+     * @param properties
+     * @return <storageVaultName, storageVaultId>
+     * @throws AnalysisException
+     */
+    public static Pair<String, String> analyzeStorageVault(Map<String, String> 
properties) throws AnalysisException {
+        String storageVaultName = null;
         if (properties != null && 
properties.containsKey(PROPERTIES_STORAGE_VAULT_NAME)) {
-            storageVault = properties.get(PROPERTIES_STORAGE_VAULT_NAME);
+            storageVaultName = properties.get(PROPERTIES_STORAGE_VAULT_NAME);
             properties.remove(PROPERTIES_STORAGE_VAULT_NAME);
         }
 
-        return storageVault;
+        if (Strings.isNullOrEmpty(storageVaultName)) {
+            // If user does not specify one storage vault then FE would use 
the default vault
+            Pair<String, String> info = 
Env.getCurrentEnv().getStorageVaultMgr().getDefaultStorageVault();
+            if (info == null) {
+                throw new AnalysisException("No default storage vault."
+                        + " You can use `SHOW STORAGE VAULT` to get all 
available vaults,"
+                        + " and pick one set default vault with `SET 
<vault_name> AS DEFAULT STORAGE VAULT`");
+            }
+            storageVaultName = info.first;
+            LOG.info("Using default storage vault, name:{} id:{}", info.first, 
info.second);
+        }
+
+        if (Strings.isNullOrEmpty(storageVaultName)) {
+            throw new AnalysisException("Invalid Storage Vault. "
+                    + " You can use `SHOW STORAGE VAULT` to get all available 
vaults,"
+                    + " and pick one to set the table property 
`\"storage_vault_name\" = \"<vault_name>\"`");
+        }
+
+        String storageVaultId = 
Env.getCurrentEnv().getStorageVaultMgr().getVaultIdByName(storageVaultName);
+        if (Strings.isNullOrEmpty(storageVaultId)) {
+            throw new AnalysisException("Storage vault '" + storageVaultName + 
"' does not exist. "
+                    + "You can use `SHOW STORAGE VAULT` to get all available 
vaults, "
+                    + "or create a new one with `CREATE STORAGE VAULT`.");
+        }
+
+        if (properties != null && 
properties.containsKey(PROPERTIES_STORAGE_VAULT_ID)) {
+            
Preconditions.checkArgument(storageVaultId.equals(properties.get(PROPERTIES_STORAGE_VAULT_ID)),
+                    "storageVaultId check failed, %s-%s", storageVaultId, 
properties.get(PROPERTIES_STORAGE_VAULT_ID));
+            properties.remove(PROPERTIES_STORAGE_VAULT_ID);
+        }
+
+        return Pair.of(storageVaultName, storageVaultId);
     }
 
     // analyze property like : "type" = "xxx";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
index dbae2993416..55fa51ebc47 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
@@ -2728,44 +2728,20 @@ public class InternalCatalog implements 
CatalogIf<Database> {
         
olapTable.setEnableSingleReplicaCompaction(enableSingleReplicaCompaction);
 
         if (Config.isCloudMode() && ((CloudEnv) env).getEnableStorageVault()) {
-            // set storage vault
-            String storageVaultName = 
PropertyAnalyzer.analyzeStorageVault(properties);
-            String storageVaultId = null;
-            // If user does not specify one storage vault then FE would use 
the default vault
-            if (Strings.isNullOrEmpty(storageVaultName)) {
-                Pair<String, String> info = 
env.getStorageVaultMgr().getDefaultStorageVault();
-                if (info != null) {
-                    storageVaultName = info.first;
-                    storageVaultId = info.second;
-                    LOG.info("Using default storage vault: name={}, id={}", 
storageVaultName, storageVaultId);
-                } else {
-                    throw new DdlException("No default storage vault."
-                            + " You can use `SHOW STORAGE VAULT` to get all 
available vaults,"
-                            + " and pick one set default vault with `SET 
<vault_name> AS DEFAULT STORAGE VAULT`");
-                }
-            }
-
-            if (storageVaultName == null || storageVaultName.isEmpty()) {
-                throw new DdlException("Invalid Storage Vault. "
-                        + " You can use `SHOW STORAGE VAULT` to get all 
available vaults,"
-                        + " and pick one to set the table property 
`\"storage_vault_name\" = \"<vault_name>\"`");
-            }
+            // <storageVaultName, storageVaultId>
+            Pair<String, String> storageVaultInfoPair = 
PropertyAnalyzer.analyzeStorageVault(properties);
 
             // Check if user has storage vault usage privilege
-            if (ctx != null && !env.getAuth()
-                    .checkStorageVaultPriv(ctx.getCurrentUserIdentity(), 
storageVaultName, PrivPredicate.USAGE)) {
+            if (ConnectContext.get() != null && !env.getAuth()
+                    .checkStorageVaultPriv(ctx.getCurrentUserIdentity(),
+                            storageVaultInfoPair.first, PrivPredicate.USAGE)) {
                 throw new DdlException("USAGE denied to user '" + 
ConnectContext.get().getQualifiedUser()
                         + "'@'" + ConnectContext.get().getRemoteIP()
-                        + "' for storage vault '" + storageVaultName + "'");
-            }
-
-            storageVaultId = 
env.getStorageVaultMgr().getVaultIdByName(storageVaultName);
-            if (Strings.isNullOrEmpty(storageVaultId)) {
-                throw new DdlException("Storage vault '" + storageVaultName + 
"' does not exist. "
-                        + "You can use `SHOW STORAGE VAULT` to get all 
available vaults, "
-                        + "or create a new one with `CREATE STORAGE VAULT`.");
+                        + "' for storage vault '" + storageVaultInfoPair.first 
+ "'");
             }
-            olapTable.setStorageVaultId(storageVaultId);
+            
Preconditions.checkArgument(StringUtils.isNumeric(storageVaultInfoPair.second),
+                    "Invaild storage vault id :%s", 
storageVaultInfoPair.second);
+            olapTable.setStorageVaultId(storageVaultInfoPair.second);
         }
 
         // check `update on current_timestamp`
diff --git 
a/regression-test/suites/vault_p0/privilege/test_vault_privilege_with_role.groovy
 
b/regression-test/suites/vault_p0/privilege/test_vault_privilege_with_role.groovy
index 54cace642d4..7192dc40aed 100644
--- 
a/regression-test/suites/vault_p0/privilege/test_vault_privilege_with_role.groovy
+++ 
b/regression-test/suites/vault_p0/privilege/test_vault_privilege_with_role.groovy
@@ -46,6 +46,16 @@ suite("test_vault_privilege_with_role", "nonConcurrent") {
     sql """CREATE USER ${userName} identified by '${userPassword}' DEFAULT 
ROLE '${roleName}'"""
     sql """GRANT create_priv ON *.*.* TO '${userName}'; """
 
+    sql """
+        CREATE STORAGE VAULT ${hdfsVaultName}
+        PROPERTIES (
+            "type"="HDFS",
+            "fs.defaultFS"="${getHmsHdfsFs()}",
+            "path_prefix" = "${hdfsVaultName}",
+            "hadoop.username" = "${getHmsUser()}"
+        );
+        """
+
     connect(userName, userPassword, context.config.jdbcUrl) {
         expectExceptionLike({
             sql """
@@ -65,16 +75,6 @@ suite("test_vault_privilege_with_role", "nonConcurrent") {
 
     sql """ GRANT usage_priv ON STORAGE VAULT '${hdfsVaultName}' TO ROLE 
'${roleName}';"""
 
-    sql """
-        CREATE STORAGE VAULT ${hdfsVaultName}
-        PROPERTIES (
-            "type"="HDFS",
-            "fs.defaultFS"="${getHmsHdfsFs()}",
-            "path_prefix" = "${hdfsVaultName}",
-            "hadoop.username" = "${getHmsUser()}"
-        );
-        """
-
     connect(userName, userPassword, context.config.jdbcUrl) {
         sql """
             CREATE TABLE IF NOT EXISTS ${dbName}.${tableName} (


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to