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

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 45e5fa0db8bc69615c80ecd71abd0d6401827070
Author: Yulei-Yang <yulei.yang0...@gmail.com>
AuthorDate: Fri Dec 9 08:56:55 2022 +0800

    [Improvement](multi-catalog) add show create catalog stmt (#14938)
---
 .../Create/CREATE-CATALOG.md                       |  4 +-
 .../Show-Statements/SHOW-CREATE-CATALOG.md         | 63 ++++++++++++++++
 docs/sidebars.json                                 |  1 +
 .../Create/CREATE-CATALOG.md                       |  4 +-
 .../Show-Statements/SHOW-CREATE-CATALOG.md         | 64 +++++++++++++++++
 fe/fe-core/src/main/cup/sql_parser.cup             |  4 ++
 .../doris/analysis/ShowCreateCatalogStmt.java      | 84 ++++++++++++++++++++++
 .../org/apache/doris/datasource/CatalogMgr.java    | 28 ++++++++
 .../java/org/apache/doris/qe/ShowExecutor.java     | 11 +++
 .../apache/doris/datasource/CatalogMgrTest.java    | 27 +++++++
 10 files changed, 286 insertions(+), 4 deletions(-)

diff --git 
a/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-CATALOG.md
 
b/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-CATALOG.md
index e2669590c6..acf435eb06 100644
--- 
a/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-CATALOG.md
+++ 
b/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-CATALOG.md
@@ -54,8 +54,8 @@ CREATE CATALOG [IF NOT EXISTS] catalog_name
    CREATE CATALOG hive PROPERTIES (
                "type"="hms",
                'hive.metastore.uris' = 'thrift://172.21.0.1:7004',
-               'dfs.nameservices'='service1',
-               'dfs.ha.namenodes. service1'='nn1,nn2',
+               'dfs.nameservices'='HDFS8000871',
+               'dfs.ha.namenodes.HDFS8000871'='nn1,nn2',
                'dfs.namenode.rpc-address.HDFS8000871.nn1'='172.21.0.2:4007',
                'dfs.namenode.rpc-address.HDFS8000871.nn2'='172.21.0.3:4007',
                
'dfs.client.failover.proxy.provider.HDFS8000871'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
diff --git 
a/docs/en/docs/sql-manual/sql-reference/Show-Statements/SHOW-CREATE-CATALOG.md 
b/docs/en/docs/sql-manual/sql-reference/Show-Statements/SHOW-CREATE-CATALOG.md
new file mode 100644
index 0000000000..180fbe5112
--- /dev/null
+++ 
b/docs/en/docs/sql-manual/sql-reference/Show-Statements/SHOW-CREATE-CATALOG.md
@@ -0,0 +1,63 @@
+---
+{
+    "title": "SHOW-CREATE-CATALOG",
+    "language": "zh-CN"
+}
+---
+
+<!--
+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.
+-->
+
+## SHOW-CREATE-CATALOG
+
+### Name
+
+<version since="1.2">
+
+SHOW CREATE CATALOG
+
+</version>
+
+### Description
+
+This statement shows the creating statement of a doris catalog.
+
+grammar:
+
+```sql
+SHOW CREATE CATALOG catalog_name;
+```
+
+illustrate:
+- `catalog_name`: The name of the catalog which exist in doris.
+
+### Example
+
+1. View the creating statement of the hive catalog in doris
+
+   ```sql
+   SHOW CREATE CATALOG hive;
+   ```
+
+### Keywords
+
+    SHOW, CREATE, CATALOG
+
+### Best Practice
+
diff --git a/docs/sidebars.json b/docs/sidebars.json
index 66eac63629..1a1cefa5ec 100644
--- a/docs/sidebars.json
+++ b/docs/sidebars.json
@@ -858,6 +858,7 @@
                                 
"sql-manual/sql-reference/Show-Statements/SHOW-CATALOGS",
                                 
"sql-manual/sql-reference/Show-Statements/SHOW-CREATE-TABLE",
                                 
"sql-manual/sql-reference/Show-Statements/SHOW-CHARSET",
+                                
"sql-manual/sql-reference/Show-Statements/SHOW-CREATE-CATALOG",
                                 
"sql-manual/sql-reference/Show-Statements/SHOW-CREATE-DATABASE",
                                 
"sql-manual/sql-reference/Show-Statements/SHOW-CREATE-MATERIALIZED-VIEW",
                                 
"sql-manual/sql-reference/Show-Statements/SHOW-CREATE-ROUTINE-LOAD",
diff --git 
a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-CATALOG.md
 
b/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-CATALOG.md
index dd8af3a7e9..5e9ccb09dc 100644
--- 
a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-CATALOG.md
+++ 
b/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-CATALOG.md
@@ -58,8 +58,8 @@ CREATE CATALOG [IF NOT EXISTS] catalog_name
    CREATE CATALOG hive PROPERTIES (
                "type"="hms",
                'hive.metastore.uris' = 'thrift://172.21.0.1:7004',
-               'dfs.nameservices'='service1',
-               'dfs.ha.namenodes. service1'='nn1,nn2',
+               'dfs.nameservices'='HDFS8000871',
+               'dfs.ha.namenodes.HDFS8000871'='nn1,nn2',
                'dfs.namenode.rpc-address.HDFS8000871.nn1'='172.21.0.2:4007',
                'dfs.namenode.rpc-address.HDFS8000871.nn2'='172.21.0.3:4007',
                
'dfs.client.failover.proxy.provider.HDFS8000871'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
diff --git 
a/docs/zh-CN/docs/sql-manual/sql-reference/Show-Statements/SHOW-CREATE-CATALOG.md
 
b/docs/zh-CN/docs/sql-manual/sql-reference/Show-Statements/SHOW-CREATE-CATALOG.md
new file mode 100644
index 0000000000..b72ca20be3
--- /dev/null
+++ 
b/docs/zh-CN/docs/sql-manual/sql-reference/Show-Statements/SHOW-CREATE-CATALOG.md
@@ -0,0 +1,64 @@
+---
+{
+    "title": "SHOW-CREATE-CATALOG",
+    "language": "zh-CN"
+}
+---
+
+<!--
+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.
+-->
+
+## SHOW-CREATE-CATALOG
+
+### Name
+
+<version since="1.2">
+
+SHOW CREATE CATALOG
+
+</version>
+
+### Description
+
+该语句查看doris数据目录的创建语句。
+
+语法:
+
+```sql
+SHOW CREATE CATALOG catalog_name;
+```
+
+说明:
+
+- `catalog_name`: 为doris中存在的数据目录的名称。
+
+### Example
+
+1. 查看doris中hive数据目录的创建语句
+
+   ```sql
+   SHOW CREATE CATALOG hive;
+   ```
+
+### Keywords
+
+    SHOW, CREATE, CATALOG
+
+### Best Practice
+
diff --git a/fe/fe-core/src/main/cup/sql_parser.cup 
b/fe/fe-core/src/main/cup/sql_parser.cup
index 68d209ffe6..6b3fff4bd5 100644
--- a/fe/fe-core/src/main/cup/sql_parser.cup
+++ b/fe/fe-core/src/main/cup/sql_parser.cup
@@ -3419,6 +3419,10 @@ show_param ::=
     {:
         RESULT = new ShowCreateDbStmt(db);
     :}
+    | KW_CREATE KW_CATALOG ident:catalogName
+        {:
+            RESULT = new ShowCreateCatalogStmt(catalogName);
+        :}
     /* Create Function */
     | KW_CREATE KW_FUNCTION function_name:functionName LPAREN 
func_args_def:args RPAREN opt_db:dbName
     {:
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateCatalogStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateCatalogStmt.java
new file mode 100644
index 0000000000..8e32289e10
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateCatalogStmt.java
@@ -0,0 +1,84 @@
+// 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.doris.analysis;
+
+import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.ErrorReport;
+import org.apache.doris.common.UserException;
+import org.apache.doris.common.util.Util;
+import org.apache.doris.mysql.privilege.PrivPredicate;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.ShowResultSetMetaData;
+
+import com.google.common.base.Strings;
+
+// Show create catalog statement
+//  Syntax:
+//      SHOW CREATE CATALOG catalogName
+public class ShowCreateCatalogStmt extends ShowStmt {
+    private static final ShowResultSetMetaData META_DATA =
+            ShowResultSetMetaData.builder()
+                    .addColumn(new Column("Catalog", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("Create Catalog", 
ScalarType.createVarchar(30)))
+                    .build();
+
+    private String catalog;
+
+    public ShowCreateCatalogStmt(String catalog) {
+        this.catalog = catalog;
+    }
+
+    public String getCatalog() {
+        return catalog;
+    }
+
+    @Override
+    public void analyze(Analyzer analyzer) throws AnalysisException, 
UserException {
+        Util.checkCatalogEnabled();
+
+        super.analyze(analyzer);
+        if (Strings.isNullOrEmpty(catalog)) {
+            
ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_CATALOG_NAME, catalog);
+        }
+
+        if (!Env.getCurrentEnv().getAuth()
+                .checkCtlPriv(ConnectContext.get(), catalog, 
PrivPredicate.SHOW)) {
+            
ErrorReport.reportAnalysisException(ErrorCode.ERR_CATALOG_ACCESS_DENIED,
+                    ConnectContext.get().getQualifiedUser(), catalog);
+        }
+    }
+
+    @Override
+    public String toSql() {
+        return "SHOW CREATE CATALOG `" + catalog + "`";
+    }
+
+    @Override
+    public String toString() {
+        return toSql();
+    }
+
+    @Override
+    public ShowResultSetMetaData getMetaData() {
+        return META_DATA;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
index ecbcdf8790..854ee223d1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java
@@ -23,10 +23,12 @@ import org.apache.doris.analysis.CreateCatalogStmt;
 import org.apache.doris.analysis.DropCatalogStmt;
 import org.apache.doris.analysis.RefreshCatalogStmt;
 import org.apache.doris.analysis.ShowCatalogStmt;
+import org.apache.doris.analysis.ShowCreateCatalogStmt;
 import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.external.ExternalDatabase;
 import org.apache.doris.catalog.external.ExternalTable;
+import org.apache.doris.cluster.ClusterNamespace;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.CaseSensibility;
 import org.apache.doris.common.DdlException;
@@ -36,6 +38,7 @@ import org.apache.doris.common.PatternMatcher;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.io.Text;
 import org.apache.doris.common.io.Writable;
+import org.apache.doris.common.util.PrintableMap;
 import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.persist.OperationType;
 import org.apache.doris.persist.gson.GsonPostProcessable;
@@ -371,6 +374,31 @@ public class CatalogMgr implements Writable, 
GsonPostProcessable {
         return new ShowResultSet(showStmt.getMetaData(), rows);
     }
 
+    public ShowResultSet showCreateCatalog(ShowCreateCatalogStmt showStmt) 
throws AnalysisException {
+        List<List<String>> rows = Lists.newArrayList();
+        readLock();
+        try {
+            CatalogIf catalog = nameToCatalog.get(showStmt.getCatalog());
+            if (catalog == null) {
+                throw new AnalysisException("No catalog found with name " + 
showStmt.getCatalog());
+            }
+            StringBuilder sb = new StringBuilder();
+            sb.append("CREATE CATALOG 
`").append(ClusterNamespace.getNameFromFullName(showStmt.getCatalog()))
+                    .append("`");
+            if (catalog.getProperties().size() > 0) {
+                sb.append(" PROPERTIES (\n");
+                sb.append(new PrintableMap<>(catalog.getProperties(), "=", 
true, true, false));
+                sb.append("\n);");
+            }
+
+            
rows.add(Lists.newArrayList(ClusterNamespace.getNameFromFullName(showStmt.getCatalog()),
 sb.toString()));
+        } finally {
+            readUnlock();
+        }
+
+        return new ShowResultSet(showStmt.getMetaData(), rows);
+    }
+
     /**
      * Refresh the catalog meta and write the meta log.
      */
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
index 183487ee99..09388fc0b0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
@@ -38,6 +38,7 @@ import org.apache.doris.analysis.ShowClusterStmt;
 import org.apache.doris.analysis.ShowCollationStmt;
 import org.apache.doris.analysis.ShowColumnStatsStmt;
 import org.apache.doris.analysis.ShowColumnStmt;
+import org.apache.doris.analysis.ShowCreateCatalogStmt;
 import org.apache.doris.analysis.ShowCreateDbStmt;
 import org.apache.doris.analysis.ShowCreateFunctionStmt;
 import org.apache.doris.analysis.ShowCreateMaterializedViewStmt;
@@ -378,6 +379,8 @@ public class ShowExecutor {
             handleShowPolicy();
         } else if (stmt instanceof ShowCatalogStmt) {
             handleShowCatalogs();
+        } else if (stmt instanceof ShowCreateCatalogStmt) {
+            handleShowCreateCatalog();
         } else if (stmt instanceof ShowAnalyzeStmt) {
             handleShowAnalyze();
         } else if (stmt instanceof AdminCopyTabletStmt) {
@@ -2312,6 +2315,14 @@ public class ShowExecutor {
         resultSet = Env.getCurrentEnv().getCatalogMgr().showCatalogs(showStmt);
     }
 
+    // Show create catalog
+    private void handleShowCreateCatalog() throws AnalysisException {
+        ShowCreateCatalogStmt showStmt = (ShowCreateCatalogStmt) stmt;
+
+        resultSet = 
Env.getCurrentEnv().getCatalogMgr().showCreateCatalog(showStmt);
+    }
+
+
     private void handleShowAnalyze() throws AnalysisException {
         ShowAnalyzeStmt showStmt = (ShowAnalyzeStmt) stmt;
         StatisticsJobManager jobManager = 
Env.getCurrentEnv().getStatisticsJobManager();
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/CatalogMgrTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/CatalogMgrTest.java
index 7340cd8f18..b6a7e870bc 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/datasource/CatalogMgrTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/datasource/CatalogMgrTest.java
@@ -25,6 +25,7 @@ import org.apache.doris.analysis.CreateUserStmt;
 import org.apache.doris.analysis.DropCatalogStmt;
 import org.apache.doris.analysis.GrantStmt;
 import org.apache.doris.analysis.ShowCatalogStmt;
+import org.apache.doris.analysis.ShowCreateCatalogStmt;
 import org.apache.doris.analysis.SwitchStmt;
 import org.apache.doris.analysis.UserIdentity;
 import org.apache.doris.catalog.Column;
@@ -217,6 +218,15 @@ public class CatalogMgrTest extends TestWithFeService {
             }
         }
 
+        String showCreateCatalog = "SHOW CREATE CATALOG my_catalog";
+        ShowCreateCatalogStmt showCreateStmt = (ShowCreateCatalogStmt) 
parseAndAnalyzeStmt(showCreateCatalog);
+        showResultSet = mgr.showCreateCatalog(showCreateStmt);
+
+        Assert.assertEquals(1, showResultSet.getResultRows().size());
+        List<String> result = showResultSet.getResultRows().get(0);
+        Assertions.assertEquals("my_catalog", result.get(0));
+        Assertions.assertTrue(result.get(1).startsWith("CREATE CATALOG 
`my_catalog` PROPERTIES ("));
+
         testCatalogMgrPersist();
 
         String dropCatalogSql = "DROP CATALOG " + MY_CATALOG;
@@ -347,6 +357,23 @@ public class CatalogMgrTest extends TestWithFeService {
             Assert.assertEquals(e.getMessage(),
                     "errCode = 2, detailMessage = Access denied for user 
'default_cluster:user2' to catalog 'iceberg'");
         }
+
+        //test show create catalog: have permission to hive, have no 
permission to iceberg;
+        ShowCreateCatalogStmt user2ShowCreateHive = (ShowCreateCatalogStmt) 
parseAndAnalyzeStmt(
+                "show create catalog hive;", user2Ctx);
+        List<List<String>> user2ShowCreateHiveResult = 
env.getCatalogMgr().showCreateCatalog(user2ShowCreateHive)
+                .getResultRows();
+        Assert.assertTrue(
+                user2ShowCreateHiveResult.stream().map(l -> 
l.get(0)).anyMatch(c -> c.equals("hive")));
+        try {
+            env.getCatalogMgr()
+                    .showCreateCatalog(
+                            (ShowCreateCatalogStmt) parseAndAnalyzeStmt("show 
create catalog iceberg;", user2Ctx));
+            Assert.fail("");
+        } catch (AnalysisException e) {
+            Assert.assertEquals(e.getMessage(),
+                    "errCode = 2, detailMessage = Access denied for user 
'default_cluster:user2' to catalog 'iceberg'");
+        }
     }
 
 }


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

Reply via email to