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

morrysnow 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 9ffb060ac78 [opt](Nereids) support create statement syntax in Nereids 
(#39427)
9ffb060ac78 is described below

commit 9ffb060ac78550566f98a055ff363fe41dd81f3d
Author: morrySnow <[email protected]>
AuthorDate: Fri Aug 16 18:56:29 2024 +0800

    [opt](Nereids) support create statement syntax in Nereids (#39427)
---
 .../antlr4/org/apache/doris/nereids/DorisLexer.g4  |   5 +
 .../antlr4/org/apache/doris/nereids/DorisParser.g4 | 122 ++++++++++++++++++++-
 .../apache/doris/analysis/CreateCatalogStmt.java   |   2 +-
 .../doris/analysis/CreateDataSyncJobStmt.java      |   2 +-
 .../org/apache/doris/analysis/CreateDbStmt.java    |   2 +-
 .../doris/analysis/CreateEncryptKeyStmt.java       |   2 +-
 .../org/apache/doris/analysis/CreateFileStmt.java  |   2 +-
 .../apache/doris/analysis/CreateFunctionStmt.java  |   2 +-
 .../doris/analysis/CreateMaterializedViewStmt.java |   2 +-
 .../apache/doris/analysis/CreatePolicyStmt.java    |   2 +-
 .../doris/analysis/CreateRepositoryStmt.java       |   2 +-
 .../apache/doris/analysis/CreateResourceStmt.java  |   2 +-
 .../doris/analysis/CreateSqlBlockRuleStmt.java     |   2 +-
 .../org/apache/doris/analysis/CreateStageStmt.java |   2 +-
 .../doris/analysis/CreateStorageVaultStmt.java     |   2 +-
 .../org/apache/doris/analysis/CreateUserStmt.java  |   2 +-
 .../doris/analysis/CreateWorkloadGroupStmt.java    |   2 +-
 .../analysis/CreateWorkloadSchedPolicyStmt.java    |   2 +-
 .../java/org/apache/doris/analysis/EmptyStmt.java  |   2 +-
 .../doris/nereids/parser/LogicalPlanBuilder.java   |  14 ++-
 .../java/org/apache/doris/qe/ConnectProcessor.java |   1 +
 .../doris/nereids/parser/NereidsParserTest.java    |  54 +++++++++
 22 files changed, 204 insertions(+), 26 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 03c41c43d25..f21c8b94614 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
@@ -93,6 +93,7 @@ LEFT_PAREN: '(';
 RIGHT_PAREN: ')';
 COMMA: ',';
 DOT: '.';
+DOTDOTDOT: '...';
 LEFT_BRACKET: '[';
 RIGHT_BRACKET: ']';
 LEFT_BRACE: '{';
@@ -106,6 +107,7 @@ RIGHT_BRACE: '}';
 //--DORIS-KEYWORD-LIST-START
 ACCOUNT_LOCK: 'ACCOUNT_LOCK';
 ACCOUNT_UNLOCK: 'ACCOUNT_UNLOCK';
+ACTIONS: 'ACTIONS';
 ADD: 'ADD';
 ADDDATE:'ADDDATE';
 ADMIN: 'ADMIN';
@@ -180,6 +182,7 @@ COMMITTED: 'COMMITTED';
 COMPACT: 'COMPACT';
 COMPLETE: 'COMPLETE';
 COMPRESS_TYPE: 'COMPRESS_TYPE';
+CONDITIONS: 'CONDITIONS';
 CONFIG: 'CONFIG';
 CONNECTION: 'CONNECTION';
 CONNECTION_ID: 'CONNECTION_ID';
@@ -500,6 +503,7 @@ SERIALIZABLE: 'SERIALIZABLE';
 SESSION: 'SESSION';
 SET: 'SET';
 SETS: 'SETS';
+SET_SESSION_VARIABLE: 'SET_SESSION_VARIABLE';
 SHAPE: 'SHAPE';
 SHOW: 'SHOW';
 SIGNED: 'SIGNED';
@@ -510,6 +514,7 @@ SONAME: 'SONAME';
 SPLIT: 'SPLIT';
 SQL: 'SQL';
 SQL_BLOCK_RULE: 'SQL_BLOCK_RULE';
+STAGE: 'STAGE';
 STAGES: 'STAGES';
 START: 'START';
 STARTS: 'STARTS';
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 53745e23cc6..2dd10b990ef 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
@@ -26,11 +26,11 @@ options { tokenVocab = DorisLexer; }
 }
 
 multiStatements
-    : SEMICOLON* statement (SEMICOLON+ statement)* SEMICOLON* EOF
+    : SEMICOLON* statement? (SEMICOLON+ statement)* SEMICOLON* EOF
     ;
 
 singleStatement
-    : SEMICOLON* statement SEMICOLON* EOF
+    : SEMICOLON* statement? SEMICOLON* EOF
     ;
 
 statement
@@ -60,6 +60,7 @@ unsupportedStatement
     | unsupportedDmlStatement
     | unsupportedKillStatement
     | unsupportedDescribeStatement
+    | unsupportedCreateStatement
     ;
 
 materailizedViewStatement
@@ -162,6 +163,109 @@ supportedDropStatement
     : DROP CATALOG RECYCLE BIN WHERE idType=STRING_LITERAL EQ id=INTEGER_VALUE 
#dropCatalogRecycleBin
     ;
 
+unsupportedCreateStatement
+    : CREATE (DATABASE | SCHEMA) (IF NOT EXISTS)? name=multipartIdentifier
+        properties=propertyClause?                                             
 #createDatabase
+    | CREATE CATALOG (IF NOT EXISTS)? catalogName=identifier
+        (WITH RESOURCE resourceName=identifier)?
+        (COMMENT STRING_LITERAL)? properties=propertyClause?                   
 #createCatalog
+    | CREATE (GLOBAL | SESSION | LOCAL)?
+        (TABLES | AGGREGATE)? FUNCTION (IF NOT EXISTS)?
+        functionIdentifier LEFT_PAREN functionArguments? RIGHT_PAREN
+        RETURNS returnType=dataType (INTERMEDIATE intermediateType=dataType)?
+        properties=propertyClause?                                             
 #createUserDefineFunction
+    | CREATE (GLOBAL | SESSION | LOCAL)? ALIAS FUNCTION (IF NOT EXISTS)?
+        functionIdentifier LEFT_PAREN functionArguments? RIGHT_PAREN
+        WITH PARAMETER LEFT_PAREN parameters=identifierSeq? RIGHT_PAREN
+        AS expression                                                          
 #createAliasFunction
+    | CREATE USER (IF NOT EXISTS)? grantUserIdentify
+        (SUPERUSER | DEFAULT ROLE role=STRING_LITERAL)?
+        passwordOption (COMMENT STRING_LITERAL)?                               
 #createUser
+    | CREATE (READ ONLY)? REPOSITORY name=identifier WITH storageBackend       
 #createRepository
+    | CREATE ROLE (IF NOT EXISTS)? name=identifier (COMMENT STRING_LITERAL)?   
 #createRole
+    | CREATE FILE name=STRING_LITERAL
+        ((FROM | IN) database=identifier)? properties=propertyClause           
 #createFile
+    | CREATE INDEX (IF NOT EXISTS)? name=identifier
+        ON tableName=multipartIdentifier identifierList
+        (USING (BITMAP | NGRAM_BF | INVERTED))?
+        properties=propertyClause? (COMMENT STRING_LITERAL)?                   
 #createIndex
+    | CREATE EXTERNAL? RESOURCE (IF NOT EXISTS)?
+        name=identifierOrText properties=propertyClause?                       
 #createResource
+    | CREATE STORAGE VAULT (IF NOT EXISTS)?
+        name=identifierOrText properties=propertyClause?                       
 #createStorageVault
+    | CREATE WORKLOAD GROUP (IF NOT EXISTS)?
+        name=identifierOrText properties=propertyClause?                       
 #createWorkloadGroup
+    | CREATE WORKLOAD POLICY (IF NOT EXISTS)? name=identifierOrText
+        (CONDITIONS LEFT_PAREN workloadPolicyConditions RIGHT_PAREN)?
+        (ACTIONS LEFT_PAREN workloadPolicyActions RIGHT_PAREN)?
+        properties=propertyClause?                                             
 #createWorkloadPolicy
+    | CREATE ENCRYPTKEY (IF NOT EXISTS)? multipartIdentifier AS STRING_LITERAL 
 #createEncryptkey
+    | CREATE SYNC dbName=identifier DOT jobName=identifierOrText
+        LEFT_PAREN channelDescriptions RIGHT_PAREN
+        FROM BINLOG LEFT_PAREN propertyItemList RIGHT_PAREN
+        properties=propertyClause?                                             
 #createDataSyncJob
+    | CREATE SQL_BLOCK_RULE (IF NOT EXISTS)?
+        name=identifier properties=propertyClause?                             
 #createSqlBlockRule
+    | CREATE STORAGE POLICY (IF NOT EXISTS)?
+        name=identifier properties=propertyClause?                             
 #createStoragePolicy
+    | BUILD INDEX name=identifier ON tableName=multipartIdentifier
+        partitionSpec?                                                         
 #buildIndex
+    | CREATE STAGE (IF NOT EXISTS)? name=identifier properties=propertyClause? 
 #createStage
+    ;
+
+channelDescriptions
+    : channelDescription (COMMA channelDescription)*
+    ;
+
+channelDescription
+    : FROM source=multipartIdentifier INTO destination=multipartIdentifier
+        partitionSpec? columnList=identifierList?
+    ;
+
+workloadPolicyActions
+    : workloadPolicyAction (COMMA workloadPolicyAction)*
+    ;
+
+workloadPolicyAction
+    : SET_SESSION_VARIABLE STRING_LITERAL
+    | identifier (STRING_LITERAL)?
+    ;
+
+workloadPolicyConditions
+    : workloadPolicyCondition (COMMA workloadPolicyCondition)*
+    ;
+
+workloadPolicyCondition
+    : metricName=identifier comparisonOperator (number | STRING_LITERAL)
+    ;
+
+storageBackend
+    : (BROKER | S3 | HDFS | LOCAL) brokerName=identifier?
+        ON LOCATION STRING_LITERAL properties=propertyClause?
+    ;
+
+passwordOption
+    : (PASSWORD_HISTORY (historyDefault=DEFAULT | historyValue=INTEGER_VALUE))?
+        (PASSWORD_EXPIRE (expireDefault=DEFAULT | expireNever=NEVER
+            | INTERVAL expireValue=INTEGER_VALUE expireTimeUnit=(DAY | HOUR | 
SECOND)))?
+        (PASSWORD_REUSE INTERVAL (reuseDefault=DEFAULT | 
reuseValue=INTEGER_VALUE DAY))?
+        (FAILED_LOGIN_ATTEMPTS attemptsValue=INTEGER_VALUE)?
+        (PASSWORD_LOCK_TIME (lockUnbounded=UNBOUNDED
+            | lockValue=INTEGER_VALUE lockTimeUint=(DAY | HOUR | SECOND)))?
+        (ACCOUNT_LOCK | ACCOUNT_UNLOCK)?
+    ;
+
+functionArguments
+    : functionArgument (COMMA functionArgument)*
+    ;
+
+functionArgument
+    : DOTDOTDOT
+    | dataType
+    ;
+
+
+
 unsupportedSetStatement
     : SET (optionWithType | optionWithoutType)
         (COMMA (optionWithType | optionWithoutType))*                     
#setOptions
@@ -322,6 +426,10 @@ userIdentify
     : user=identifierOrText (ATSIGN (host=identifierOrText | LEFT_PAREN 
host=identifierOrText RIGHT_PAREN))?
     ;
 
+grantUserIdentify
+    : userIdentify (IDENTIFIED BY PASSWORD? STRING_LITERAL)?
+    ;
+
 explain
     : explainCommand planType?
           level=(VERBOSE | TREE | GRAPH | PLAN)?
@@ -1007,8 +1115,8 @@ dataType
       (COMMA INTEGER_VALUE)* RIGHT_PAREN)?                          
