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

yangzhg 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 ff8a4ec2f2 [WIP][feature] support `create`,`alter`,`refresh`,`drop` 
stmt syntax for multi table materialized view (#11218)
ff8a4ec2f2 is described below

commit ff8a4ec2f2c734b2dd7b267cb9cee20b016b8470
Author: Zhengguo Yang <[email protected]>
AuthorDate: Tue Aug 2 16:03:36 2022 +0800

    [WIP][feature] support `create`,`alter`,`refresh`,`drop` stmt syntax for 
multi table materialized view (#11218)
    
    * [WIP][feature] support `create`,`alter`,`refresh`,`drop` stmt for multi
    table materialized view
---
 fe/fe-core/src/main/cup/sql_parser.cup             | 128 ++++++++++++++++++++-
 .../main/java/org/apache/doris/alter/Alter.java    |  19 +++
 .../doris/analysis/AlterMaterializedViewStmt.java  |  55 +++++++++
 .../CreateMultiTableMaterializedViewStmt.java      |  72 ++++++++++++
 .../doris/analysis/DropMaterializedViewStmt.java   |  27 ++++-
 .../org/apache/doris/analysis/MVRefreshInfo.java   |  75 ++++++++++++
 .../analysis/MVRefreshIntervalTriggerInfo.java     |  54 +++++++++
 .../doris/analysis/MVRefreshTriggerInfo.java       |  63 ++++++++++
 .../analysis/RefreshMaterializedViewStmt.java      |  76 ++++++++++++
 .../main/java/org/apache/doris/catalog/Env.java    |  15 +++
 .../main/java/org/apache/doris/qe/DdlExecutor.java |  11 ++
 fe/fe-core/src/main/jflex/sql_scanner.flex         |  57 +++++----
 12 files changed, 619 insertions(+), 33 deletions(-)

diff --git a/fe/fe-core/src/main/cup/sql_parser.cup 
b/fe/fe-core/src/main/cup/sql_parser.cup
index 131a337e7a..ad3b77fcc1 100644
--- a/fe/fe-core/src/main/cup/sql_parser.cup
+++ b/fe/fe-core/src/main/cup/sql_parser.cup
@@ -240,25 +240,25 @@ parser code {:
 
 // Total keywords of doris
 terminal String KW_ADD, KW_ADMIN, KW_AFTER, KW_AGGREGATE, KW_ALIAS, KW_ALL, 
KW_ALTER, KW_AND, KW_ANTI, KW_APPEND, KW_AS, KW_ASC, KW_AUTHORS, KW_ARRAY,
-    KW_BACKEND, KW_BACKUP, KW_BETWEEN, KW_BEGIN, KW_BIGINT, KW_BINLOG, 
KW_BITMAP, KW_BITMAP_UNION, KW_QUANTILE_STATE, KW_QUANTILE_UNION, KW_BLOB, 
KW_BOOLEAN, KW_BROKER, KW_BACKENDS, KW_BY, KW_BUILTIN,
+    KW_BACKEND, KW_BACKUP, KW_BETWEEN, KW_BEGIN, KW_BIGINT, KW_BINLOG, 
KW_BITMAP, KW_BITMAP_UNION, KW_QUANTILE_STATE, KW_QUANTILE_UNION, KW_BLOB, 
KW_BOOLEAN, KW_BROKER, KW_BACKENDS, KW_BY, KW_BUILD, KW_BUILTIN,
     KW_CANCEL, KW_CASE, KW_CAST, KW_CHAIN, KW_CHAR, KW_CHARSET, KW_CHECK, 
KW_CLUSTER, KW_CLUSTERS, KW_CLEAN, KW_CURRENT_TIMESTAMP,
-    KW_COLLATE, KW_COLLATION, KW_COLUMN, KW_COLUMNS, KW_COMMENT, KW_COMMIT, 
KW_COMMITTED, KW_COMPACT,
+    KW_COLLATE, KW_COLLATION, KW_COLUMN, KW_COLUMNS, KW_COMMENT, KW_COMMIT, 
KW_COMMITTED, KW_COMPACT, KW_COMPLETE,
     KW_CONFIG, KW_CONNECTION, KW_CONNECTION_ID, KW_CONSISTENT, KW_CONVERT, 
KW_COUNT, KW_CREATE, KW_CREATION, KW_CROSS, KW_CUBE, KW_CURRENT, 
KW_CURRENT_USER,
-    KW_DATA, KW_DATABASE, KW_DATABASES, KW_DATE, KW_DATETIME, KW_DATEV2, 
KW_DATETIMEV2, KW_DAY, KW_DECIMAL, KW_DECIMALV3, KW_DECOMMISSION, KW_DEFAULT, 
KW_DESC, KW_DESCRIBE,
+    KW_DATA, KW_DATABASE, KW_DATABASES, KW_DATE, KW_DATETIME, KW_DATEV2, 
KW_DATETIMEV2, KW_DAY, KW_DECIMAL, KW_DECIMALV3, KW_DECOMMISSION, KW_DEFAULT, 
KW_DEFERRED, KW_DEMAND, KW_DESC, KW_DESCRIBE,
     KW_DELETE, KW_UPDATE, KW_DIAGNOSE, KW_DISK, KW_DISTINCT, KW_DISTINCTPC, 
KW_DISTINCTPCSA, KW_DISTRIBUTED, KW_DISTRIBUTION, KW_DYNAMIC, KW_BUCKETS, 
KW_DIV, KW_DOUBLE, KW_DROP, KW_DROPP, KW_DUPLICATE,
     KW_ELSE, KW_ENABLE, KW_ENCRYPTKEY, KW_ENCRYPTKEYS, KW_END, KW_ENGINE, 
KW_ENGINES, KW_ENTER, KW_ERRORS, KW_EVENTS, KW_EXCEPT, KW_EXCLUDE,
     KW_EXISTS, KW_EXPORT, KW_EXTENDED, KW_EXTERNAL, KW_EXTRACT,
-    KW_FALSE, KW_FEATURE, KW_FOLLOWER, KW_FOLLOWING, KW_FREE, KW_FROM, 
KW_FIELDS, KW_FILE, KW_FILTER, KW_FIRST, KW_FLOAT, KW_FOR, KW_FORCE, KW_FORMAT, 
KW_FRONTEND, KW_FRONTENDS, KW_FULL, KW_FUNCTION, KW_FUNCTIONS,
+    KW_FAST, KW_FALSE, KW_FEATURE, KW_FOLLOWER, KW_FOLLOWING, KW_FREE, 
KW_FROM, KW_FIELDS, KW_FILE, KW_FILTER, KW_FIRST, KW_FLOAT, KW_FOR, KW_FORCE, 
KW_FORMAT, KW_FRONTEND, KW_FRONTENDS, KW_FULL, KW_FUNCTION, KW_FUNCTIONS,
     KW_GLOBAL, KW_GRANT, KW_GRANTS, KW_GRAPH, KW_GROUP, KW_GROUPING,
     KW_HASH, KW_HAVING, KW_HDFS, KW_HELP,KW_HLL, KW_HLL_UNION, KW_HOUR, KW_HUB,
-    KW_IDENTIFIED, KW_IF, KW_IN, KW_INDEX, KW_INDEXES, KW_INFILE, KW_INSTALL,
+    KW_IDENTIFIED, KW_IF, KW_IMMEDIATE, KW_IN, KW_INDEX, KW_INDEXES, 
KW_INFILE, KW_INSTALL,
     KW_INNER, KW_INSERT, KW_INT, KW_INTERMEDIATE, KW_INTERSECT, KW_INTERVAL, 
KW_INTO, KW_IS, KW_ISNULL, KW_ISOLATION,
     KW_JOB, KW_JOIN,
     KW_KEY, KW_KEYS, KW_KILL,
     KW_LABEL, KW_LARGEINT, KW_LAST, KW_LEFT, KW_LESS, KW_LEVEL, KW_LIKE, 
KW_LIMIT, KW_LINK, KW_LIST, KW_LOAD,
     KW_LOCAL, KW_LOCATION, KW_LOCK, KW_LOW_PRIORITY, KW_LATERAL,
     KW_MAP, KW_MATERIALIZED, KW_MAX, KW_MAX_VALUE, KW_MERGE, KW_MIN, 
KW_MINUTE, KW_MINUS, KW_MIGRATE, KW_MIGRATIONS, KW_MODIFY, KW_MONTH,
-    KW_NAME, KW_NAMES, KW_NEGATIVE, KW_NO, KW_NOT, KW_NULL, KW_NULLS,
+    KW_NAME, KW_NAMES, KW_NEGATIVE, KW_NEVER, KW_NEXT, KW_NO, KW_NOT, KW_NULL, 
KW_NULLS,
     KW_OBSERVER, KW_OFFSET, KW_ON, KW_ONLY, KW_OPEN, KW_OR, KW_ORDER, 
KW_OUTER, KW_OUTFILE, KW_OVER,
     KW_PARAMETER, KW_PARTITION, KW_PARTITIONS, KW_PASSWORD, 
KW_LDAP_ADMIN_PASSWORD, KW_PATH, KW_PAUSE, KW_PIPE, KW_PRECEDING,
     KW_PLUGIN, KW_PLUGINS, KW_POLICY,
@@ -537,6 +537,12 @@ nonterminal StorageBackend storage_backend;
 nonterminal ArrayList<LockTable> opt_lock_tables_list;
 nonterminal LockTable lock_table;
 
+// mv
+nonterminal MVRefreshInfo.BuildMode build_mv;
+nonterminal MVRefreshInfo.RefreshMethod opt_refresh_method;
+nonterminal MVRefreshTriggerInfo opt_refresh_trigger;
+nonterminal MVRefreshInfo opt_mv_refersh_info;
+
 precedence nonassoc COMMA;
 precedence nonassoc STRING_LITERAL;
 precedence nonassoc KW_COLUMNS;
@@ -794,6 +800,14 @@ refresh_stmt ::=
     {:
         RESULT = new RefreshDbStmt(db);
     :}
+    | KW_REFRESH KW_MATERIALIZED KW_VIEW table_name:mv
+    {:
+        RESULT = new RefreshMaterializedViewStmt(mv, 
MVRefreshInfo.RefreshMethod.COMPLETE);
+    :}
+    | KW_REFRESH KW_MATERIALIZED KW_VIEW table_name:mv KW_COMPLETE
+    {:
+        RESULT = new RefreshMaterializedViewStmt(mv, 
MVRefreshInfo.RefreshMethod.COMPLETE);
+    :}
     ;
 
 clean_stmt ::=
@@ -923,6 +937,10 @@ alter_stmt ::=
     {:
         RESULT = new AlterPolicyStmt(policyName, properties);
     :}
+    | KW_ALTER KW_MATERIALIZED KW_VIEW table_name:mv 
opt_mv_refersh_info:refreshInfo
+    {:
+        RESULT = new AlterMaterializedViewStmt(mv, refreshInfo);
+    :}
     ;
 
 opt_datasource_properties ::=
@@ -1246,6 +1264,75 @@ opt_intermediate_type ::=
     :}
     ;
 
+build_mv ::=
+    KW_BUILD KW_IMMEDIATE
+    {:
+        RESULT = MVRefreshInfo.BuildMode.IMMEDIATE;
+    :}
+    | KW_BUILD KW_DEFERRED
+    {:
+        RESULT = MVRefreshInfo.BuildMode.DEFERRED;
+    :}
+    ;
+
+opt_refresh_method ::=
+    {:
+        RESULT = null;
+    :}
+    | KW_FAST
+    {:
+        RESULT = MVRefreshInfo.RefreshMethod.FAST;
+    :}
+    | KW_COMPLETE
+    {:
+        RESULT = MVRefreshInfo.RefreshMethod.COMPLETE;
+    :}
+    | KW_FORCE
+    {:
+        RESULT = MVRefreshInfo.RefreshMethod.FORCE;
+    :}
+    ;
+
+opt_refresh_trigger ::=
+    {:
+        RESULT = new MVRefreshTriggerInfo(MVRefreshInfo.RefreshTrigger.DEMAND);
+    :}
+    | KW_ON KW_DEMAND
+    {:
+        RESULT = new MVRefreshTriggerInfo(MVRefreshInfo.RefreshTrigger.DEMAND);
+    :}
+    | KW_ON KW_COMMIT
+    {:
+        RESULT = new MVRefreshTriggerInfo(MVRefreshInfo.RefreshTrigger.COMMIT);
+    :}
+    | KW_START KW_WITH ident:start_time
+    {:
+        RESULT = new MVRefreshTriggerInfo(new 
MVRefreshIntervalTriggerInfo(start_time, -1, null));
+    :}
+    | KW_START KW_WITH STRING_LITERAL:start_time KW_NEXT 
INTEGER_LITERAL:interval time_unit:unit
+    {:
+        RESULT = new MVRefreshTriggerInfo(new 
MVRefreshIntervalTriggerInfo(start_time, interval, unit));
+    :}
+    | KW_NEXT INTEGER_LITERAL:interval time_unit:unit
+    {:
+        RESULT = new MVRefreshTriggerInfo(new 
MVRefreshIntervalTriggerInfo(null, interval, unit));
+    :}
+    ;
+
+opt_mv_refersh_info ::=
+    {:
+        RESULT = null;
+    :}
+    | KW_REFRESH opt_refresh_method:refreshMethod 
opt_refresh_trigger:refreshTrigger
+    {:
+        RESULT = new MVRefreshInfo(refreshMethod, refreshTrigger);
+    :}
+    | KW_NEVER KW_REFRESH
+    {:
+        RESULT = new MVRefreshInfo(false);
+    :}
+    ;
+
 // Create Statement
 create_stmt ::=
     /* Database */
@@ -1368,6 +1455,15 @@ create_stmt ::=
     {:
         RESULT = new CreateMaterializedViewStmt(mvName, selectStmt, 
properties);
     :}
+    | KW_CREATE KW_MATERIALIZED KW_VIEW ident:mvName build_mv:buildMethod
+         opt_mv_refersh_info:refreshInfo
+         opt_partition:partition
+         opt_distribution:distribution
+         opt_properties:tblProperties
+         KW_AS query_stmt:query
+    {:
+        RESULT = new CreateMultiTableMaterializedViewStmt(mvName, buildMethod, 
refreshInfo, partition, distribution, tblProperties, query);
+    :}
     | KW_CREATE KW_INDEX opt_if_not_exists:ifNotExists ident:indexName KW_ON 
table_name:tableName LPAREN ident_list:cols RPAREN opt_index_type:indexType 
opt_comment:comment
     {:
         RESULT = new AlterTableStmt(tableName, Lists.newArrayList(new 
CreateIndexClause(tableName, new IndexDef(indexName, ifNotExists, cols, 
indexType, comment), false)));
@@ -2101,6 +2197,10 @@ drop_stmt ::=
     {:
         RESULT = new AlterTableStmt(tableName, Lists.newArrayList(new 
DropIndexClause(indexName, ifExists, tableName, false)));
     :}
+    | KW_DROP KW_MATERIALIZED KW_VIEW opt_if_exists:ifExists table_name:mvName
+    {:
+        RESULT = new DropMaterializedViewStmt(ifExists, mvName);
+    :}
     | KW_DROP KW_MATERIALIZED KW_VIEW opt_if_exists:ifExists ident:mvName 
KW_ON table_name:tableName
     {:
         RESULT = new DropMaterializedViewStmt(ifExists, mvName, tableName);
@@ -5643,6 +5743,8 @@ keyword ::=
     {: RESULT = id; :}
     | KW_BUILTIN:id
     {: RESULT = id; :}
+    | KW_BUILD:id
+    {: RESULT = id; :}
     | KW_CHAIN:id
     {: RESULT = id; :}
     | KW_CHAR:id
@@ -5657,6 +5759,8 @@ keyword ::=
     {: RESULT = id; :}
     | KW_COMMITTED:id
     {: RESULT = id; :}
+    | KW_COMPLETE:id
+    {: RESULT = id; :}
     | KW_CONSISTENT:id
     {: RESULT = id; :}
     | KW_COLLATION:id
@@ -5687,6 +5791,10 @@ keyword ::=
     {: RESULT = id; :}
     | KW_DECIMAL:id
     {: RESULT = id; :}
+    | KW_DEFERRED:id
+    {: RESULT = id; :}
+    | KW_DEMAND:id
+    {: RESULT = id; :}
     | KW_DECIMALV3:id
     {: RESULT = id; :}
     | KW_DIAGNOSE:id
@@ -5697,6 +5805,8 @@ keyword ::=
     {: RESULT = id; :}
     | KW_BUCKETS:id
     {: RESULT = id; :}
+    | KW_FAST:id
+    {: RESULT = id; :}
     | KW_FILE:id
     {: RESULT = id; :}
     | KW_FIELDS:id
@@ -5709,6 +5819,8 @@ keyword ::=
     {: RESULT = id; :}
     | KW_HLL_UNION:id
     {: RESULT = id; :}
+    | KW_IMMEDIATE:id
+    {: RESULT = id; :}
     | KW_PATH:id
     {: RESULT = id; :}
     | KW_PROFILE:id
@@ -5781,6 +5893,10 @@ keyword ::=
     {: RESULT = id; :}
     | KW_NEGATIVE:id
     {: RESULT = id; :}
+    | KW_NEVER:id
+    {: RESULT = id; :}
+    | KW_NEXT:id
+    {: RESULT = id; :}
     | KW_NO:id
     {: RESULT = id; :}
     | KW_NULLS:id
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java 
b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java
index da8987cf36..6ff0d8fb25 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java
@@ -19,11 +19,13 @@ package org.apache.doris.alter;
 
 import org.apache.doris.analysis.AddPartitionClause;
 import org.apache.doris.analysis.AlterClause;
+import org.apache.doris.analysis.AlterMaterializedViewStmt;
 import org.apache.doris.analysis.AlterSystemStmt;
 import org.apache.doris.analysis.AlterTableStmt;
 import org.apache.doris.analysis.AlterViewStmt;
 import org.apache.doris.analysis.ColumnRenameClause;
 import org.apache.doris.analysis.CreateMaterializedViewStmt;
+import org.apache.doris.analysis.CreateMultiTableMaterializedViewStmt;
 import org.apache.doris.analysis.DropMaterializedViewStmt;
 import org.apache.doris.analysis.DropPartitionClause;
 import org.apache.doris.analysis.ModifyColumnCommentClause;
@@ -33,6 +35,7 @@ import org.apache.doris.analysis.ModifyPartitionClause;
 import org.apache.doris.analysis.ModifyTableCommentClause;
 import org.apache.doris.analysis.ModifyTablePropertiesClause;
 import org.apache.doris.analysis.PartitionRenameClause;
+import org.apache.doris.analysis.RefreshMaterializedViewStmt;
 import org.apache.doris.analysis.ReplacePartitionClause;
 import org.apache.doris.analysis.ReplaceTableClause;
 import org.apache.doris.analysis.RollupRenameClause;
@@ -116,7 +119,15 @@ public class Alter {
         ((MaterializedViewHandler) 
materializedViewHandler).processCreateMaterializedView(stmt, db, olapTable);
     }
 
+    public void 
processCreateMultiTableMaterializedView(CreateMultiTableMaterializedViewStmt 
stmt)
+            throws AnalysisException {
+        throw new AnalysisException("Create multi table materialized view is 
unsupported : " + stmt.toSql());
+    }
+
     public void processDropMaterializedView(DropMaterializedViewStmt stmt) 
throws DdlException, MetaNotFoundException {
+        if (stmt.getTableName() == null) {
+            throw new DdlException("Drop materialized view without table name 
is unsupported : " + stmt.toSql());
+        }
         // check db
         String dbName = stmt.getTableName().getDb();
         Database db = 
Env.getCurrentInternalCatalog().getDbOrDdlException(dbName);
@@ -127,6 +138,10 @@ public class Alter {
         ((MaterializedViewHandler) 
materializedViewHandler).processDropMaterializedView(stmt, db, olapTable);
     }
 
+    public void processRefreshMaterializedView(RefreshMaterializedViewStmt 
stmt) throws DdlException {
+        throw new DdlException("Refresh materialized view is not implemented: 
" + stmt.toSql());
+    }
+
     private boolean processAlterOlapTable(AlterTableStmt stmt, OlapTable 
olapTable, List<AlterClause> alterClauses,
                                          final String clusterName, Database 
db) throws UserException {
         if (olapTable.getDataSortInfo() != null
@@ -451,6 +466,10 @@ public class Alter {
         }
     }
 
+    public void processAlterMaterializedView(AlterMaterializedViewStmt stmt) 
throws UserException {
+        throw new DdlException("ALTER MATERIALIZED VIEW is not implemented: " 
+ stmt.toSql());
+    }
+
     // entry of processing replace table
     private void processReplaceTable(Database db, OlapTable origTable, 
List<AlterClause> alterClauses)
             throws UserException {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterMaterializedViewStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterMaterializedViewStmt.java
new file mode 100644
index 0000000000..a4331d9f5b
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterMaterializedViewStmt.java
@@ -0,0 +1,55 @@
+// 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.Env;
+import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.ErrorReport;
+import org.apache.doris.mysql.privilege.PrivPredicate;
+import org.apache.doris.qe.ConnectContext;
+
+public class AlterMaterializedViewStmt extends DdlStmt  {
+    private TableName mvName;
+    private MVRefreshInfo info;
+
+    public AlterMaterializedViewStmt(TableName mvName, MVRefreshInfo info) {
+        this.mvName = mvName;
+        this.info = info;
+    }
+
+    @Override
+    public void analyze(Analyzer analyzer) throws AnalysisException {
+        mvName.analyze(analyzer);
+        if (!Env.getCurrentEnv().getAuth().checkTblPriv(ConnectContext.get(), 
mvName.getDb(), mvName.getTbl(),
+                PrivPredicate.ALTER)) {
+            
ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, 
"MATERIALIZED VIEW",
+                    ConnectContext.get().getQualifiedUser(),
+                    ConnectContext.get().getRemoteIP(),
+                    mvName.getDb() + ": " + mvName.getTbl());
+        }
+    }
+
+    @Override
+    public String toSql() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("ALTER MATERIALIZED VIEW ").append(mvName.toSql()).append(" 
").append(info.toString());
+        return sb.toString();
+
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMultiTableMaterializedViewStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMultiTableMaterializedViewStmt.java
new file mode 100644
index 0000000000..5302cdfa90
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMultiTableMaterializedViewStmt.java
@@ -0,0 +1,72 @@
+// 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.UserException;
+import org.apache.doris.common.util.PrintableMap;
+
+import java.util.Map;
+
+public class CreateMultiTableMaterializedViewStmt extends DdlStmt {
+    private String mvName;
+    private MVRefreshInfo.BuildMode buildMethod;
+    private MVRefreshInfo refreshInfo;
+    private PartitionDesc partition;
+    private DistributionDesc distribution;
+    private Map<String, String> tblProperties;
+    private QueryStmt queryStmt;
+
+    public CreateMultiTableMaterializedViewStmt(String mvName, 
MVRefreshInfo.BuildMode buildMethod,
+            MVRefreshInfo refreshInfo, PartitionDesc partition, 
DistributionDesc distribution,
+            Map<String, String> tblProperties, QueryStmt queryStmt) {
+        this.mvName = mvName;
+        this.buildMethod = buildMethod;
+        this.refreshInfo = refreshInfo;
+        this.partition = partition;
+        this.distribution = distribution;
+        this.tblProperties = tblProperties;
+        this.queryStmt = queryStmt;
+    }
+
+    @Override
+    public void analyze(Analyzer analyzer) throws UserException {
+        refreshInfo.analyze(analyzer);
+    }
+
+    @Override
+    public String toSql() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("CREATE MATERIALIZED VIEW ").append(mvName).append(" BUILD 
ON ").append(buildMethod.toString());
+        if (refreshInfo != null) {
+            sb.append(" ").append(refreshInfo.toString());
+        }
+        if (partition != null) {
+            sb.append(" ").append(partition.toString());
+        }
+        if (distribution != null) {
+            sb.append(" ").append(distribution.toString());
+        }
+        if (tblProperties != null && !tblProperties.isEmpty()) {
+            sb.append("\nPROPERTIES (");
+            sb.append(new PrintableMap<>(tblProperties, " = ", true, true, 
true));
+            sb.append(")");
+        }
+        sb.append(" AS ").append(queryStmt.toSql());
+        return sb.toString();
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropMaterializedViewStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropMaterializedViewStmt.java
index 861160fa48..9d81c6d68c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropMaterializedViewStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropMaterializedViewStmt.java
@@ -41,6 +41,8 @@ public class DropMaterializedViewStmt extends DdlStmt {
 
     private String mvName;
     private TableName tableName;
+
+    private TableName mtmvName;
     private boolean ifExists;
 
     public DropMaterializedViewStmt(boolean ifExists, String mvName, TableName 
tableName) {
@@ -49,8 +51,20 @@ public class DropMaterializedViewStmt extends DdlStmt {
         this.ifExists = ifExists;
     }
 
+    public DropMaterializedViewStmt(boolean ifExists, TableName mvName) {
+        this.mtmvName = mvName;
+        this.ifExists = ifExists;
+        this.tableName = null;
+    }
+
     public String getMvName() {
-        return mvName;
+        if (tableName != null) {
+            return mvName;
+        } else if (mtmvName != null) {
+            return mtmvName.toString();
+        } else {
+            return null;
+        }
     }
 
     public TableName getTableName() {
@@ -63,6 +77,9 @@ public class DropMaterializedViewStmt extends DdlStmt {
 
     @Override
     public void analyze(Analyzer analyzer) throws UserException {
+        if (mtmvName != null && tableName == null) {
+            throw new AnalysisException("Multi table materialized view is not 
supported now.");
+        }
         if (Strings.isNullOrEmpty(mvName)) {
             throw new AnalysisException("The materialized name could not be 
empty or null.");
         }
@@ -84,8 +101,12 @@ public class DropMaterializedViewStmt extends DdlStmt {
         if (ifExists) {
             stringBuilder.append("IF EXISTS ");
         }
-        stringBuilder.append("`").append(mvName).append("` ");
-        stringBuilder.append("ON ").append(tableName.toSql());
+        if (mtmvName != null) {
+            stringBuilder.append(mtmvName.toSql());
+        } else {
+            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/analysis/MVRefreshInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MVRefreshInfo.java
new file mode 100644
index 0000000000..fcb60146b5
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/MVRefreshInfo.java
@@ -0,0 +1,75 @@
+// 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.UserException;
+
+public class MVRefreshInfo {
+    private final boolean neverRefresh;
+    private RefreshMethod refreshMethod;
+    private MVRefreshTriggerInfo triggerInfo;
+
+    public MVRefreshInfo(boolean neverRefresh) {
+        this.neverRefresh = neverRefresh;
+        if (!neverRefresh) {
+            refreshMethod = RefreshMethod.COMPLETE;
+            triggerInfo = null;
+        }
+    }
+
+    public MVRefreshInfo(RefreshMethod method, MVRefreshTriggerInfo trigger) {
+        this.neverRefresh = false;
+        this.refreshMethod = method;
+        if (!neverRefresh) {
+            refreshMethod = RefreshMethod.COMPLETE;
+            triggerInfo = trigger;
+        }
+    }
+
+    void analyze(Analyzer analyzer) throws UserException {
+        if (triggerInfo != null) {
+            triggerInfo.analyze(analyzer);
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        if (neverRefresh) {
+            sb.append(" NEVER REFRESH ");
+        } else {
+            sb.append(" REFRESH ");
+            sb.append(refreshMethod.toString());
+            sb.append(triggerInfo.toString());
+        }
+        return sb.toString();
+    }
+
+    enum RefreshMethod {
+        FAST, COMPLETE, FORCE
+    }
+
+    enum RefreshTrigger {
+        DEMAND, COMMIT, INTERVAL
+    }
+
+    enum BuildMode {
+        IMMEDIATE, DEFERRED
+    }
+}
+
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/MVRefreshIntervalTriggerInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MVRefreshIntervalTriggerInfo.java
new file mode 100644
index 0000000000..954017cb35
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MVRefreshIntervalTriggerInfo.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.analysis;
+
+public class MVRefreshIntervalTriggerInfo {
+    private String startTime;
+    private long interval;
+    private String timeUnit;
+
+    public MVRefreshIntervalTriggerInfo(String startTime, long interval, 
String timeUnit) {
+        this.startTime = startTime;
+        this.interval = interval;
+        this.timeUnit = timeUnit;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public long getInterval() {
+        return interval;
+    }
+
+    public String getTimeUnit() {
+        return timeUnit;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        if (startTime != null) {
+            sb.append(" START WITH ").append(startTime);
+        }
+        if (interval > 0) {
+            sb.append(" NEXT ").append(interval).append(" ").append(timeUnit);
+        }
+        return sb.toString();
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/MVRefreshTriggerInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MVRefreshTriggerInfo.java
new file mode 100644
index 0000000000..8467b68459
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MVRefreshTriggerInfo.java
@@ -0,0 +1,63 @@
+// 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.analysis.MVRefreshInfo.RefreshTrigger;
+import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.UserException;
+
+public class MVRefreshTriggerInfo {
+    private RefreshTrigger refreshTrigger;
+    private MVRefreshIntervalTriggerInfo intervalTrigger;
+
+    public MVRefreshTriggerInfo(MVRefreshIntervalTriggerInfo trigger) {
+        this.intervalTrigger = trigger;
+        this.refreshTrigger = RefreshTrigger.INTERVAL;
+    }
+
+    public MVRefreshTriggerInfo(RefreshTrigger trigger) {
+        this.intervalTrigger = null;
+        this.refreshTrigger = trigger;
+    }
+
+    void analyze(Analyzer analyzer) throws UserException {
+        if (refreshTrigger == RefreshTrigger.INTERVAL && (intervalTrigger == 
null || (
+                intervalTrigger.getStartTime() == null && 
intervalTrigger.getInterval() < 0))) {
+            throw new AnalysisException("Start time or interval is required.");
+        } else if (refreshTrigger == null) {
+            throw new AnalysisException("refresh trigger is required.");
+        }
+    }
+
+
+    public RefreshTrigger getRefreshTrigger() {
+        return refreshTrigger;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        if (refreshTrigger != RefreshTrigger.INTERVAL) {
+            sb.append(" ON ");
+            sb.append(refreshTrigger.toString());
+        } else {
+            sb.append(intervalTrigger.toString());
+        }
+        return sb.toString();
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/RefreshMaterializedViewStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/RefreshMaterializedViewStmt.java
new file mode 100644
index 0000000000..cfc64c2447
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/RefreshMaterializedViewStmt.java
@@ -0,0 +1,76 @@
+// 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.analysis.MVRefreshInfo.RefreshMethod;
+import org.apache.doris.catalog.Env;
+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;
+
+/**
+ * REFRESH MATERIALIZED VIEW [db_name].<mv_name> [complete|fast];
+ *
+ * Parameters
+ * [complete|fast]: complete or incremental refresh.
+ * mv_name: The name of the materialized view to refresh.
+ */
+public class RefreshMaterializedViewStmt extends DdlStmt {
+
+    private TableName mvName;
+    private RefreshMethod refreshMethod;
+
+    public RefreshMaterializedViewStmt(TableName mvName, RefreshMethod 
refreshMethod) {
+        this.mvName = mvName;
+        if (refreshMethod == null) {
+            this.refreshMethod = RefreshMethod.COMPLETE;
+        }
+        this.refreshMethod = refreshMethod;
+    }
+
+    public TableName getMvName() {
+        return mvName;
+    }
+
+    public RefreshMethod getRefreshMethod() {
+        return refreshMethod;
+    }
+
+    @Override
+    public void analyze(Analyzer analyzer) throws UserException {
+        mvName.analyze(analyzer);
+
+        // check access
+        if (!Env.getCurrentEnv().getAuth().checkTblPriv(ConnectContext.get(), 
mvName.getDb(),
+                mvName.getTbl(), PrivPredicate.ADMIN)) {
+            
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, 
"ADMIN");
+        }
+    }
+
+    @Override
+    public String toSql() {
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("REFRESH MATERIALIZED VIEW ")
+                .append(mvName.toSql())
+                .append(" ")
+                .append(refreshMethod.toString());
+        return stringBuilder.toString();
+    }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
index 48d64df514..55b1b5e142 100755
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
@@ -34,6 +34,7 @@ import org.apache.doris.analysis.AlterClusterStmt;
 import org.apache.doris.analysis.AlterDatabaseQuotaStmt;
 import org.apache.doris.analysis.AlterDatabaseQuotaStmt.QuotaType;
 import org.apache.doris.analysis.AlterDatabaseRename;
+import org.apache.doris.analysis.AlterMaterializedViewStmt;
 import org.apache.doris.analysis.AlterSystemStmt;
 import org.apache.doris.analysis.AlterTableStmt;
 import org.apache.doris.analysis.AlterViewStmt;
@@ -46,6 +47,7 @@ import org.apache.doris.analysis.CreateClusterStmt;
 import org.apache.doris.analysis.CreateDbStmt;
 import org.apache.doris.analysis.CreateFunctionStmt;
 import org.apache.doris.analysis.CreateMaterializedViewStmt;
+import org.apache.doris.analysis.CreateMultiTableMaterializedViewStmt;
 import org.apache.doris.analysis.CreateTableAsSelectStmt;
 import org.apache.doris.analysis.CreateTableLikeStmt;
 import org.apache.doris.analysis.CreateTableStmt;
@@ -67,6 +69,7 @@ import org.apache.doris.analysis.PartitionRenameClause;
 import org.apache.doris.analysis.RecoverDbStmt;
 import org.apache.doris.analysis.RecoverPartitionStmt;
 import org.apache.doris.analysis.RecoverTableStmt;
+import org.apache.doris.analysis.RefreshMaterializedViewStmt;
 import org.apache.doris.analysis.ReplacePartitionClause;
 import org.apache.doris.analysis.RestoreStmt;
 import org.apache.doris.analysis.RollupRenameClause;
@@ -3587,6 +3590,10 @@ public class Env {
         this.alter.processAlterTable(stmt);
     }
 
+    public void alterMaterializedView(AlterMaterializedViewStmt stmt) throws 
UserException {
+        this.alter.processAlterMaterializedView(stmt);
+    }
+
     /**
      * used for handling AlterViewStmt (the ALTER VIEW command).
      */
@@ -3599,10 +3606,18 @@ public class Env {
         this.alter.processCreateMaterializedView(stmt);
     }
 
+    public void 
createMultiTableMaterializedView(CreateMultiTableMaterializedViewStmt stmt) 
throws AnalysisException {
+        this.alter.processCreateMultiTableMaterializedView(stmt);
+    }
+
     public void dropMaterializedView(DropMaterializedViewStmt stmt) throws 
DdlException, MetaNotFoundException {
         this.alter.processDropMaterializedView(stmt);
     }
 
+    public void refreshMaterializedView(RefreshMaterializedViewStmt stmt) 
throws DdlException, MetaNotFoundException {
+        this.alter.processRefreshMaterializedView(stmt);
+    }
+
     /*
      * used for handling CancelAlterStmt (for client is the CANCEL ALTER
      * command). including SchemaChangeHandler and RollupHandler
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java
index 2c0b426d3b..1f42930ecd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java
@@ -33,6 +33,7 @@ import org.apache.doris.analysis.AlterColumnStatsStmt;
 import org.apache.doris.analysis.AlterDatabasePropertyStmt;
 import org.apache.doris.analysis.AlterDatabaseQuotaStmt;
 import org.apache.doris.analysis.AlterDatabaseRename;
+import org.apache.doris.analysis.AlterMaterializedViewStmt;
 import org.apache.doris.analysis.AlterPolicyStmt;
 import org.apache.doris.analysis.AlterResourceStmt;
 import org.apache.doris.analysis.AlterRoutineLoadStmt;
@@ -56,6 +57,7 @@ import org.apache.doris.analysis.CreateEncryptKeyStmt;
 import org.apache.doris.analysis.CreateFileStmt;
 import org.apache.doris.analysis.CreateFunctionStmt;
 import org.apache.doris.analysis.CreateMaterializedViewStmt;
+import org.apache.doris.analysis.CreateMultiTableMaterializedViewStmt;
 import org.apache.doris.analysis.CreatePolicyStmt;
 import org.apache.doris.analysis.CreateRepositoryStmt;
 import org.apache.doris.analysis.CreateResourceStmt;
@@ -94,6 +96,7 @@ import org.apache.doris.analysis.RecoverDbStmt;
 import org.apache.doris.analysis.RecoverPartitionStmt;
 import org.apache.doris.analysis.RecoverTableStmt;
 import org.apache.doris.analysis.RefreshDbStmt;
+import org.apache.doris.analysis.RefreshMaterializedViewStmt;
 import org.apache.doris.analysis.RefreshTableStmt;
 import org.apache.doris.analysis.RestoreStmt;
 import org.apache.doris.analysis.ResumeRoutineLoadStmt;
@@ -148,6 +151,8 @@ public class DdlExecutor {
             env.dropTable((DropTableStmt) ddlStmt);
         } else if (ddlStmt instanceof CreateMaterializedViewStmt) {
             env.createMaterializedView((CreateMaterializedViewStmt) ddlStmt);
+        } else if (ddlStmt instanceof CreateMultiTableMaterializedViewStmt) {
+            
env.createMultiTableMaterializedView((CreateMultiTableMaterializedViewStmt) 
ddlStmt);
         } else if (ddlStmt instanceof DropMaterializedViewStmt) {
             env.dropMaterializedView((DropMaterializedViewStmt) ddlStmt);
         } else if (ddlStmt instanceof AlterTableStmt) {
@@ -318,6 +323,12 @@ public class DdlExecutor {
             
env.getDataSourceMgr().alterCatalogProps((AlterCatalogPropertyStmt) ddlStmt);
         } else if (ddlStmt instanceof CleanLabelStmt) {
             env.getCurrentEnv().getLoadManager().cleanLabel((CleanLabelStmt) 
ddlStmt);
+        } else if (ddlStmt instanceof AlterMaterializedViewStmt) {
+            env.alterMaterializedView((AlterMaterializedViewStmt) ddlStmt);
+        } else if (ddlStmt instanceof DropMaterializedViewStmt) {
+            env.dropMaterializedView((DropMaterializedViewStmt) ddlStmt);
+        } else if (ddlStmt instanceof RefreshMaterializedViewStmt) {
+            env.refreshMaterializedView((RefreshMaterializedViewStmt) ddlStmt);
         } else {
             throw new DdlException("Unknown statement.");
         }
diff --git a/fe/fe-core/src/main/jflex/sql_scanner.flex 
b/fe/fe-core/src/main/jflex/sql_scanner.flex
index b2f7b9ae3d..9c91c35c7d 100644
--- a/fe/fe-core/src/main/jflex/sql_scanner.flex
+++ b/fe/fe-core/src/main/jflex/sql_scanner.flex
@@ -91,6 +91,7 @@ import org.apache.doris.qe.SqlModeHelper;
     private static final Map<String, Integer> keywordMap = new 
LinkedHashMap<String, Integer>();
     static {
         keywordMap.put("&&", new Integer(SqlParserSymbols.KW_AND));
+        keywordMap.put("||", new Integer(SqlParserSymbols.KW_PIPE));
         keywordMap.put("add", new Integer(SqlParserSymbols.KW_ADD));
         keywordMap.put("admin", new Integer(SqlParserSymbols.KW_ADMIN));
         keywordMap.put("after", new Integer(SqlParserSymbols.KW_AFTER));
@@ -101,10 +102,10 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("and", new Integer(SqlParserSymbols.KW_AND));
         keywordMap.put("anti", new Integer(SqlParserSymbols.KW_ANTI));
         keywordMap.put("append", new Integer(SqlParserSymbols.KW_APPEND));
+        keywordMap.put("array", new Integer(SqlParserSymbols.KW_ARRAY));
         keywordMap.put("as", new Integer(SqlParserSymbols.KW_AS));
         keywordMap.put("asc", new Integer(SqlParserSymbols.KW_ASC));
         keywordMap.put("authors", new Integer(SqlParserSymbols.KW_AUTHORS));
-        keywordMap.put("array", new Integer(SqlParserSymbols.KW_ARRAY));
         keywordMap.put("backend", new Integer(SqlParserSymbols.KW_BACKEND));
         keywordMap.put("backends", new Integer(SqlParserSymbols.KW_BACKENDS));
         keywordMap.put("backup", new Integer(SqlParserSymbols.KW_BACKUP));
@@ -114,19 +115,18 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("binlog", new Integer(SqlParserSymbols.KW_BINLOG));
         keywordMap.put("bitmap", new Integer(SqlParserSymbols.KW_BITMAP));
         keywordMap.put("bitmap_union", new 
Integer(SqlParserSymbols.KW_BITMAP_UNION));
-        keywordMap.put("quantile_state", new 
Integer(SqlParserSymbols.KW_QUANTILE_STATE));
-        keywordMap.put("quantile_union", new 
Integer(SqlParserSymbols.KW_QUANTILE_UNION));
         keywordMap.put("blob", new Integer(SqlParserSymbols.KW_BLOB));
         keywordMap.put("boolean", new Integer(SqlParserSymbols.KW_BOOLEAN));
         keywordMap.put("broker", new Integer(SqlParserSymbols.KW_BROKER));
-        keywordMap.put("s3", new Integer(SqlParserSymbols.KW_S3));
-        keywordMap.put("hdfs", new Integer(SqlParserSymbols.KW_HDFS));
         keywordMap.put("buckets", new Integer(SqlParserSymbols.KW_BUCKETS));
+        keywordMap.put("build", new Integer(SqlParserSymbols.KW_BUILD));
         keywordMap.put("builtin", new Integer(SqlParserSymbols.KW_BUILTIN));
         keywordMap.put("by", new Integer(SqlParserSymbols.KW_BY));
         keywordMap.put("cancel", new Integer(SqlParserSymbols.KW_CANCEL));
         keywordMap.put("case", new Integer(SqlParserSymbols.KW_CASE));
         keywordMap.put("cast", new Integer(SqlParserSymbols.KW_CAST));
+        keywordMap.put("catalog", new Integer(SqlParserSymbols.KW_CATALOG));
+        keywordMap.put("catalogs", new Integer(SqlParserSymbols.KW_CATALOGS));
         keywordMap.put("chain", new Integer(SqlParserSymbols.KW_CHAIN));
         keywordMap.put("char", new Integer(SqlParserSymbols.KW_CHAR));
         keywordMap.put("character", new Integer(SqlParserSymbols.KW_CHAR));
@@ -143,6 +143,7 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("commit", new Integer(SqlParserSymbols.KW_COMMIT));
         keywordMap.put("committed", new 
Integer(SqlParserSymbols.KW_COMMITTED));
         keywordMap.put("compact", new Integer(SqlParserSymbols.KW_COMPACT));
+        keywordMap.put("complete", new Integer(SqlParserSymbols.KW_COMPLETE));
         keywordMap.put("config", new Integer(SqlParserSymbols.KW_CONFIG));
         keywordMap.put("connection", new 
Integer(SqlParserSymbols.KW_CONNECTION));
         keywordMap.put("connection_id", new 
Integer(SqlParserSymbols.KW_CONNECTION_ID));
@@ -154,13 +155,14 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("cross", new Integer(SqlParserSymbols.KW_CROSS));
         keywordMap.put("cube", new Integer(SqlParserSymbols.KW_CUBE));
         keywordMap.put("current", new Integer(SqlParserSymbols.KW_CURRENT));
+        keywordMap.put("current_timestamp", new 
Integer(SqlParserSymbols.KW_CURRENT_TIMESTAMP));
         keywordMap.put("current_user", new 
Integer(SqlParserSymbols.KW_CURRENT_USER));
         keywordMap.put("data", new Integer(SqlParserSymbols.KW_DATA));
         keywordMap.put("database", new Integer(SqlParserSymbols.KW_DATABASE));
         keywordMap.put("databases", new 
Integer(SqlParserSymbols.KW_DATABASES));
         keywordMap.put("date", new Integer(SqlParserSymbols.KW_DATE));
-        keywordMap.put("datetime", new Integer(SqlParserSymbols.KW_DATETIME));
         keywordMap.put("datev2", new Integer(SqlParserSymbols.KW_DATEV2));
+        keywordMap.put("datetime", new Integer(SqlParserSymbols.KW_DATETIME));
         keywordMap.put("datetimev2", new 
Integer(SqlParserSymbols.KW_DATETIMEV2));
         keywordMap.put("time", new Integer(SqlParserSymbols.KW_TIME));
         keywordMap.put("day", new Integer(SqlParserSymbols.KW_DAY));
@@ -168,10 +170,13 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("decimalv3", new 
Integer(SqlParserSymbols.KW_DECIMALV3));
         keywordMap.put("decommission", new 
Integer(SqlParserSymbols.KW_DECOMMISSION));
         keywordMap.put("default", new Integer(SqlParserSymbols.KW_DEFAULT));
+        keywordMap.put("deferred", new Integer(SqlParserSymbols.KW_DEFERRED));
         keywordMap.put("delete", new Integer(SqlParserSymbols.KW_DELETE));
+        keywordMap.put("demand", new Integer(SqlParserSymbols.KW_DEMAND));
         keywordMap.put("desc", new Integer(SqlParserSymbols.KW_DESC));
         keywordMap.put("describe", new Integer(SqlParserSymbols.KW_DESCRIBE));
         keywordMap.put("diagnose", new Integer(SqlParserSymbols.KW_DIAGNOSE));
+        keywordMap.put("disk", new Integer(SqlParserSymbols.KW_DISK));
         keywordMap.put("distinct", new Integer(SqlParserSymbols.KW_DISTINCT));
         keywordMap.put("distinctpc", new 
Integer(SqlParserSymbols.KW_DISTINCTPC));
         keywordMap.put("distinctpc", new 
Integer(SqlParserSymbols.KW_DISTINCTPC));
@@ -179,13 +184,12 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("distinctpcsa", new 
Integer(SqlParserSymbols.KW_DISTINCTPCSA));
         keywordMap.put("distributed", new 
Integer(SqlParserSymbols.KW_DISTRIBUTED));
         keywordMap.put("distribution", new 
Integer(SqlParserSymbols.KW_DISTRIBUTION));
-        keywordMap.put("disk", new Integer(SqlParserSymbols.KW_DISK));
-        keywordMap.put("dynamic", new Integer(SqlParserSymbols.KW_DYNAMIC));
         keywordMap.put("div", new Integer(SqlParserSymbols.KW_DIV));
         keywordMap.put("double", new Integer(SqlParserSymbols.KW_DOUBLE));
         keywordMap.put("drop", new Integer(SqlParserSymbols.KW_DROP));
         keywordMap.put("dropp", new Integer(SqlParserSymbols.KW_DROPP));
         keywordMap.put("duplicate", new 
Integer(SqlParserSymbols.KW_DUPLICATE));
+        keywordMap.put("dynamic", new Integer(SqlParserSymbols.KW_DYNAMIC));
         keywordMap.put("else", new Integer(SqlParserSymbols.KW_ELSE));
         keywordMap.put("enable", new Integer(SqlParserSymbols.KW_ENABLE));
         keywordMap.put("encryptkey", new 
Integer(SqlParserSymbols.KW_ENCRYPTKEY));
@@ -205,6 +209,7 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("external", new Integer(SqlParserSymbols.KW_EXTERNAL));
         keywordMap.put("extract", new Integer(SqlParserSymbols.KW_EXTRACT));
         keywordMap.put("false", new Integer(SqlParserSymbols.KW_FALSE));
+        keywordMap.put("fast", new Integer(SqlParserSymbols.KW_FAST));
         keywordMap.put("feature", new Integer(SqlParserSymbols.KW_FEATURE));
         keywordMap.put("fields", new Integer(SqlParserSymbols.KW_FIELDS));
         keywordMap.put("file", new Integer(SqlParserSymbols.KW_FILE));
@@ -231,6 +236,7 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("grouping", new Integer(SqlParserSymbols.KW_GROUPING));
         keywordMap.put("hash", new Integer(SqlParserSymbols.KW_HASH));
         keywordMap.put("having", new Integer(SqlParserSymbols.KW_HAVING));
+        keywordMap.put("hdfs", new Integer(SqlParserSymbols.KW_HDFS));
         keywordMap.put("help", new Integer(SqlParserSymbols.KW_HELP));
         keywordMap.put("hll", new Integer(SqlParserSymbols.KW_HLL));
         keywordMap.put("hll_union", new 
Integer(SqlParserSymbols.KW_HLL_UNION));
@@ -238,6 +244,7 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("hub", new Integer(SqlParserSymbols.KW_HUB));
         keywordMap.put("identified", new 
Integer(SqlParserSymbols.KW_IDENTIFIED));
         keywordMap.put("if", new Integer(SqlParserSymbols.KW_IF));
+        keywordMap.put("immediate", new 
Integer(SqlParserSymbols.KW_IMMEDIATE));
         keywordMap.put("in", new Integer(SqlParserSymbols.KW_IN));
         keywordMap.put("index", new Integer(SqlParserSymbols.KW_INDEX));
         keywordMap.put("indexes", new Integer(SqlParserSymbols.KW_INDEXES));
@@ -245,6 +252,7 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("inner", new Integer(SqlParserSymbols.KW_INNER));
         keywordMap.put("inner", new Integer(SqlParserSymbols.KW_INNER));
         keywordMap.put("insert", new Integer(SqlParserSymbols.KW_INSERT));
+        keywordMap.put("install", new Integer(SqlParserSymbols.KW_INSTALL));
         keywordMap.put("int", new Integer(SqlParserSymbols.KW_INT));
         keywordMap.put("integer", new Integer(SqlParserSymbols.KW_INT));
         keywordMap.put("intermediate", new 
Integer(SqlParserSymbols.KW_INTERMEDIATE));
@@ -254,7 +262,6 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("is", new Integer(SqlParserSymbols.KW_IS));
         keywordMap.put("isnull", new Integer(SqlParserSymbols.KW_ISNULL));
         keywordMap.put("isolation", new 
Integer(SqlParserSymbols.KW_ISOLATION));
-        keywordMap.put("install", new Integer(SqlParserSymbols.KW_INSTALL));
         keywordMap.put("job", new Integer(SqlParserSymbols.KW_JOB));
         keywordMap.put("join", new Integer(SqlParserSymbols.KW_JOIN));
         keywordMap.put("key", new Integer(SqlParserSymbols.KW_KEY));
@@ -264,6 +271,7 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("largeint", new Integer(SqlParserSymbols.KW_LARGEINT));
         keywordMap.put("last", new Integer(SqlParserSymbols.KW_LAST));
         keywordMap.put("lateral", new Integer(SqlParserSymbols.KW_LATERAL));
+        keywordMap.put("ldap_admin_password", new 
Integer(SqlParserSymbols.KW_LDAP_ADMIN_PASSWORD));
         keywordMap.put("left", new Integer(SqlParserSymbols.KW_LEFT));
         keywordMap.put("less", new Integer(SqlParserSymbols.KW_LESS));
         keywordMap.put("level", new Integer(SqlParserSymbols.KW_LEVEL));
@@ -291,8 +299,11 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("name", new Integer(SqlParserSymbols.KW_NAME));
         keywordMap.put("names", new Integer(SqlParserSymbols.KW_NAMES));
         keywordMap.put("negative", new Integer(SqlParserSymbols.KW_NEGATIVE));
+        keywordMap.put("never", new Integer(SqlParserSymbols.KW_NEVER));
+        keywordMap.put("next", new Integer(SqlParserSymbols.KW_NEXT));
         keywordMap.put("no", new Integer(SqlParserSymbols.KW_NO));
         keywordMap.put("not", new Integer(SqlParserSymbols.KW_NOT));
+        keywordMap.put("not_null", new Integer(SqlParserSymbols.KW_NOT_NULL));
         keywordMap.put("null", new Integer(SqlParserSymbols.KW_NULL));
         keywordMap.put("nulls", new Integer(SqlParserSymbols.KW_NULLS));
         keywordMap.put("observer", new Integer(SqlParserSymbols.KW_OBSERVER));
@@ -309,11 +320,11 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("partition", new 
Integer(SqlParserSymbols.KW_PARTITION));
         keywordMap.put("partitions", new 
Integer(SqlParserSymbols.KW_PARTITIONS));
         keywordMap.put("password", new Integer(SqlParserSymbols.KW_PASSWORD));
-        keywordMap.put("ldap_admin_password", new 
Integer(SqlParserSymbols.KW_LDAP_ADMIN_PASSWORD));
         keywordMap.put("path", new Integer(SqlParserSymbols.KW_PATH));
         keywordMap.put("pause", new Integer(SqlParserSymbols.KW_PAUSE));
         keywordMap.put("plugin", new Integer(SqlParserSymbols.KW_PLUGIN));
         keywordMap.put("plugins", new Integer(SqlParserSymbols.KW_PLUGINS));
+        keywordMap.put("policy", new Integer(SqlParserSymbols.KW_POLICY));
         keywordMap.put("preceding", new 
Integer(SqlParserSymbols.KW_PRECEDING));
         keywordMap.put("proc", new Integer(SqlParserSymbols.KW_PROC));
         keywordMap.put("procedure", new 
Integer(SqlParserSymbols.KW_PROCEDURE));
@@ -321,7 +332,8 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("profile", new Integer(SqlParserSymbols.KW_PROFILE));
         keywordMap.put("properties", new 
Integer(SqlParserSymbols.KW_PROPERTIES));
         keywordMap.put("property", new Integer(SqlParserSymbols.KW_PROPERTY));
-        keywordMap.put("policy", new Integer(SqlParserSymbols.KW_POLICY));
+        keywordMap.put("quantile_state", new 
Integer(SqlParserSymbols.KW_QUANTILE_STATE));
+        keywordMap.put("quantile_union", new 
Integer(SqlParserSymbols.KW_QUANTILE_UNION));
         keywordMap.put("query", new Integer(SqlParserSymbols.KW_QUERY));
         keywordMap.put("quota", new Integer(SqlParserSymbols.KW_QUOTA));
         keywordMap.put("random", new Integer(SqlParserSymbols.KW_RANDOM));
@@ -357,6 +369,7 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("routine", new Integer(SqlParserSymbols.KW_ROUTINE));
         keywordMap.put("row", new Integer(SqlParserSymbols.KW_ROW));
         keywordMap.put("rows", new Integer(SqlParserSymbols.KW_ROWS));
+        keywordMap.put("s3", new Integer(SqlParserSymbols.KW_S3));
         keywordMap.put("schema", new Integer(SqlParserSymbols.KW_SCHEMA));
         keywordMap.put("schemas", new Integer(SqlParserSymbols.KW_SCHEMAS));
         keywordMap.put("second", new Integer(SqlParserSymbols.KW_SECOND));
@@ -373,9 +386,10 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("snapshot", new Integer(SqlParserSymbols.KW_SNAPSHOT));
         keywordMap.put("soname", new Integer(SqlParserSymbols.KW_SONAME));
         keywordMap.put("split", new Integer(SqlParserSymbols.KW_SPLIT));
+        keywordMap.put("sql_block_rule", new 
Integer(SqlParserSymbols.KW_SQL_BLOCK_RULE));
         keywordMap.put("start", new Integer(SqlParserSymbols.KW_START));
-        keywordMap.put("status", new Integer(SqlParserSymbols.KW_STATUS));
         keywordMap.put("stats", new Integer(SqlParserSymbols.KW_STATS));
+        keywordMap.put("status", new Integer(SqlParserSymbols.KW_STATUS));
         keywordMap.put("stop", new Integer(SqlParserSymbols.KW_STOP));
         keywordMap.put("storage", new Integer(SqlParserSymbols.KW_STORAGE));
         keywordMap.put("stream", new Integer(SqlParserSymbols.KW_STREAM));
@@ -383,9 +397,9 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("struct", new Integer(SqlParserSymbols.KW_STRUCT));
         keywordMap.put("sum", new Integer(SqlParserSymbols.KW_SUM));
         keywordMap.put("superuser", new 
Integer(SqlParserSymbols.KW_SUPERUSER));
+        keywordMap.put("switch", new Integer(SqlParserSymbols.KW_SWITCH));
         keywordMap.put("sync", new Integer(SqlParserSymbols.KW_SYNC));
         keywordMap.put("system", new Integer(SqlParserSymbols.KW_SYSTEM));
-        keywordMap.put("sql_block_rule", new 
Integer(SqlParserSymbols.KW_SQL_BLOCK_RULE));
         keywordMap.put("table", new Integer(SqlParserSymbols.KW_TABLE));
         keywordMap.put("tables", new Integer(SqlParserSymbols.KW_TABLES));
         keywordMap.put("tablet", new Integer(SqlParserSymbols.KW_TABLET));
@@ -396,6 +410,7 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("text", new Integer(SqlParserSymbols.KW_TEXT));
         keywordMap.put("than", new Integer(SqlParserSymbols.KW_THAN));
         keywordMap.put("then", new Integer(SqlParserSymbols.KW_THEN));
+        keywordMap.put("time", new Integer(SqlParserSymbols.KW_TIME));
         keywordMap.put("timestamp", new 
Integer(SqlParserSymbols.KW_TIMESTAMP));
         keywordMap.put("tinyint", new Integer(SqlParserSymbols.KW_TINYINT));
         keywordMap.put("to", new Integer(SqlParserSymbols.KW_TO));
@@ -409,37 +424,31 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("types", new Integer(SqlParserSymbols.KW_TYPES));
         keywordMap.put("unbounded", new 
Integer(SqlParserSymbols.KW_UNBOUNDED));
         keywordMap.put("uncommitted", new 
Integer(SqlParserSymbols.KW_UNCOMMITTED));
+        keywordMap.put("uninstall", new 
Integer(SqlParserSymbols.KW_UNINSTALL));
         keywordMap.put("union", new Integer(SqlParserSymbols.KW_UNION));
         keywordMap.put("unique", new Integer(SqlParserSymbols.KW_UNIQUE));
+        keywordMap.put("unlock", new Integer(SqlParserSymbols.KW_UNLOCK));
         keywordMap.put("unsigned", new Integer(SqlParserSymbols.KW_UNSIGNED));
+        keywordMap.put("update", new Integer(SqlParserSymbols.KW_UPDATE));
         keywordMap.put("use", new Integer(SqlParserSymbols.KW_USE));
         keywordMap.put("user", new Integer(SqlParserSymbols.KW_USER));
         keywordMap.put("using", new Integer(SqlParserSymbols.KW_USING));
-        keywordMap.put("uninstall", new 
Integer(SqlParserSymbols.KW_UNINSTALL));
-        keywordMap.put("unlock", new Integer(SqlParserSymbols.KW_UNLOCK));
-        keywordMap.put("update", new Integer(SqlParserSymbols.KW_UPDATE));
         keywordMap.put("value", new Integer(SqlParserSymbols.KW_VALUE));
         keywordMap.put("values", new Integer(SqlParserSymbols.KW_VALUES));
         keywordMap.put("varchar", new Integer(SqlParserSymbols.KW_VARCHAR));
-        keywordMap.put("verbose", new Integer(SqlParserSymbols.KW_VERBOSE));
         keywordMap.put("variables", new 
Integer(SqlParserSymbols.KW_VARIABLES));
+        keywordMap.put("verbose", new Integer(SqlParserSymbols.KW_VERBOSE));
         keywordMap.put("view", new Integer(SqlParserSymbols.KW_VIEW));
         keywordMap.put("warnings", new Integer(SqlParserSymbols.KW_WARNINGS));
         keywordMap.put("week", new Integer(SqlParserSymbols.KW_WEEK));
-        keywordMap.put("whitelist", new 
Integer(SqlParserSymbols.KW_WHITELIST));
         keywordMap.put("when", new Integer(SqlParserSymbols.KW_WHEN));
         keywordMap.put("where", new Integer(SqlParserSymbols.KW_WHERE));
         keywordMap.put("whitelist", new 
Integer(SqlParserSymbols.KW_WHITELIST));
+        keywordMap.put("whitelist", new 
Integer(SqlParserSymbols.KW_WHITELIST));
         keywordMap.put("with", new Integer(SqlParserSymbols.KW_WITH));
         keywordMap.put("work", new Integer(SqlParserSymbols.KW_WORK));
         keywordMap.put("write", new Integer(SqlParserSymbols.KW_WRITE));
         keywordMap.put("year", new Integer(SqlParserSymbols.KW_YEAR));
-        keywordMap.put("||", new Integer(SqlParserSymbols.KW_PIPE));
-        keywordMap.put("current_timestamp", new 
Integer(SqlParserSymbols.KW_CURRENT_TIMESTAMP));
-        keywordMap.put("not_null", new Integer(SqlParserSymbols.KW_NOT_NULL));
-        keywordMap.put("catalog", new Integer(SqlParserSymbols.KW_CATALOG));
-        keywordMap.put("catalogs", new Integer(SqlParserSymbols.KW_CATALOGS));
-        keywordMap.put("switch", new Integer(SqlParserSymbols.KW_SWITCH));
    }
     
   // map from token id to token description


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

Reply via email to