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

yiguolei pushed a commit to branch dev-1.1.2
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/dev-1.1.2 by this push:
     new 91b1d34b67 [feature] show create materialized view (#9391) (#11352)
91b1d34b67 is described below

commit 91b1d34b67b517695204bfc9fb98f561809033c8
Author: yiguolei <[email protected]>
AuthorDate: Sat Jul 30 19:24:04 2022 +0800

    [feature] show create materialized view (#9391) (#11352)
    
    Co-authored-by: Stalary <[email protected]>
---
 docs/.vuepress/sidebar/en.js                       | 38 ++++-----
 docs/.vuepress/sidebar/zh-CN.js                    | 38 ++++-----
 fe/fe-core/src/main/cup/sql_parser.cup             |  4 +
 .../analysis/ShowCreateMaterializedViewStmt.java   | 77 +++++++++++++++++
 .../doris/catalog/MaterializedIndexMeta.java       |  4 +
 .../java/org/apache/doris/qe/ShowExecutor.java     | 31 ++++++-
 .../ShowCreateMaterializedViewStmtTest.java        | 97 ++++++++++++++++++++++
 .../org/apache/doris/utframe/UtFrameUtils.java     |  2 +
 8 files changed, 251 insertions(+), 40 deletions(-)

diff --git a/docs/.vuepress/sidebar/en.js b/docs/.vuepress/sidebar/en.js
index 593b1519b6..1bfa2a570d 100644
--- a/docs/.vuepress/sidebar/en.js
+++ b/docs/.vuepress/sidebar/en.js
@@ -790,27 +790,27 @@ module.exports = [
       "subscribe-mail-list",
       "feedback",
       {
-          title: "How to Contribute",
-          directoryPath: "how-to-contribute/",
-          initialOpenGroupIndex: -1,
-          children: [
-              "how-to-contribute",
-              "committer-guide",
-              "commit-format-specification",
-              "pull-request",
-          ],
+        title: "How to Contribute",
+        directoryPath: "how-to-contribute/",
+        initialOpenGroupIndex: -1,
+        children: [
+          "how-to-contribute",
+          "committer-guide",
+          "commit-format-specification",
+          "pull-request",
+        ],
       },
       {
-          title: "Release Process & Verification",
-          directoryPath: "release-and-verify/",
-          initialOpenGroupIndex: -1,
-          children: [
-              "release-prepare",
-              "release-doris-core",
-              "release-doris-connectors",
-              "release-complete",
-              "release-verify",
-          ],
+        title: "Release Process & Verification",
+        directoryPath: "release-and-verify/",
+        initialOpenGroupIndex: -1,
+        children: [
+          "release-prepare",
+          "release-doris-core",
+          "release-doris-connectors",
+          "release-complete",
+          "release-verify",
+        ],
       },
       "security",
     ],
diff --git a/docs/.vuepress/sidebar/zh-CN.js b/docs/.vuepress/sidebar/zh-CN.js
index ac30752025..5dc4a32a0d 100644
--- a/docs/.vuepress/sidebar/zh-CN.js
+++ b/docs/.vuepress/sidebar/zh-CN.js
@@ -794,27 +794,27 @@ module.exports = [
       "subscribe-mail-list",
       "feedback",
       {
-          title: "贡献指南",
-          directoryPath: "how-to-contribute/",
-          initialOpenGroupIndex: -1,
-          children: [
-              "how-to-contribute",
-              "committer-guide",
-              "commit-format-specification",
-              "pull-request",
-          ],
+        title: "贡献指南",
+        directoryPath: "how-to-contribute/",
+        initialOpenGroupIndex: -1,
+        children: [
+          "how-to-contribute",
+          "committer-guide",
+          "commit-format-specification",
+          "pull-request",
+        ],
       },
       {
-          title: "版本发布与校验",
-          directoryPath: "release-and-verify/",
-          initialOpenGroupIndex: -1,
-          children: [
-              "release-prepare",
-              "release-doris-core",
-              "release-doris-connectors",
-              "release-complete",
-              "release-verify",
-          ],
+        title: "版本发布与校验",
+        directoryPath: "release-and-verify/",
+        initialOpenGroupIndex: -1,
+        children: [
+          "release-prepare",
+          "release-doris-core",
+          "release-doris-connectors",
+          "release-complete",
+          "release-verify",
+        ],
       },
       "security",
     ],
diff --git a/fe/fe-core/src/main/cup/sql_parser.cup 
b/fe/fe-core/src/main/cup/sql_parser.cup
index 98a2deec2a..65662f1e2d 100644
--- a/fe/fe-core/src/main/cup/sql_parser.cup
+++ b/fe/fe-core/src/main/cup/sql_parser.cup
@@ -2885,6 +2885,10 @@ show_param ::=
     {:
         RESULT = new ShowLastInsertStmt();
     :}
+    | KW_CREATE KW_MATERIALIZED KW_VIEW ident:mvName KW_ON table_name:tableName
+    {:
+        RESULT = new ShowCreateMaterializedViewStmt(mvName, tableName);
+    :}
     ;
 
 opt_tmp ::=
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateMaterializedViewStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateMaterializedViewStmt.java
new file mode 100644
index 0000000000..a18ffd8ed8
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateMaterializedViewStmt.java
@@ -0,0 +1,77 @@
+// 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.Catalog;
+import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.ErrorReport;
+import org.apache.doris.common.UserException;
+import org.apache.doris.mysql.privilege.PrivPredicate;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.ShowResultSetMetaData;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * SHOW CREATE MATERIALIZED VIEW mv_name ON table_name.
+ **/
+@AllArgsConstructor
+@Getter
+public class ShowCreateMaterializedViewStmt extends ShowStmt {
+
+    private static final ShowResultSetMetaData META_DATA =
+            ShowResultSetMetaData.builder()
+                    .addColumn(new Column("TableName", 
ScalarType.createVarchar(255)))
+                    .addColumn(new Column("ViewName", 
ScalarType.createVarchar(255)))
+                    .addColumn(new Column("CreateStmt", 
ScalarType.createVarchar(65535)))
+                    .build();
+
+    private String mvName;
+
+    private TableName tableName;
+
+    @Override
+    public void analyze(Analyzer analyzer) throws UserException {
+        super.analyze(analyzer);
+        tableName.analyze(analyzer);
+        if (!Catalog.getCurrentCatalog().getAuth()
+                .checkTblPriv(ConnectContext.get(), tableName.getDb(), 
tableName.getTbl(), PrivPredicate.SHOW)) {
+            
ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, 
"SHOW CREATE MATERIALIZED",
+                    ConnectContext.get().getQualifiedUser(),
+                    ConnectContext.get().getRemoteIP(),
+                    tableName.toSql());
+        }
+    }
+
+    @Override
+    public ShowResultSetMetaData getMetaData() {
+        return META_DATA;
+    }
+
+    @Override
+    public String toSql() {
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("SHOW CREATE MATERIALIZED VIEW ");
+        stringBuilder.append("`").append(mvName).append("` ");
+        stringBuilder.append("ON ").append(tableName.toSql());
+        return stringBuilder.toString();
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java
index d485f129d0..ede7c32a17 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java
@@ -136,6 +136,10 @@ public class MaterializedIndexMeta implements Writable, 
GsonPostProcessable {
         return null;
     }
 
+    public OriginStatement getDefineStmt() {
+        return defineStmt;
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (!(obj instanceof MaterializedIndexMeta)) {
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 b387a0fb9f..6ae0f4c349 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
@@ -36,6 +36,7 @@ import org.apache.doris.analysis.ShowColumnStatsStmt;
 import org.apache.doris.analysis.ShowColumnStmt;
 import org.apache.doris.analysis.ShowCreateDbStmt;
 import org.apache.doris.analysis.ShowCreateFunctionStmt;
+import org.apache.doris.analysis.ShowCreateMaterializedViewStmt;
 import org.apache.doris.analysis.ShowCreateRoutineLoadStmt;
 import org.apache.doris.analysis.ShowCreateTableStmt;
 import org.apache.doris.analysis.ShowDataSkewStmt;
@@ -102,6 +103,7 @@ import org.apache.doris.catalog.Function;
 import org.apache.doris.catalog.Index;
 import org.apache.doris.catalog.MaterializedIndex;
 import org.apache.doris.catalog.MaterializedIndex.IndexExtState;
+import org.apache.doris.catalog.MaterializedIndexMeta;
 import org.apache.doris.catalog.MetadataViewer;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.Partition;
@@ -340,6 +342,8 @@ public class ShowExecutor {
             handleAdminShowTabletStorageFormat();
         } else if (stmt instanceof AdminDiagnoseTabletStmt) {
             handleAdminDiagnoseTablet();
+        } else if (stmt instanceof ShowCreateMaterializedViewStmt) {
+            handleShowCreateMaterializedView();
         } else {
             handleEmtpy();
         }
@@ -393,7 +397,7 @@ public class ShowExecutor {
         rowSet.add(Lists.newArrayList("HIVE", "YES", "HIVE database which data 
is in it", "NO", "NO", "NO"));
         rowSet.add(Lists.newArrayList("ICEBERG", "YES", "ICEBERG data lake 
which data is in it", "NO", "NO", "NO"));
         rowSet.add(Lists.newArrayList("ODBC", "YES", "ODBC driver which data 
we can connect", "NO", "NO", "NO"));
-        
+
         // Only success
         resultSet = new ShowResultSet(showStmt.getMetaData(), rowSet);
     }
@@ -1747,7 +1751,7 @@ public class ShowExecutor {
         List<List<String>> infos = 
Catalog.getCurrentCatalog().getAuth().getRoleInfo();
         resultSet = new ShowResultSet(showStmt.getMetaData(), infos);
     }
-    
+
     private void handleShowTrash() {
         ShowTrashStmt showStmt = (ShowTrashStmt) stmt;
         List<List<String>> infos = Lists.newArrayList();
@@ -2179,4 +2183,27 @@ public class ShowExecutor {
         resultSet = new ShowResultSet(showMetaData, resultRowSet);
     }
 
+    private void handleShowCreateMaterializedView() throws AnalysisException {
+        List<List<String>> resultRowSet = new ArrayList<>();
+        ShowCreateMaterializedViewStmt showStmt = 
(ShowCreateMaterializedViewStmt) stmt;
+        Database db = 
Catalog.getCurrentCatalog().getDbOrAnalysisException(showStmt.getTableName().getDb());
+        Table table = 
db.getTableOrAnalysisException(showStmt.getTableName().getTbl());
+        if (table instanceof OlapTable) {
+            OlapTable baseTable = ((OlapTable) table);
+            Long indexIdByName = 
baseTable.getIndexIdByName(showStmt.getMvName());
+            if (indexIdByName != null) {
+                MaterializedIndexMeta meta = 
baseTable.getIndexMetaByIndexId(indexIdByName);
+                if (meta != null && meta.getDefineStmt() != null) {
+                    String originStmt = meta.getDefineStmt().originStmt;
+                    List<String> data = new ArrayList<>();
+                    data.add(showStmt.getTableName().getTbl());
+                    data.add(showStmt.getMvName());
+                    data.add(originStmt);
+                    resultRowSet.add(data);
+                }
+            }
+        }
+        resultSet = new ShowResultSet(showStmt.getMetaData(), resultRowSet);
+    }
+
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowCreateMaterializedViewStmtTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowCreateMaterializedViewStmtTest.java
new file mode 100644
index 0000000000..501b50b418
--- /dev/null
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowCreateMaterializedViewStmtTest.java
@@ -0,0 +1,97 @@
+// 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.common.AnalysisException;
+import org.apache.doris.common.ExceptionChecker;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.ShowExecutor;
+import org.apache.doris.utframe.DorisAssert;
+import org.apache.doris.utframe.UtFrameUtils;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.UUID;
+
+/**
+ * test for ShowCreateMaterializedViewStmt.
+ **/
+public class ShowCreateMaterializedViewStmtTest {
+
+    private static String runningDir = 
"fe/mocked/ShowCreateMaterializedViewStmtTest/" + UUID.randomUUID() + "/";
+
+    private static ConnectContext connectContext;
+
+    private static DorisAssert dorisAssert;
+
+    /**
+     * init.
+     **/
+    @BeforeClass
+    public static void beforeClass() throws Exception {
+        UtFrameUtils.createDorisCluster(runningDir);
+
+        // create connect context
+        connectContext = UtFrameUtils.createDefaultCtx();
+        dorisAssert = new DorisAssert(connectContext);
+        dorisAssert.withDatabase("test")
+                .withTable("create table test.table1 (k1 int, k2 int) 
distributed by hash(k1) "
+                        + "buckets 1 properties(\"replication_num\" = \"1\");")
+                .withMaterializedView("CREATE MATERIALIZED VIEW test_mv as 
select k1 from test.table1;");
+    }
+
+    @AfterClass
+    public static void tearDown() {
+        File file = new File(runningDir);
+        file.delete();
+    }
+
+    @Test
+    public void testNormal() throws Exception {
+        String showMvSql = "SHOW CREATE MATERIALIZED VIEW test_mv on 
test.table1;";
+        ShowCreateMaterializedViewStmt showStmt =
+                (ShowCreateMaterializedViewStmt) 
UtFrameUtils.parseAndAnalyzeStmt(showMvSql, connectContext);
+        ShowExecutor executor = new ShowExecutor(connectContext, showStmt);
+        Assert.assertEquals(executor.execute().getResultRows().get(0).get(2),
+                "CREATE MATERIALIZED VIEW test_mv as select k1 from 
test.table1;");
+    }
+
+    @Test
+    public void testNoView() throws Exception {
+        String showMvSql = "SHOW CREATE MATERIALIZED VIEW test_mv_empty on 
test.table1;";
+        ShowCreateMaterializedViewStmt showStmt =
+                (ShowCreateMaterializedViewStmt) 
UtFrameUtils.parseAndAnalyzeStmt(showMvSql, connectContext);
+        ShowExecutor executor = new ShowExecutor(connectContext, showStmt);
+        Assert.assertTrue(executor.execute().getResultRows().isEmpty());
+    }
+
+    @Test
+    public void testNoTable() throws Exception {
+        String showMvSql = "SHOW CREATE MATERIALIZED VIEW test_mv on 
test.table1_error;";
+        ShowCreateMaterializedViewStmt showStmt =
+                (ShowCreateMaterializedViewStmt) 
UtFrameUtils.parseAndAnalyzeStmt(showMvSql, connectContext);
+        ShowExecutor executor = new ShowExecutor(connectContext, showStmt);
+        ExceptionChecker.expectThrowsWithMsg(AnalysisException.class,
+                "Unknown table 'table1_error' in default_cluster:test", 
executor::execute);
+
+    }
+}
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java 
b/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java
index fc20d571bc..2c7e70232f 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java
@@ -33,6 +33,7 @@ import org.apache.doris.common.util.SqlParserUtils;
 import org.apache.doris.mysql.privilege.PaloAuth;
 import org.apache.doris.planner.Planner;
 import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.OriginStatement;
 import org.apache.doris.qe.QueryState;
 import org.apache.doris.qe.StmtExecutor;
 import org.apache.doris.system.Backend;
@@ -98,6 +99,7 @@ public class UtFrameUtils {
             }
         }
         statementBase.analyze(analyzer);
+        statementBase.setOrigStmt(new OriginStatement(originStmt, 0));
         return statementBase;
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to