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

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


The following commit(s) were added to refs/heads/master by this push:
     new 61edb9e4d88 [feature](mtmv)(2)Implementing mtmv using antlr (#26102)
61edb9e4d88 is described below

commit 61edb9e4d88d1c10e778883454bfbfa48a901521
Author: zhangdong <[email protected]>
AuthorDate: Fri Nov 3 11:57:00 2023 +0800

    [feature](mtmv)(2)Implementing mtmv using antlr (#26102)
    
    Implementing mtmv using antlr,
    
    No specific business logic was implemented, therefore an exception was 
thrown during execution
    ```
    throw new AnalysisException("current not support.");
    ```
---
 .../antlr4/org/apache/doris/nereids/DorisLexer.g4  |   2 +
 .../antlr4/org/apache/doris/nereids/DorisParser.g4 |  44 +++++-
 .../main/java/org/apache/doris/mtmv/EnvInfo.java   |  43 ++++++
 .../org/apache/doris/mtmv/MTMVRefreshEnum.java     |  66 ++++++++
 .../org/apache/doris/mtmv/MTMVRefreshInfo.java     | 109 +++++++++++++
 .../org/apache/doris/mtmv/MTMVRefreshSchedule.java | 101 +++++++++++++
 .../apache/doris/mtmv/MTMVRefreshTriggerInfo.java  |  89 +++++++++++
 .../doris/nereids/parser/LogicalPlanBuilder.java   | 166 ++++++++++++++++++++
 .../apache/doris/nereids/trees/plans/PlanType.java |   6 +-
 .../trees/plans/commands/AlterMTMVCommand.java     |  58 +++++++
 .../trees/plans/commands/CreateMTMVCommand.java    |  59 ++++++++
 .../trees/plans/commands/DropMTMVCommand.java      |  50 ++++++
 .../trees/plans/commands/RefreshMTMVCommand.java   |  50 ++++++
 .../trees/plans/commands/info/AlterMTMVInfo.java   |  62 ++++++++
 .../plans/commands/info/AlterMTMVPropertyInfo.java |  53 +++++++
 .../plans/commands/info/AlterMTMVRefreshInfo.java  |  54 +++++++
 .../plans/commands/info/AlterMTMVRenameInfo.java   |  59 ++++++++
 .../trees/plans/commands/info/CreateMTMVInfo.java  |  82 ++++++++++
 .../trees/plans/commands/info/DropMTMVInfo.java    |  52 +++++++
 .../trees/plans/commands/info/RefreshMTMVInfo.java |  48 ++++++
 .../commands/info/SimpleColumnDefinition.java      |  42 ++++++
 .../trees/plans/commands/info/TableNameInfo.java   | 168 +++++++++++++++++++++
 .../trees/plans/visitor/CommandVisitor.java        |  20 +++
 23 files changed, 1481 insertions(+), 2 deletions(-)

diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4
index 6bfc38d7611..81b6c5e351d 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4
@@ -331,6 +331,7 @@ LOCATION: 'LOCATION';
 LOCK: 'LOCK';
 LOGICAL: 'LOGICAL';
 LOW_PRIORITY: 'LOW_PRIORITY';
+MANUAL: 'MANUAL';
 MAP: 'MAP';
 MATCH: 'MATCH';
 MATCH_ALL: 'MATCH_ALL';
@@ -447,6 +448,7 @@ ROW: 'ROW';
 ROWS: 'ROWS';
 S3: 'S3';
 SAMPLE: 'SAMPLE';
+SCHEDULE: 'SCHEDULE';
 SCHEDULER: 'SCHEDULER';
 SCHEMA: 'SCHEMA';
 SCHEMAS: 'SCHEMAS';
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index 8a1896a3d0c..7e2f4237e14 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -83,6 +83,19 @@ statement
         TO filePath=STRING_LITERAL
         (propertyClause)?
         (withRemoteStorageSystem)?                                     #export
+    | CREATE MATERIALIZED VIEW (IF NOT EXISTS)? mvName=multipartIdentifier
+        (LEFT_PAREN cols=simpleColumnDefs RIGHT_PAREN)? buildMode?
+        (REFRESH refreshMethod? refreshTrigger?)?
+        (KEY keys=identifierList)?
+        (COMMENT STRING_LITERAL)?
+        (DISTRIBUTED BY (HASH hashKeys=identifierList | RANDOM) (BUCKETS 
(INTEGER_VALUE | AUTO))?)?
+        propertyClause?
+        AS query                                                        
#createMTMV
+    | REFRESH MATERIALIZED VIEW mvName=multipartIdentifier              
#refreshMTMV
+    | ALTER MATERIALIZED VIEW mvName=multipartIdentifier ((RENAME 
newName=identifier)
+       | (REFRESH (refreshMethod | refreshTrigger | refreshMethod 
refreshTrigger))
+       | (SET  LEFT_PAREN fileProperties=propertyItemList RIGHT_PAREN))   
#alterMTMV
+    | DROP MATERIALIZED VIEW (IF EXISTS)? mvName=multipartIdentifier      
#dropMTMV
     ;
 
 dataDesc
@@ -110,6 +123,26 @@ dataDesc
     ;
 
 // -----------------Command accessories-----------------
+buildMode
+    : BUILD (IMMEDIATE | DEFERRED)
+    ;
+
+refreshTrigger
+    : ON MANUAL
+    | ON SCHEDULE refreshSchedule
+    ;
+
+refreshSchedule
+    : EVERY INTEGER_VALUE mvRefreshUnit (STARTS STRING_LITERAL)?
+    ;
+
+mvRefreshUnit
+    : SECOND | MINUTE | HOUR | DAY | WEEK
+    ;
+
+refreshMethod
+    : COMPLETE
+    ;
 
 identifierOrText
     : errorCapturingIdentifier
@@ -413,7 +446,14 @@ multipartIdentifier
     ;
     
 // ----------------Create Table Fields----------
-    
+simpleColumnDefs
+    : cols+=simpleColumnDef (COMMA cols+=simpleColumnDef)*
+    ;
+
+simpleColumnDef
+    : colName=identifier (COMMENT comment=STRING_LITERAL)?
+    ;
+
 columnDefs
     : cols+=columnDef (COMMA cols+=columnDef)*
     ;
@@ -958,6 +998,7 @@ nonReserved
     | LOCATION
     | LOCK
     | LOGICAL
+    | MANUAL
     | MAP
     | MATERIALIZED
     | MAX
@@ -1033,6 +1074,7 @@ nonReserved
     | ROUTINE
     | S3
     | SAMPLE
+    | SCHEDULE
     | SCHEDULER
     | SCHEMA
     | SECOND
diff --git a/fe/fe-core/src/main/java/org/apache/doris/mtmv/EnvInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/mtmv/EnvInfo.java
new file mode 100644
index 00000000000..c5c92a15db9
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/EnvInfo.java
@@ -0,0 +1,43 @@
+// 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.mtmv;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * EnvInfo
+ */
+public class EnvInfo {
+    @SerializedName("cn")
+    private String ctlName;
+    @SerializedName("dn")
+    private String dbName;
+
+    public EnvInfo(String ctlName, String dbName) {
+        this.ctlName = ctlName;
+        this.dbName = dbName;
+    }
+
+    public String getCtlName() {
+        return ctlName;
+    }
+
+    public String getDbName() {
+        return dbName;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshEnum.java 
b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshEnum.java
new file mode 100644
index 00000000000..6f14a2ba014
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshEnum.java
@@ -0,0 +1,66 @@
+// 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.mtmv;
+
+/**
+ * refresh enum
+ */
+public class MTMVRefreshEnum {
+
+    /**
+     * RefreshMethod
+     */
+    public enum RefreshMethod {
+        COMPLETE //complete
+    }
+
+    /**
+     * BuildMode
+     */
+    public enum BuildMode {
+        IMMEDIATE, //right now
+        DEFERRED // deferred
+    }
+
+    /**
+     * RefreshTrigger
+     */
+    public enum RefreshTrigger {
+        MANUAL, //manual
+        SCHEDULE // schedule
+    }
+
+    /**
+     * MTMVState
+     */
+    public enum MTMVState {
+        INIT,
+        NORMAL,
+        SCHEMA_CHANGE
+    }
+
+    /**
+     * MTMVRefreshState
+     */
+    public enum MTMVRefreshState {
+        INIT,
+        REFRESHING,
+        FAIL,
+        SUCCESS
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshInfo.java
new file mode 100644
index 00000000000..c49bcbc190a
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshInfo.java
@@ -0,0 +1,109 @@
+// 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.mtmv;
+
+import org.apache.doris.mtmv.MTMVRefreshEnum.BuildMode;
+import org.apache.doris.mtmv.MTMVRefreshEnum.RefreshMethod;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.Objects;
+
+/**
+ * refresh info
+ */
+public class MTMVRefreshInfo {
+    @SerializedName("bm")
+    private BuildMode buildMode;
+    @SerializedName("rm")
+    private RefreshMethod refreshMethod;
+    @SerializedName("rti")
+    private MTMVRefreshTriggerInfo refreshTriggerInfo;
+
+    public MTMVRefreshInfo() {
+    }
+
+    public MTMVRefreshInfo(BuildMode buildMode,
+            RefreshMethod refreshMethod,
+            MTMVRefreshTriggerInfo refreshTriggerInfo) {
+        this.buildMode = Objects.requireNonNull(buildMode, "require buildMode 
object");
+        this.refreshMethod = Objects.requireNonNull(refreshMethod, "require 
refreshMethod object");
+        this.refreshTriggerInfo = Objects.requireNonNull(refreshTriggerInfo, 
"require refreshTriggerInfo object");
+    }
+
+    public void validate() {
+        if (refreshTriggerInfo != null) {
+            refreshTriggerInfo.validate();
+        }
+    }
+
+    public BuildMode getBuildMode() {
+        return buildMode;
+    }
+
+    public RefreshMethod getRefreshMethod() {
+        return refreshMethod;
+    }
+
+    public MTMVRefreshTriggerInfo getRefreshTriggerInfo() {
+        return refreshTriggerInfo;
+    }
+
+    public void setBuildMode(BuildMode buildMode) {
+        this.buildMode = buildMode;
+    }
+
+    public void setRefreshMethod(RefreshMethod refreshMethod) {
+        this.refreshMethod = refreshMethod;
+    }
+
+    public void setRefreshTriggerInfo(
+            MTMVRefreshTriggerInfo refreshTriggerInfo) {
+        this.refreshTriggerInfo = refreshTriggerInfo;
+    }
+
+    /**
+     * update refreshInfo
+     */
+    public MTMVRefreshInfo updateNotNull(MTMVRefreshInfo newRefreshInfo) {
+        Objects.requireNonNull(newRefreshInfo);
+        if (newRefreshInfo.buildMode != null) {
+            this.buildMode = newRefreshInfo.buildMode;
+        }
+        if (newRefreshInfo.refreshMethod != null) {
+            this.refreshMethod = newRefreshInfo.refreshMethod;
+        }
+        if (newRefreshInfo.refreshTriggerInfo != null) {
+            this.refreshTriggerInfo = newRefreshInfo.refreshTriggerInfo;
+        }
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("BUILD ");
+        builder.append(buildMode);
+        builder.append(" REFRESH ");
+        builder.append(refreshMethod);
+        builder.append(" ");
+        builder.append(refreshTriggerInfo);
+        return builder.toString();
+    }
+
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshSchedule.java 
b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshSchedule.java
new file mode 100644
index 00000000000..2f4aa5f96c8
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshSchedule.java
@@ -0,0 +1,101 @@
+// 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.mtmv;
+
+import org.apache.doris.common.util.TimeUtils;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.scheduler.common.IntervalUnit;
+
+import com.google.gson.annotations.SerializedName;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Objects;
+
+/**
+ * refresh schedule in mtmv
+ */
+public class MTMVRefreshSchedule {
+    @SerializedName("st")
+    private String startTime;
+    @SerializedName("i")
+    private long interval;
+    @SerializedName("tu")
+    private IntervalUnit timeUnit;
+
+    // For deserialization
+    public MTMVRefreshSchedule() {
+    }
+
+    public MTMVRefreshSchedule(String startTime, int interval, IntervalUnit 
timeUnit) {
+        this.startTime = startTime;
+        this.interval = Objects.requireNonNull(interval, "require interval 
object");
+        this.timeUnit = Objects.requireNonNull(timeUnit, "require timeUnit 
object");
+    }
+
+    /**
+     * getStartTime
+     * @return startTime
+     */
+    public String getStartTime() {
+        return startTime;
+    }
+
+    /**
+     * getInterval
+     * @return interval
+     */
+    public long getInterval() {
+        return interval;
+    }
+
+    /**
+     * getTimeUnit
+     * @return timeUnit
+     */
+    public IntervalUnit getTimeUnit() {
+        return timeUnit;
+    }
+
+    /**
+     * validate
+     */
+    public void validate() {
+        if (interval <= 0) {
+            throw new AnalysisException("interval must be greater than 0");
+        }
+        if (!StringUtils.isEmpty(startTime)) {
+            long startsTimeMillis = TimeUtils.timeStringToLong(startTime);
+            if (startsTimeMillis < System.currentTimeMillis()) {
+                throw new AnalysisException("starts time must be greater than 
current time");
+            }
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder("EVERY ");
+        builder.append(interval);
+        builder.append(" ");
+        builder.append(timeUnit);
+        if (!StringUtils.isEmpty(startTime)) {
+            builder.append(" STARTS ");
+            builder.append(startTime);
+        }
+        return builder.toString();
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshTriggerInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshTriggerInfo.java
new file mode 100644
index 00000000000..08058dd225e
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRefreshTriggerInfo.java
@@ -0,0 +1,89 @@
+// 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.mtmv;
+
+import org.apache.doris.mtmv.MTMVRefreshEnum.RefreshTrigger;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.Objects;
+
+/**
+ * refresh trigger info in mtmv
+ */
+public class MTMVRefreshTriggerInfo {
+    @SerializedName("rt")
+    private RefreshTrigger refreshTrigger;
+    @SerializedName("it")
+    private MTMVRefreshSchedule intervalTrigger;
+
+    // For deserialization
+    public MTMVRefreshTriggerInfo() {
+    }
+
+    public MTMVRefreshTriggerInfo(RefreshTrigger trigger) {
+        this(trigger, null);
+    }
+
+    public MTMVRefreshTriggerInfo(RefreshTrigger refreshTrigger, 
MTMVRefreshSchedule intervalTrigger) {
+        this.refreshTrigger = Objects.requireNonNull(refreshTrigger, "require 
refreshTrigger object");
+        this.intervalTrigger = intervalTrigger;
+    }
+
+    /**
+     * getRefreshTrigger
+     *
+     * @return RefreshTrigger
+     */
+    public RefreshTrigger getRefreshTrigger() {
+        return refreshTrigger;
+    }
+
+    /**
+     * getIntervalTrigger
+     *
+     * @return MTMVRefreshSchedule
+     */
+    public MTMVRefreshSchedule getIntervalTrigger() {
+        return intervalTrigger;
+    }
+
+    /**
+     * validate
+     */
+    public void validate() {
+        if (refreshTrigger.equals(RefreshTrigger.SCHEDULE)) {
+            if (intervalTrigger == null) {
+                throw new AnalysisException("require intervalTrigger object.");
+            }
+            intervalTrigger.validate();
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder("ON ");
+        builder.append(refreshTrigger);
+        if (intervalTrigger != null) {
+            builder.append(" ");
+            builder.append(intervalTrigger);
+        }
+        return builder.toString();
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index a05e24b6944..a8204f1ea97 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -29,10 +29,17 @@ import org.apache.doris.common.Config;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.Pair;
 import org.apache.doris.load.loadv2.LoadTask;
+import org.apache.doris.mtmv.MTMVRefreshEnum.BuildMode;
+import org.apache.doris.mtmv.MTMVRefreshEnum.RefreshMethod;
+import org.apache.doris.mtmv.MTMVRefreshEnum.RefreshTrigger;
+import org.apache.doris.mtmv.MTMVRefreshInfo;
+import org.apache.doris.mtmv.MTMVRefreshSchedule;
+import org.apache.doris.mtmv.MTMVRefreshTriggerInfo;
 import org.apache.doris.nereids.DorisParser;
 import org.apache.doris.nereids.DorisParser.AggClauseContext;
 import org.apache.doris.nereids.DorisParser.AliasQueryContext;
 import org.apache.doris.nereids.DorisParser.AliasedQueryContext;
+import org.apache.doris.nereids.DorisParser.AlterMTMVContext;
 import org.apache.doris.nereids.DorisParser.ArithmeticBinaryContext;
 import org.apache.doris.nereids.DorisParser.ArithmeticUnaryContext;
 import org.apache.doris.nereids.DorisParser.ArrayLiteralContext;
@@ -42,6 +49,7 @@ import 
org.apache.doris.nereids.DorisParser.BooleanExpressionContext;
 import org.apache.doris.nereids.DorisParser.BooleanLiteralContext;
 import org.apache.doris.nereids.DorisParser.BracketJoinHintContext;
 import org.apache.doris.nereids.DorisParser.BracketRelationHintContext;
+import org.apache.doris.nereids.DorisParser.BuildModeContext;
 import org.apache.doris.nereids.DorisParser.CollateContext;
 import org.apache.doris.nereids.DorisParser.ColumnDefContext;
 import org.apache.doris.nereids.DorisParser.ColumnDefsContext;
@@ -54,6 +62,7 @@ import 
org.apache.doris.nereids.DorisParser.ComplexColTypeListContext;
 import org.apache.doris.nereids.DorisParser.ComplexDataTypeContext;
 import org.apache.doris.nereids.DorisParser.ConstantContext;
 import org.apache.doris.nereids.DorisParser.ConstantSeqContext;
+import org.apache.doris.nereids.DorisParser.CreateMTMVContext;
 import org.apache.doris.nereids.DorisParser.CreateRowPolicyContext;
 import org.apache.doris.nereids.DorisParser.CreateTableContext;
 import org.apache.doris.nereids.DorisParser.CteContext;
@@ -64,6 +73,7 @@ import org.apache.doris.nereids.DorisParser.Date_subContext;
 import org.apache.doris.nereids.DorisParser.DecimalLiteralContext;
 import org.apache.doris.nereids.DorisParser.DeleteContext;
 import org.apache.doris.nereids.DorisParser.DereferenceContext;
+import org.apache.doris.nereids.DorisParser.DropMTMVContext;
 import org.apache.doris.nereids.DorisParser.ElementAtContext;
 import org.apache.doris.nereids.DorisParser.ExistContext;
 import org.apache.doris.nereids.DorisParser.ExplainContext;
@@ -98,6 +108,7 @@ import 
org.apache.doris.nereids.DorisParser.LogicalNotContext;
 import org.apache.doris.nereids.DorisParser.MapLiteralContext;
 import org.apache.doris.nereids.DorisParser.MultiStatementsContext;
 import org.apache.doris.nereids.DorisParser.MultipartIdentifierContext;
+import org.apache.doris.nereids.DorisParser.MvRefreshUnitContext;
 import org.apache.doris.nereids.DorisParser.NamedExpressionContext;
 import org.apache.doris.nereids.DorisParser.NamedExpressionSeqContext;
 import org.apache.doris.nereids.DorisParser.NullLiteralContext;
@@ -118,6 +129,10 @@ import 
org.apache.doris.nereids.DorisParser.QualifiedNameContext;
 import org.apache.doris.nereids.DorisParser.QueryContext;
 import org.apache.doris.nereids.DorisParser.QueryOrganizationContext;
 import org.apache.doris.nereids.DorisParser.QueryTermContext;
+import org.apache.doris.nereids.DorisParser.RefreshMTMVContext;
+import org.apache.doris.nereids.DorisParser.RefreshMethodContext;
+import org.apache.doris.nereids.DorisParser.RefreshScheduleContext;
+import org.apache.doris.nereids.DorisParser.RefreshTriggerContext;
 import org.apache.doris.nereids.DorisParser.RegularQuerySpecificationContext;
 import org.apache.doris.nereids.DorisParser.RelationContext;
 import org.apache.doris.nereids.DorisParser.RollupDefContext;
@@ -130,6 +145,8 @@ import 
org.apache.doris.nereids.DorisParser.SelectClauseContext;
 import org.apache.doris.nereids.DorisParser.SelectColumnClauseContext;
 import org.apache.doris.nereids.DorisParser.SelectHintContext;
 import org.apache.doris.nereids.DorisParser.SetOperationContext;
+import org.apache.doris.nereids.DorisParser.SimpleColumnDefContext;
+import org.apache.doris.nereids.DorisParser.SimpleColumnDefsContext;
 import org.apache.doris.nereids.DorisParser.SingleStatementContext;
 import org.apache.doris.nereids.DorisParser.SortClauseContext;
 import org.apache.doris.nereids.DorisParser.SortItemContext;
@@ -290,30 +307,43 @@ import org.apache.doris.nereids.trees.plans.LimitPhase;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.algebra.Aggregate;
 import org.apache.doris.nereids.trees.plans.algebra.SetOperation.Qualifier;
+import org.apache.doris.nereids.trees.plans.commands.AlterMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.Command;
+import org.apache.doris.nereids.trees.plans.commands.CreateMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.CreatePolicyCommand;
 import org.apache.doris.nereids.trees.plans.commands.CreateTableCommand;
 import org.apache.doris.nereids.trees.plans.commands.DeleteCommand;
+import org.apache.doris.nereids.trees.plans.commands.DropMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.ExplainCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel;
 import org.apache.doris.nereids.trees.plans.commands.ExportCommand;
 import org.apache.doris.nereids.trees.plans.commands.InsertIntoTableCommand;
 import org.apache.doris.nereids.trees.plans.commands.LoadCommand;
+import org.apache.doris.nereids.trees.plans.commands.RefreshMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.UpdateCommand;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVInfo;
+import 
org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVPropertyInfo;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVRefreshInfo;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVRenameInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.BulkLoadDataDesc;
 import org.apache.doris.nereids.trees.plans.commands.info.BulkStorageDesc;
 import org.apache.doris.nereids.trees.plans.commands.info.ColumnDefinition;
+import org.apache.doris.nereids.trees.plans.commands.info.CreateMTMVInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.CreateTableInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.DefaultValue;
 import 
org.apache.doris.nereids.trees.plans.commands.info.DistributionDescriptor;
+import org.apache.doris.nereids.trees.plans.commands.info.DropMTMVInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.FixedRangePartition;
 import org.apache.doris.nereids.trees.plans.commands.info.InPartition;
 import org.apache.doris.nereids.trees.plans.commands.info.IndexDefinition;
 import org.apache.doris.nereids.trees.plans.commands.info.LessThanPartition;
 import org.apache.doris.nereids.trees.plans.commands.info.PartitionDefinition;
 import 
org.apache.doris.nereids.trees.plans.commands.info.PartitionDefinition.MaxValue;
+import org.apache.doris.nereids.trees.plans.commands.info.RefreshMTMVInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.RollupDefinition;
+import 
org.apache.doris.nereids.trees.plans.commands.info.SimpleColumnDefinition;
 import org.apache.doris.nereids.trees.plans.commands.info.StepPartition;
+import org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo;
 import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
 import org.apache.doris.nereids.trees.plans.logical.LogicalCTE;
 import org.apache.doris.nereids.trees.plans.logical.LogicalExcept;
@@ -344,6 +374,7 @@ import org.apache.doris.policy.FilterType;
 import org.apache.doris.policy.PolicyTypeEnum;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.qe.SqlModeHelper;
+import org.apache.doris.scheduler.common.IntervalUnit;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -441,6 +472,141 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
         return new InsertIntoTableCommand(sink, 
Optional.ofNullable(labelName), isOverwrite);
     }
 
+    @Override
+    public CreateMTMVCommand visitCreateMTMV(CreateMTMVContext ctx) {
+        List<String> nameParts = visitMultipartIdentifier(ctx.mvName);
+
+        BuildMode buildMode = visitBuildMode(ctx.buildMode());
+        RefreshMethod refreshMethod = visitRefreshMethod(ctx.refreshMethod());
+        MTMVRefreshTriggerInfo refreshTriggerInfo = 
visitRefreshTrigger(ctx.refreshTrigger());
+        LogicalPlan logicalPlan = visitQuery(ctx.query());
+        String querySql = getOriginSql(ctx.query());
+
+        boolean isHash = ctx.HASH() != null || ctx.RANDOM() == null;
+        int bucketNum = FeConstants.default_bucket_num;
+        if (isHash && ctx.INTEGER_VALUE() != null) {
+            bucketNum = Integer.parseInt(ctx.INTEGER_VALUE().getText());
+        }
+        DistributionDescriptor desc = new DistributionDescriptor(isHash, 
ctx.AUTO() != null,
+                bucketNum, ctx.HASH() != null ? 
visitIdentifierList(ctx.hashKeys) : null);
+        Map<String, String> properties = ctx.propertyClause() != null
+                ? Maps.newHashMap(visitPropertyClause(ctx.propertyClause())) : 
Maps.newHashMap();
+        return new CreateMTMVCommand(new CreateMTMVInfo(ctx.EXISTS() != null, 
new TableNameInfo(nameParts),
+                ctx.keys != null ? visitIdentifierList(ctx.keys) : 
ImmutableList.of(),
+                ctx.STRING_LITERAL() != null ? ctx.STRING_LITERAL().getText() 
: null,
+                desc, properties, logicalPlan, querySql,
+                new MTMVRefreshInfo(buildMode, refreshMethod, 
refreshTriggerInfo),
+                ctx.cols == null ? Lists.newArrayList() : 
visitSimpleColumnDefs(ctx.cols)
+        ));
+    }
+
+    @Override
+    public List<SimpleColumnDefinition> 
visitSimpleColumnDefs(SimpleColumnDefsContext ctx) {
+        if (ctx == null) {
+            return null;
+        }
+        return ctx.cols.stream()
+                .map(this::visitSimpleColumnDef)
+                .collect(ImmutableList.toImmutableList());
+    }
+
+    @Override
+    public SimpleColumnDefinition visitSimpleColumnDef(SimpleColumnDefContext 
ctx) {
+        return new SimpleColumnDefinition(ctx.colName.getText().toLowerCase(),
+                ctx.STRING_LITERAL() != null ? ctx.STRING_LITERAL().getText() 
: null);
+    }
+
+    /**
+     * get originSql
+     *
+     * @param ctx context
+     * @return originSql
+     */
+    private String getOriginSql(ParserRuleContext ctx) {
+        int startIndex = ctx.start.getStartIndex();
+        int stopIndex = ctx.stop.getStopIndex();
+        org.antlr.v4.runtime.misc.Interval interval = new 
org.antlr.v4.runtime.misc.Interval(startIndex, stopIndex);
+        return ctx.start.getInputStream().getText(interval);
+    }
+
+    @Override
+    public MTMVRefreshTriggerInfo visitRefreshTrigger(RefreshTriggerContext 
ctx) {
+        if (ctx.MANUAL() != null) {
+            return new MTMVRefreshTriggerInfo(RefreshTrigger.MANUAL);
+        }
+        if (ctx.SCHEDULE() != null) {
+            return new MTMVRefreshTriggerInfo(RefreshTrigger.SCHEDULE, 
visitRefreshSchedule(ctx.refreshSchedule()));
+        }
+        return new MTMVRefreshTriggerInfo(RefreshTrigger.MANUAL);
+    }
+
+    @Override
+    public MTMVRefreshSchedule visitRefreshSchedule(RefreshScheduleContext 
ctx) {
+        int interval = Integer.parseInt(ctx.INTEGER_VALUE().getText());
+        String startTime = ctx.STARTS() == null ? null
+                : ctx.STRING_LITERAL().getText().substring(1, 
ctx.STRING_LITERAL().getText().length() - 1);
+        IntervalUnit unit = visitMvRefreshUnit(ctx.mvRefreshUnit());
+        return new MTMVRefreshSchedule(startTime, interval, unit);
+    }
+
+    @Override
+    public IntervalUnit visitMvRefreshUnit(MvRefreshUnitContext ctx) {
+        return IntervalUnit.valueOf(ctx.getText().toUpperCase());
+    }
+
+    @Override
+    public RefreshMethod visitRefreshMethod(RefreshMethodContext ctx) {
+        if (ctx == null) {
+            return RefreshMethod.COMPLETE;
+        }
+        return RefreshMethod.valueOf(ctx.getText().toUpperCase());
+    }
+
+    @Override
+    public BuildMode visitBuildMode(BuildModeContext ctx) {
+        if (ctx.DEFERRED() != null) {
+            return BuildMode.DEFERRED;
+        } else if (ctx.IMMEDIATE() != null) {
+            return BuildMode.IMMEDIATE;
+        }
+        return BuildMode.IMMEDIATE;
+    }
+
+    @Override
+    public RefreshMTMVCommand visitRefreshMTMV(RefreshMTMVContext ctx) {
+        List<String> nameParts = visitMultipartIdentifier(ctx.mvName);
+        return new RefreshMTMVCommand(new RefreshMTMVInfo(new 
TableNameInfo(nameParts)));
+    }
+
+    @Override
+    public DropMTMVCommand visitDropMTMV(DropMTMVContext ctx) {
+        List<String> nameParts = visitMultipartIdentifier(ctx.mvName);
+        return new DropMTMVCommand(new DropMTMVInfo(new 
TableNameInfo(nameParts), ctx.EXISTS() != null));
+    }
+
+    @Override
+    public AlterMTMVCommand visitAlterMTMV(AlterMTMVContext ctx) {
+        List<String> nameParts = visitMultipartIdentifier(ctx.mvName);
+        TableNameInfo mvName = new TableNameInfo(nameParts);
+        AlterMTMVInfo alterMTMVInfo = null;
+        if (ctx.RENAME() != null) {
+            alterMTMVInfo = new AlterMTMVRenameInfo(mvName, 
ctx.newName.getText());
+        } else if (ctx.REFRESH() != null) {
+            MTMVRefreshInfo refreshInfo = new MTMVRefreshInfo();
+            if (ctx.refreshMethod() != null) {
+                
refreshInfo.setRefreshMethod(visitRefreshMethod(ctx.refreshMethod()));
+            }
+            if (ctx.refreshTrigger() != null) {
+                
refreshInfo.setRefreshTriggerInfo(visitRefreshTrigger(ctx.refreshTrigger()));
+            }
+            alterMTMVInfo = new AlterMTMVRefreshInfo(mvName, refreshInfo);
+        } else if (ctx.SET() != null) {
+            alterMTMVInfo = new AlterMTMVPropertyInfo(mvName,
+                    
Maps.newHashMap(visitPropertyItemList(ctx.fileProperties)));
+        }
+        return new AlterMTMVCommand(alterMTMVInfo);
+    }
+
     @Override
     public LogicalPlan visitUpdate(UpdateContext ctx) {
         LogicalPlan query = LogicalPlanBuilderAssistant.withCheckPolicy(new 
UnboundRelation(
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
index c1ed61ce1ce..c2db676a1a7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
@@ -123,5 +123,9 @@ public enum PlanType {
     INSERT_INTO_TABLE_COMMAND,
     LOAD_COMMAND,
     SELECT_INTO_OUTFILE_COMMAND,
-    UPDATE_COMMAND
+    UPDATE_COMMAND,
+    CREATE_MTMV_COMMAND,
+    ALTER_MTMV_COMMAND,
+    REFRESH_MTMV_COMMAND,
+    DROP_MTMV_COMMAND
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterMTMVCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterMTMVCommand.java
new file mode 100644
index 00000000000..9aadf0f1cf0
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AlterMTMVCommand.java
@@ -0,0 +1,58 @@
+// 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.nereids.trees.plans.commands;
+
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVInfo;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.Objects;
+
+/**
+ * alter multi table materialized view
+ */
+public class AlterMTMVCommand extends Command implements ForwardWithSync {
+
+    public static final Logger LOG = 
LogManager.getLogger(AlterMTMVCommand.class);
+    private final AlterMTMVInfo alterMTMVInfo;
+
+    /**
+     * constructor
+     */
+    public AlterMTMVCommand(AlterMTMVInfo alterMTMVInfo) {
+        super(PlanType.ALTER_MTMV_COMMAND);
+        this.alterMTMVInfo = Objects.requireNonNull(alterMTMVInfo, "require 
AlterMTMVInfo object");
+    }
+
+    @Override
+    public void run(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        alterMTMVInfo.analyze(ctx);
+        alterMTMVInfo.run();
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitAlterMTMVCommand(this, context);
+    }
+
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMTMVCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMTMVCommand.java
new file mode 100644
index 00000000000..76a646fc819
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMTMVCommand.java
@@ -0,0 +1,59 @@
+// 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.nereids.trees.plans.commands;
+
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.commands.info.CreateMTMVInfo;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.Objects;
+
+/**
+ * create multi table materialized view
+ */
+public class CreateMTMVCommand extends Command implements ForwardWithSync {
+
+    public static final Logger LOG = 
LogManager.getLogger(CreateMTMVCommand.class);
+    private final CreateMTMVInfo createMTMVInfo;
+
+    /**
+     * constructor
+     */
+    public CreateMTMVCommand(CreateMTMVInfo createMTMVInfo) {
+        super(PlanType.CREATE_MTMV_COMMAND);
+        this.createMTMVInfo = Objects.requireNonNull(createMTMVInfo, "require 
CreateMTMVInfo object");
+    }
+
+    @Override
+    public void run(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        createMTMVInfo.analyze(ctx);
+        throw new AnalysisException("current not support.");
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitCreateMTMVCommand(this, context);
+    }
+
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropMTMVCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropMTMVCommand.java
new file mode 100644
index 00000000000..0a6494edeac
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropMTMVCommand.java
@@ -0,0 +1,50 @@
+// 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.nereids.trees.plans.commands;
+
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.commands.info.DropMTMVInfo;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
+
+import java.util.Objects;
+
+/**
+ * refresh mtmv
+ */
+public class DropMTMVCommand extends Command implements ForwardWithSync {
+    private final DropMTMVInfo dropMTMVInfo;
+
+    public DropMTMVCommand(DropMTMVInfo dropMTMVInfo) {
+        super(PlanType.DROP_MTMV_COMMAND);
+        this.dropMTMVInfo = Objects.requireNonNull(dropMTMVInfo, "require 
dropMTMVInfo object");
+    }
+
+    @Override
+    public void run(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        dropMTMVInfo.analyze(ctx);
+        throw new AnalysisException("current not support.");
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitDropMTMVCommand(this, context);
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RefreshMTMVCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RefreshMTMVCommand.java
new file mode 100644
index 00000000000..352801f5d83
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/RefreshMTMVCommand.java
@@ -0,0 +1,50 @@
+// 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.nereids.trees.plans.commands;
+
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.commands.info.RefreshMTMVInfo;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
+
+import java.util.Objects;
+
+/**
+ * refresh mtmv
+ */
+public class RefreshMTMVCommand extends Command implements ForwardWithSync {
+    private final RefreshMTMVInfo refreshMTMVInfo;
+
+    public RefreshMTMVCommand(RefreshMTMVInfo refreshMTMVInfo) {
+        super(PlanType.REFRESH_MTMV_COMMAND);
+        this.refreshMTMVInfo = Objects.requireNonNull(refreshMTMVInfo, 
"require refreshMTMVInfo object");
+    }
+
+    @Override
+    public void run(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        refreshMTMVInfo.analyze(ctx);
+        throw new AnalysisException("current not support.");
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitRefreshMTMVCommand(this, context);
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVInfo.java
new file mode 100644
index 00000000000..542ebca6ac0
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVInfo.java
@@ -0,0 +1,62 @@
+// 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.nereids.trees.plans.commands.info;
+
+import org.apache.doris.catalog.Env;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.UserException;
+import org.apache.doris.mysql.privilege.PrivPredicate;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.qe.ConnectContext;
+
+import java.util.Objects;
+
+/**
+ * MTMV info in alter MTMV.
+ */
+public abstract class AlterMTMVInfo {
+    protected final TableNameInfo mvName;
+
+    /**
+     * constructor for alter MTMV
+     */
+    public AlterMTMVInfo(TableNameInfo mvName) {
+        this.mvName = Objects.requireNonNull(mvName, "require mvName object");
+    }
+
+    /**
+     * analyze alter table info
+     */
+    public void analyze(ConnectContext ctx) throws AnalysisException {
+        mvName.analyze(ctx);
+        if 
(!Env.getCurrentEnv().getAccessManager().checkTblPriv(ConnectContext.get(), 
mvName.getDb(),
+                mvName.getTbl(), PrivPredicate.ALTER)) {
+            String message = 
ErrorCode.ERR_TABLEACCESS_DENIED_ERROR.formatErrorMsg("ALTER",
+                    ConnectContext.get().getQualifiedUser(), 
ConnectContext.get().getRemoteIP(),
+                    mvName.getDb() + ": " + mvName.getTbl());
+            throw new AnalysisException(message);
+        }
+    }
+
+    public abstract void run() throws UserException;
+
+    public TableNameInfo getMvName() {
+        return mvName;
+    }
+
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVPropertyInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVPropertyInfo.java
new file mode 100644
index 00000000000..a7ddfb8f83c
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVPropertyInfo.java
@@ -0,0 +1,53 @@
+// 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.nereids.trees.plans.commands.info;
+
+import org.apache.doris.common.UserException;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.qe.ConnectContext;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * rename
+ */
+public class AlterMTMVPropertyInfo extends AlterMTMVInfo {
+    private final Map<String, String> properties;
+
+    /**
+     * constructor for alter MTMV
+     */
+    public AlterMTMVPropertyInfo(TableNameInfo mvName, Map<String, String> 
properties) {
+        super(mvName);
+        this.properties = Objects.requireNonNull(properties, "require 
properties object");
+    }
+
+    public void analyze(ConnectContext ctx) throws AnalysisException {
+        super.analyze(ctx);
+    }
+
+    @Override
+    public void run() throws UserException {
+        throw new 
org.apache.doris.nereids.exceptions.AnalysisException("current not support.");
+    }
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVRefreshInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVRefreshInfo.java
new file mode 100644
index 00000000000..b54bba1ece3
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVRefreshInfo.java
@@ -0,0 +1,54 @@
+// 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.nereids.trees.plans.commands.info;
+
+import org.apache.doris.common.UserException;
+import org.apache.doris.mtmv.MTMVRefreshInfo;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.qe.ConnectContext;
+
+import java.util.Objects;
+
+/**
+ * rename
+ */
+public class AlterMTMVRefreshInfo extends AlterMTMVInfo {
+    private final MTMVRefreshInfo refreshInfo;
+
+    /**
+     * constructor for alter MTMV
+     */
+    public AlterMTMVRefreshInfo(TableNameInfo mvName, MTMVRefreshInfo 
refreshInfo) {
+        super(mvName);
+        this.refreshInfo = Objects.requireNonNull(refreshInfo, "require 
refreshInfo object");
+    }
+
+    public void analyze(ConnectContext ctx) throws AnalysisException {
+        super.analyze(ctx);
+        refreshInfo.validate();
+    }
+
+    @Override
+    public void run() throws UserException {
+        throw new AnalysisException("current not support.");
+    }
+
+    public MTMVRefreshInfo getRefreshInfo() {
+        return refreshInfo;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVRenameInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVRenameInfo.java
new file mode 100644
index 00000000000..c9e09e29187
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/AlterMTMVRenameInfo.java
@@ -0,0 +1,59 @@
+// 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.nereids.trees.plans.commands.info;
+
+import org.apache.doris.common.DdlException;
+import org.apache.doris.common.FeNameFormat;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.qe.ConnectContext;
+
+import java.util.Objects;
+
+/**
+ * rename
+ */
+public class AlterMTMVRenameInfo extends AlterMTMVInfo {
+    private final String newName;
+
+    /**
+     * constructor for alter MTMV
+     */
+    public AlterMTMVRenameInfo(TableNameInfo mvName, String newName) {
+        super(mvName);
+        this.newName = Objects.requireNonNull(newName, "require newName 
object");
+    }
+
+    /**
+     * analyze
+     * @param ctx ctx
+     * @throws AnalysisException AnalysisException
+     */
+    public void analyze(ConnectContext ctx) throws AnalysisException {
+        super.analyze(ctx);
+        try {
+            FeNameFormat.checkTableName(newName);
+        } catch (org.apache.doris.common.AnalysisException e) {
+            throw new AnalysisException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public void run() throws DdlException {
+        throw new AnalysisException("current not support.");
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateMTMVInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateMTMVInfo.java
new file mode 100644
index 00000000000..1b255adc528
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateMTMVInfo.java
@@ -0,0 +1,82 @@
+// 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.nereids.trees.plans.commands.info;
+
+import org.apache.doris.mtmv.EnvInfo;
+import org.apache.doris.mtmv.MTMVRefreshInfo;
+import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
+import org.apache.doris.nereids.util.Utils;
+import org.apache.doris.qe.ConnectContext;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * MTMV info in creating MTMV.
+ */
+public class CreateMTMVInfo {
+    private final boolean ifNotExists;
+    private final TableNameInfo mvName;
+    private List<String> keys;
+    private final String comment;
+    private final DistributionDescriptor distribution;
+    private Map<String, String> properties;
+    private Map<String, String> mvProperties = Maps.newHashMap();
+
+    private final LogicalPlan logicalQuery;
+    private final String querySql;
+    private final MTMVRefreshInfo refreshInfo;
+    private final List<ColumnDefinition> columns = Lists.newArrayList();
+    private final List<SimpleColumnDefinition> simpleColumnDefinitions;
+    private final EnvInfo envInfo;
+
+    /**
+     * constructor for create MTMV
+     */
+    public CreateMTMVInfo(boolean ifNotExists, TableNameInfo mvName,
+            List<String> keys, String comment,
+            DistributionDescriptor distribution, Map<String, String> 
properties,
+            LogicalPlan logicalQuery, String querySql,
+            MTMVRefreshInfo refreshInfo,
+            List<SimpleColumnDefinition> simpleColumnDefinitions) {
+        this.ifNotExists = Objects.requireNonNull(ifNotExists, "require 
ifNotExists object");
+        this.mvName = Objects.requireNonNull(mvName, "require mvName object");
+        this.keys = Utils.copyRequiredList(keys);
+        this.comment = comment;
+        this.distribution = Objects.requireNonNull(distribution, "require 
distribution object");
+        this.properties = Objects.requireNonNull(properties, "require 
properties object");
+        this.logicalQuery = Objects.requireNonNull(logicalQuery, "require 
logicalQuery object");
+        this.querySql = Objects.requireNonNull(querySql, "require querySql 
object");
+        this.refreshInfo = Objects.requireNonNull(refreshInfo, "require 
refreshInfo object");
+        this.simpleColumnDefinitions = Objects
+                .requireNonNull(simpleColumnDefinitions, "require 
simpleColumnDefinitions object");
+        this.envInfo = new EnvInfo(ConnectContext.get().getDefaultCatalog(), 
ConnectContext.get().getDatabase());
+    }
+
+    /**
+     * analyze create table info
+     */
+    public void analyze(ConnectContext ctx) {
+
+    }
+
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropMTMVInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropMTMVInfo.java
new file mode 100644
index 00000000000..958d6315c39
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropMTMVInfo.java
@@ -0,0 +1,52 @@
+// 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.nereids.trees.plans.commands.info;
+
+import org.apache.doris.qe.ConnectContext;
+
+import java.util.Objects;
+
+/**
+ * drop mtmv info
+ */
+public class DropMTMVInfo {
+    private final TableNameInfo mvName;
+    private final boolean ifExists;
+
+    public DropMTMVInfo(TableNameInfo mvName, boolean ifExists) {
+        this.mvName = Objects.requireNonNull(mvName, "require mvName object");
+        this.ifExists = Objects.requireNonNull(ifExists, "require ifExists 
object");
+    }
+
+    /**
+     * analyze drop info
+     *
+     * @param ctx ConnectContext
+     */
+    public void analyze(ConnectContext ctx) {
+    }
+
+    /**
+     * getMvName
+     *
+     * @return TableNameInfo
+     */
+    public TableNameInfo getMvName() {
+        return mvName;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RefreshMTMVInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RefreshMTMVInfo.java
new file mode 100644
index 00000000000..8439ed2ad0a
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RefreshMTMVInfo.java
@@ -0,0 +1,48 @@
+// 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.nereids.trees.plans.commands.info;
+
+import org.apache.doris.qe.ConnectContext;
+
+import java.util.Objects;
+
+/**
+ * refresh mtmv info
+ */
+public class RefreshMTMVInfo {
+    private final TableNameInfo mvName;
+
+    public RefreshMTMVInfo(TableNameInfo mvName) {
+        this.mvName = Objects.requireNonNull(mvName, "require mvName object");
+    }
+
+    /**
+     * analyze refresh info
+     * @param ctx ConnectContext
+     */
+    public void analyze(ConnectContext ctx) {
+    }
+
+    /**
+     * getMvName
+     * @return TableNameInfo
+     */
+    public TableNameInfo getMvName() {
+        return mvName;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/SimpleColumnDefinition.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/SimpleColumnDefinition.java
new file mode 100644
index 00000000000..51080bf45d2
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/SimpleColumnDefinition.java
@@ -0,0 +1,42 @@
+// 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.nereids.trees.plans.commands.info;
+
+/**
+ * column def for mv
+ */
+public class SimpleColumnDefinition {
+    private final String name;
+    private final String comment;
+
+    /**
+     * constructor
+     */
+    public SimpleColumnDefinition(String name, String comment) {
+        this.name = name;
+        this.comment = comment;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getComment() {
+        return comment;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/TableNameInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/TableNameInfo.java
new file mode 100644
index 00000000000..d565b4f318b
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/TableNameInfo.java
@@ -0,0 +1,168 @@
+// 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.
+// This file is copied from
+// 
https://github.com/apache/impala/blob/branch-2.9.0/fe/src/main/java/org/apache/impala/TableName.java
+// and modified by Doris
+
+package org.apache.doris.nereids.trees.plans.commands.info;
+
+import org.apache.doris.analysis.TableName;
+import org.apache.doris.catalog.Env;
+import org.apache.doris.cluster.ClusterNamespace;
+import org.apache.doris.common.io.Text;
+import org.apache.doris.common.io.Writable;
+import org.apache.doris.datasource.InternalCatalog;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.persist.gson.GsonUtils;
+import org.apache.doris.qe.ConnectContext;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import com.google.gson.annotations.SerializedName;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * table name info
+ */
+public class TableNameInfo implements Writable {
+    @SerializedName(value = "c")
+    private String ctl;
+    @SerializedName(value = "t")
+    private String tbl;
+    @SerializedName(value = "d")
+    private String db;
+
+    public TableNameInfo() {
+
+    }
+
+    /**
+     * TableNameInfo
+     * @param parts like [ctl1,db1,tbl1] or [db1,tbl1] or [tbl1]
+     */
+    public TableNameInfo(List<String> parts) {
+        Objects.requireNonNull(parts, "require parts object");
+        int size = parts.size();
+        Preconditions.checkArgument(size > 0, "table name can't be empty");
+        tbl = parts.get(size - 1);
+        if (Env.isStoredTableNamesLowerCase() && !Strings.isNullOrEmpty(tbl)) {
+            tbl = tbl.toLowerCase();
+        }
+        if (size >= 2) {
+            db = parts.get(size - 2);
+        }
+        if (size >= 3) {
+            ctl = parts.get(size - 3);
+        }
+    }
+
+    /**
+     * TableNameInfo
+     * @param db dbName
+     * @param tbl tblName
+     */
+    public TableNameInfo(String db, String tbl) {
+        Objects.requireNonNull(tbl, "require tbl object");
+        Objects.requireNonNull(db, "require db object");
+        this.ctl = InternalCatalog.INTERNAL_CATALOG_NAME;
+        this.tbl = tbl;
+        if (Env.isStoredTableNamesLowerCase()) {
+            this.tbl = tbl.toLowerCase();
+        }
+        this.db = db;
+    }
+
+    /**
+     * analyze tableNameInfo
+     * @param ctx ctx
+     */
+    public void analyze(ConnectContext ctx) {
+        if (Strings.isNullOrEmpty(ctl)) {
+            ctl = ctx.getDefaultCatalog();
+            if (Strings.isNullOrEmpty(ctl)) {
+                ctl = InternalCatalog.INTERNAL_CATALOG_NAME;
+            }
+        }
+        if (Strings.isNullOrEmpty(db)) {
+            db = ClusterNamespace.getFullName(ctx.getClusterName(), 
ctx.getDatabase());
+            if (Strings.isNullOrEmpty(db)) {
+                throw new AnalysisException("No database selected");
+            }
+        } else {
+            db = ClusterNamespace.getFullName(ctx.getClusterName(), db);
+        }
+
+        if (Strings.isNullOrEmpty(tbl)) {
+            throw new AnalysisException("Table name is null");
+        }
+    }
+
+    /**
+     * get catalog name
+     * @return ctlName
+     */
+    public String getCtl() {
+        return ctl;
+    }
+
+    /**
+     * get db name
+     * @return dbName
+     */
+    public String getDb() {
+        return db;
+    }
+
+    /**
+     * get table name
+     * @return tableName
+     */
+    public String getTbl() {
+        return tbl;
+    }
+
+    /**
+     * transferToTableName
+     * @return TableName
+     */
+    public TableName transferToTableName() {
+        return new TableName(ctl, db, tbl);
+    }
+
+    @Override
+    public void write(DataOutput out) throws IOException {
+        String json = GsonUtils.GSON.toJson(this);
+        Text.writeString(out, json);
+    }
+
+    /**
+     * read from json
+     * @param in DataInput
+     * @throws IOException IOException
+     */
+    public void readFields(DataInput in) throws IOException {
+        TableNameInfo fromJson = GsonUtils.GSON.fromJson(Text.readString(in), 
TableNameInfo.class);
+        ctl = fromJson.ctl;
+        db = fromJson.db;
+        tbl = fromJson.tbl;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
index c055da5735b..4e42b6f6593 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
@@ -17,14 +17,18 @@
 
 package org.apache.doris.nereids.trees.plans.visitor;
 
+import org.apache.doris.nereids.trees.plans.commands.AlterMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.Command;
+import org.apache.doris.nereids.trees.plans.commands.CreateMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.CreatePolicyCommand;
 import org.apache.doris.nereids.trees.plans.commands.CreateTableCommand;
 import org.apache.doris.nereids.trees.plans.commands.DeleteCommand;
+import org.apache.doris.nereids.trees.plans.commands.DropMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.ExplainCommand;
 import org.apache.doris.nereids.trees.plans.commands.ExportCommand;
 import org.apache.doris.nereids.trees.plans.commands.InsertIntoTableCommand;
 import org.apache.doris.nereids.trees.plans.commands.LoadCommand;
+import org.apache.doris.nereids.trees.plans.commands.RefreshMTMVCommand;
 import org.apache.doris.nereids.trees.plans.commands.UpdateCommand;
 
 /** CommandVisitor. */
@@ -64,4 +68,20 @@ public interface CommandVisitor<R, C> {
     default R visitCreateTableCommand(CreateTableCommand createTableCommand, C 
context) {
         return visitCommand(createTableCommand, context);
     }
+
+    default R visitCreateMTMVCommand(CreateMTMVCommand createMTMVCommand, C 
context) {
+        return visitCommand(createMTMVCommand, context);
+    }
+
+    default R visitAlterMTMVCommand(AlterMTMVCommand alterMTMVCommand, C 
context) {
+        return visitCommand(alterMTMVCommand, context);
+    }
+
+    default R visitRefreshMTMVCommand(RefreshMTMVCommand refreshMTMVCommand, C 
context) {
+        return visitCommand(refreshMTMVCommand, context);
+    }
+
+    default R visitDropMTMVCommand(DropMTMVCommand dropMTMVCommand, C context) 
{
+        return visitCommand(dropMTMVCommand, context);
+    }
 }


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

Reply via email to