#primitiveDataType
     ;
 
-primitiveColType:
-    | type=TINYINT
+primitiveColType
+    : type=TINYINT
     | type=SMALLINT
     | type=(INT | INTEGER)
     | type=BIGINT
@@ -1107,7 +1215,8 @@ number
 // TODO: need to stay consistent with the legacy
 nonReserved
 //--DEFAULT-NON-RESERVED-START
-    : ADDDATE
+    : ACTIONS
+    | ADDDATE
     | AFTER
     | AGG_STATE
     | AGGREGATE
@@ -1158,6 +1267,7 @@ nonReserved
     | COMPACT
     | COMPLETE
     | COMPRESS_TYPE
+    | CONDITIONS
     | CONFIG
     | CONNECTION
     | CONNECTION_ID
@@ -1365,6 +1475,7 @@ nonReserved
     | SCHEMA
     | SECOND
     | SERIALIZABLE
+    | SET_SESSION_VARIABLE
     | SEQUENCE
     | SESSION
     | SHAPE
@@ -1373,6 +1484,7 @@ nonReserved
     | SONAME
     | SPLIT
     | SQL
+    | STAGE
     | STAGES
     | START
     | STARTS
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateCatalogStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateCatalogStmt.java
index 59a59522acf..f4c0360f9c3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateCatalogStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateCatalogStmt.java
@@ -40,7 +40,7 @@ import java.util.Map;
 /**
  * Statement for create a new catalog.
  */
-public class CreateCatalogStmt extends DdlStmt {
+public class CreateCatalogStmt extends DdlStmt implements NotFallbackInParser {
     public static final String CREATE_TIME_PROP = "create_time";
     private final boolean ifNotExists;
     private final String catalogName;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDataSyncJobStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDataSyncJobStmt.java
index dd7103b463d..157dd7277b9 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDataSyncJobStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDataSyncJobStmt.java
@@ -49,7 +49,7 @@ import java.util.Map;
 //      binlog_desc:
 //          FROM BINLOG
 //          (key1=value1, ...)
-public class CreateDataSyncJobStmt extends DdlStmt {
+public class CreateDataSyncJobStmt extends DdlStmt implements 
NotFallbackInParser {
     private String jobName;
     private String dbName;
     private DataSyncJobType dataSyncJobType;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDbStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDbStmt.java
index ad17ccd23ba..917784d25ca 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDbStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDbStmt.java
@@ -32,7 +32,7 @@ import org.apache.commons.lang3.StringUtils;
 import java.util.HashMap;
 import java.util.Map;
 
-public class CreateDbStmt extends DdlStmt {
+public class CreateDbStmt extends DdlStmt implements NotFallbackInParser {
     private boolean ifNotExists;
     private String ctlName;
     private String dbName;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateEncryptKeyStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateEncryptKeyStmt.java
index a7380865a44..0d10c7c8858 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateEncryptKeyStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateEncryptKeyStmt.java
@@ -40,7 +40,7 @@ import com.google.common.base.Strings;
  * for example:
  *     CREATE ENCRYPTKEY test.key1 AS "beijing";
  */
-public class CreateEncryptKeyStmt extends DdlStmt {
+public class CreateEncryptKeyStmt extends DdlStmt implements 
NotFallbackInParser {
     private final boolean ifNotExists;
     private final EncryptKeyName encryptKeyName;
     private final String keyString;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFileStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFileStmt.java
index 11d2bf846e1..8ce3b021899 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFileStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFileStmt.java
@@ -32,7 +32,7 @@ import com.google.common.collect.ImmutableSet;
 import java.util.Map;
 import java.util.Optional;
 
-public class CreateFileStmt extends DdlStmt {
+public class CreateFileStmt extends DdlStmt implements NotFallbackInParser {
     public static final String PROP_CATALOG_DEFAULT = "DEFAULT";
     private static final String PROP_CATALOG = "catalog";
     private static final String PROP_URL = "url";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
index a45b7901fec..4a38d06ffe2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
@@ -72,7 +72,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 // create a user define function
-public class CreateFunctionStmt extends DdlStmt {
+public class CreateFunctionStmt extends DdlStmt implements NotFallbackInParser 
{
     @Deprecated
     public static final String OBJECT_FILE_KEY = "object_file";
     public static final String FILE_KEY = "file";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
index 3a6a9718c72..0e768ad3a95 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
@@ -67,7 +67,7 @@ import java.util.Set;
  * ORDER BY column_name[, column_name ...])
  * [PROPERTIES ("key" = "value")]
  */
-public class CreateMaterializedViewStmt extends DdlStmt {
+public class CreateMaterializedViewStmt extends DdlStmt implements 
NotFallbackInParser {
     private static final Logger LOG = 
LogManager.getLogger(CreateMaterializedViewStmt.class);
 
     public static final String MATERIALIZED_VIEW_NAME_PREFIX = "mv_";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreatePolicyStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreatePolicyStmt.java
index 98c71d10c16..9905fd03ee1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreatePolicyStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreatePolicyStmt.java
@@ -37,7 +37,7 @@ import java.util.Map;
  * syntax:
  * CREATE ROW POLICY [IF NOT EXISTS] test_row_policy ON test_table AS 
{PERMISSIVE|RESTRICTIVE} TO user USING (a = ’xxx‘)
  */
-public class CreatePolicyStmt extends DdlStmt {
+public class CreatePolicyStmt extends DdlStmt implements NotFallbackInParser {
 
     @Getter
     private final PolicyTypeEnum type;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateRepositoryStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateRepositoryStmt.java
index 618b5a7d05b..1e8ebb22bd0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateRepositoryStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateRepositoryStmt.java
@@ -27,7 +27,7 @@ import org.apache.doris.qe.ConnectContext;
 
 import java.util.Map;
 
-public class CreateRepositoryStmt extends DdlStmt {
+public class CreateRepositoryStmt extends DdlStmt implements 
NotFallbackInParser {
     private boolean isReadOnly;
     private String name;
     private StorageBackend storage;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateResourceStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateResourceStmt.java
index 08730723431..210c034300e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateResourceStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateResourceStmt.java
@@ -33,7 +33,7 @@ import java.util.Map;
 
 // CREATE [EXTERNAL] RESOURCE resource_name
 // PROPERTIES (key1 = value1, ...)
-public class CreateResourceStmt extends DdlStmt {
+public class CreateResourceStmt extends DdlStmt implements NotFallbackInParser 
{
     private static final String TYPE = "type";
 
     private final boolean isExternal;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateSqlBlockRuleStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateSqlBlockRuleStmt.java
index f50a339991c..7e1813ef32b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateSqlBlockRuleStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateSqlBlockRuleStmt.java
@@ -49,7 +49,7 @@ import java.util.regex.Pattern;
       )
 */
 @Getter
-public class CreateSqlBlockRuleStmt extends DdlStmt {
+public class CreateSqlBlockRuleStmt extends DdlStmt implements 
NotFallbackInParser {
 
     public static final String SQL_PROPERTY = "sql";
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateStageStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateStageStmt.java
index 4054584805a..432ebae8bf2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateStageStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateStageStmt.java
@@ -50,7 +50,7 @@ import java.util.UUID;
 /**
  * Create stage.
  */
-public class CreateStageStmt extends DdlStmt {
+public class CreateStageStmt extends DdlStmt implements NotFallbackInParser {
     private static final Logger LOG = 
LogManager.getLogger(CreateStageStmt.class);
 
     @Getter
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateStorageVaultStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateStorageVaultStmt.java
index e7e7863bde6..f1aff6b9ab6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateStorageVaultStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateStorageVaultStmt.java
@@ -35,7 +35,7 @@ import java.util.Map;
 
 // CREATE STORAGE VAULT vault_name
 // PROPERTIES (key1 = value1, ...)
-public class CreateStorageVaultStmt extends DdlStmt {
+public class CreateStorageVaultStmt extends DdlStmt implements 
NotFallbackInParser {
     private static final String TYPE = "type";
 
     private static final String PATH_VERSION = "path_version";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateUserStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateUserStmt.java
index e29a82f2e5f..74ca252779e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateUserStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateUserStmt.java
@@ -51,7 +51,7 @@ import java.util.UUID;
  * 3. create user user@xx [identified by 'password'] role role_name
  *      not only create the specified user, but also grant all privs of the 
specified role to the user.
  */
-public class CreateUserStmt extends DdlStmt {
+public class CreateUserStmt extends DdlStmt implements NotFallbackInParser {
     private static final Logger LOG = 
LogManager.getLogger(CreateUserStmt.class);
 
     private boolean ifNotExist;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateWorkloadGroupStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateWorkloadGroupStmt.java
index 9c8efcf1d1f..fc4f99046d5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateWorkloadGroupStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateWorkloadGroupStmt.java
@@ -30,7 +30,7 @@ import org.apache.doris.resource.workloadgroup.WorkloadGroup;
 
 import java.util.Map;
 
-public class CreateWorkloadGroupStmt extends DdlStmt {
+public class CreateWorkloadGroupStmt extends DdlStmt implements 
NotFallbackInParser {
 
     private final boolean ifNotExists;
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateWorkloadSchedPolicyStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateWorkloadSchedPolicyStmt.java
index 455ca2c802e..3cb0cd1f1de 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateWorkloadSchedPolicyStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateWorkloadSchedPolicyStmt.java
@@ -31,7 +31,7 @@ import 
org.apache.doris.resource.workloadschedpolicy.WorkloadConditionMeta;
 import java.util.List;
 import java.util.Map;
 
-public class CreateWorkloadSchedPolicyStmt extends DdlStmt {
+public class CreateWorkloadSchedPolicyStmt extends DdlStmt implements 
NotFallbackInParser {
 
     private final boolean ifNotExists;
     private final String policyName;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/EmptyStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/EmptyStmt.java
index e3707036091..2180dc9c134 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/EmptyStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/EmptyStmt.java
@@ -18,7 +18,7 @@
 package org.apache.doris.analysis;
 
 // Used to represent query which only contain comments
-public class EmptyStmt extends UnsupportedStmt {
+public class EmptyStmt extends UnsupportedStmt implements NotFallbackInParser {
     @Override
     public RedirectStatus getRedirectStatus() {
         return RedirectStatus.NO_FORWARD;
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 2170b552a5c..d1890a0333b 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
@@ -631,9 +631,15 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
     }
 
     @Override
-    public CreateMTMVCommand visitCreateMTMV(CreateMTMVContext ctx) {
-        List<String> nameParts = visitMultipartIdentifier(ctx.mvName);
+    public Command visitCreateMTMV(CreateMTMVContext ctx) {
+        if (ctx.buildMode() == null && ctx.refreshMethod() == null && 
ctx.refreshTrigger() == null
+                && ctx.cols == null && ctx.keys == null
+                && ctx.HASH() == null && ctx.RANDOM() == null && ctx.BUCKETS() 
== null) {
+            // TODO support create sync mv
+            return new UnsupportedCommand();
+        }
 
+        List<String> nameParts = visitMultipartIdentifier(ctx.mvName);
         BuildMode buildMode = visitBuildMode(ctx.buildMode());
         RefreshMethod refreshMethod = visitRefreshMethod(ctx.refreshMethod());
         MTMVRefreshTriggerInfo refreshTriggerInfo = 
visitRefreshTrigger(ctx.refreshTrigger());
@@ -644,11 +650,11 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
         if (ctx.INTEGER_VALUE() != null) {
             bucketNum = Integer.parseInt(ctx.INTEGER_VALUE().getText());
         }
-        DistributionDescriptor desc = null;
+        DistributionDescriptor desc;
         if (ctx.HASH() != null) {
             desc = new DistributionDescriptor(true, ctx.AUTO() != null, 
bucketNum,
                     visitIdentifierList(ctx.hashKeys));
-        } else if (ctx.RANDOM() != null) {
+        } else {
             desc = new DistributionDescriptor(false, ctx.AUTO() != null, 
bucketNum, null);
         }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
index 6bcc02f35e0..dac1b5785b8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
@@ -326,6 +326,7 @@ public abstract class ConnectProcessor {
         if (mysqlCommand == MysqlCommand.COM_QUERY
                 && ctx.getSessionVariable().isEnableNereidsPlanner()
                 && !ctx.getSessionVariable().enableFallbackToOriginalPlanner
+                && !stmts.isEmpty()
                 && stmts.stream().allMatch(s -> s instanceof 
NotFallbackInParser)) {
             String errMsg;
             Throwable exception = null;
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
index 4b4d30d4cd7..b7f9dcae9db 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
@@ -591,4 +591,58 @@ public class NereidsParserTest extends ParserTestBase {
         sql = "describe function tvf('a' = 'b') as tvf";
         nereidsParser.parseSingle(sql);
     }
+
+    @Test
+    public void testCreateDatabase() {
+        NereidsParser nereidsParser = new NereidsParser();
+        String sql = "create database if not exists a properties('k'='v')";
+        nereidsParser.parseSingle(sql);
+
+        sql = "create schema ctl.db";
+        nereidsParser.parseSingle(sql);
+    }
+
+    @Test
+    public void testCreateCatalog() {
+        NereidsParser nereidsParser = new NereidsParser();
+        String sql = "create catalog if not exists ctl";
+        nereidsParser.parseSingle(sql);
+
+        sql = "create catalog ctl with resource rsc comment '' 
properties('k'='v')";
+        nereidsParser.parseSingle(sql);
+    }
+
+    @Test
+    public void testCreateFunction() {
+        NereidsParser nereidsParser = new NereidsParser();
+        String sql = "create session tables function func_a (int, ...) returns 
boolean properties('k'='v')";
+        nereidsParser.parseSingle(sql);
+
+        sql = "create local aggregate function func_a (int, ...) returns 
boolean intermediate varchar properties('k'='v')";
+        nereidsParser.parseSingle(sql);
+
+        sql = "create alias function func_a (int) with parameter(id) as 
abs(id)";
+        nereidsParser.parseSingle(sql);
+    }
+
+    @Test
+    public void testCreateUser() {
+        NereidsParser nereidsParser = new NereidsParser();
+        String sql = "create user a superuser comment 'create user'";
+        nereidsParser.parseSingle(sql);
+    }
+
+    @Test
+    public void testCreateRepository() {
+        NereidsParser nereidsParser = new NereidsParser();
+        String sql = "create repository a with S3 on location 's3://xxx' 
properties('k'='v')";
+        nereidsParser.parseSingle(sql);
+    }
+
+    @Test
+    public void testCreateRole() {
+        NereidsParser nereidsParser = new NereidsParser();
+        String sql = "create role a comment 'create user'";
+        nereidsParser.parseSingle(sql);
+    }
 }


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

Reply via email to