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

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


The following commit(s) were added to refs/heads/master by this push:
     new 8061940  fix the create user syntax of MySQL (#9395)
8061940 is described below

commit 806194001c61b94f6682a03601e67cefa3f3255c
Author: JingShang Lu <[email protected]>
AuthorDate: Mon Feb 8 23:58:53 2021 -0800

    fix the create user syntax of MySQL (#9395)
    
    * fix the create user syntax of MySQL and add the definition of MySQL 
create user statement
    
    * code format
    
    * fix
    
    * code format
    
    * code format
---
 .../src/main/antlr4/imports/mysql/DCLStatement.g4  |  20 +-
 .../impl/MySQLDCLStatementSQLVisitor.java          | 273 ++++++++++++++++++++-
 .../mysql/dcl/MySQLCreateUserStatement.java        |  21 ++
 .../ACLAttributeEnum.java}                         |  14 +-
 .../mysql/segment/PasswordOrLockOptionSegment.java |  65 +++++
 .../SSLTypeEnum.java}                              |  22 +-
 .../TLSOptionSegment.java}                         |  30 ++-
 .../UserResourceSegment.java}                      |  30 ++-
 .../UserResourceSpecifiedLimitEnum.java}           |  20 +-
 .../UserSegment.java}                              |  46 +++-
 10 files changed, 479 insertions(+), 62 deletions(-)

diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
index a184a6f..37e3707 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
@@ -100,7 +100,21 @@ privilegeLevel
     ;
 
 createUser
-    : CREATE USER (IF NOT EXISTS)? alterUserList defaultRoleClause? 
requireClause? connectOptions? accountLockPasswordExpireOptions?
+    : CREATE USER (IF NOT EXISTS)? createUserList defaultRoleClause? 
requireClause? connectOptions? accountLockPasswordExpireOptions?
+    ;
+
+createUserEntry
+    : userName # createUserEntryNoOption
+    | userName IDENTIFIED BY string_ # createUserEntryIdentifiedBy
+    | userName IDENTIFIED BY RANDOM PASSWORD # createUserEntryIdentifiedBy
+    | userName IDENTIFIED WITH textOrIdentifier # createUserEntryIdentifiedWith
+    | userName IDENTIFIED WITH textOrIdentifier AS string_ # 
createUserEntryIdentifiedWith
+    | userName IDENTIFIED WITH textOrIdentifier BY string_ # 
createUserEntryIdentifiedWith
+    | userName IDENTIFIED WITH textOrIdentifier BY RANDOM PASSWORD # 
createUserEntryIdentifiedWith
+    ;
+
+createUserList
+    : createUserEntry (COMMA_ createUserEntry)*
     ;
 
 defaultRoleClause
@@ -108,7 +122,7 @@ defaultRoleClause
     ;
 
 requireClause
-    : REQUIRE (NONE | tlsOption (AND? tlsOption)*)
+    : REQUIRE (NONE | SSL | X509 | tlsOption (AND? tlsOption)*)
     ;
 
 connectOptions
@@ -215,7 +229,7 @@ connectOption
     ;
 
 tlsOption
-    : SSL | X509 | CIPHER string_ | ISSUER string_ | SUBJECT string_
+    : CIPHER string_ | ISSUER string_ | SUBJECT string_
     ;
 
 userFuncAuthOption
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDCLStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDCLStatementSQLVisitor.java
index 8f0817e..60d32c6 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDCLStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDCLStatementSQLVisitor.java
@@ -18,23 +18,37 @@
 package org.apache.shardingsphere.sql.parser.mysql.visitor.statement.impl;
 
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.sql.parser.api.visitor.operation.SQLStatementVisitor;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+import 
org.apache.shardingsphere.sql.parser.api.visitor.operation.SQLStatementVisitor;
 import org.apache.shardingsphere.sql.parser.api.visitor.type.DCLSQLVisitor;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AccountLockPasswordExpireOptionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AccountLockPasswordExpireOptionsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterUserContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ConnectOptionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ConnectOptionsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateRoleContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateUserContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateUserEntryContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateUserEntryIdentifiedByContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateUserEntryIdentifiedWithContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateUserEntryNoOptionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropRoleContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropUserContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GrantContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.PrivilegeClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RenameUserContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RequireClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RevokeContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RoleNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetDefaultRoleContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetPasswordContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetRoleContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableNameContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TlsOptionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.UserNameContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.NumberLiteralValue;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLAlterUserStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLCreateRoleStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLCreateUserStatement;
@@ -46,6 +60,13 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQ
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLSetDefaultRoleStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLSetPasswordStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLSetRoleStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.ACLAttributeEnum;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.PasswordOrLockOptionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.SSLTypeEnum;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.TLSOptionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserResourceSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserResourceSpecifiedLimitEnum;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserSegment;
 
 import java.util.Optional;
 import java.util.Properties;
@@ -88,7 +109,255 @@ public final class MySQLDCLStatementSQLVisitor extends 
MySQLStatementSQLVisitor
     
     @Override
     public ASTNode visitCreateUser(final CreateUserContext ctx) {
-        return new MySQLCreateUserStatement();
+        MySQLCreateUserStatement result = new MySQLCreateUserStatement();
+        for (CreateUserEntryContext each : 
ctx.createUserList().createUserEntry()) {
+            result.getUsers().add((UserSegment) visit(each));
+        }
+        if (null != ctx.defaultRoleClause()) {
+            for (RoleNameContext each : ctx.defaultRoleClause().roleName()) {
+                result.getDefaultRoles().add(each.getText());
+            }
+        }
+        if (null != ctx.requireClause()) {
+            result.setTlsOptionSegment((TLSOptionSegment) 
visit(ctx.requireClause()));
+        }
+        if (null != ctx.connectOptions()) {
+            result.setUserResource((UserResourceSegment) 
visit(ctx.connectOptions()));
+        }
+        if (null != ctx.accountLockPasswordExpireOptions()) {
+            result.setPasswordOrLockOption((PasswordOrLockOptionSegment) 
visit(ctx.accountLockPasswordExpireOptions()));
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitRequireClause(final RequireClauseContext ctx) {
+        TLSOptionSegment result = new TLSOptionSegment();
+        if (null != ctx.NONE()) {
+            result.setType(SSLTypeEnum.SSL_TYPE_NONE);
+        } else if (null != ctx.X509()) {
+            result.setType(SSLTypeEnum.SSL_TYPE_X509);
+        } else if (null != ctx.SSL()) {
+            result.setType(SSLTypeEnum.SSL_TYPE_ANY);
+        } else {
+            result.setType(SSLTypeEnum.SSL_TYPE_SPECIFIED);
+            for (TlsOptionContext each : ctx.tlsOption()) {
+                if (null != each.SUBJECT()) {
+                    result.setX509Subject(each.string_().getText());
+                } else if (null != each.ISSUER()) {
+                    result.setX509Issuer(each.string_().getText());
+                } else if (null != each.CIPHER()) {
+                    result.setX509Cipher(each.string_().getText());
+                }
+            }
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitConnectOptions(final ConnectOptionsContext ctx) {
+        UserResourceSegment result = new UserResourceSegment();
+        result.setStartIndex(ctx.start.getStartIndex());
+        result.setStopIndex(ctx.stop.getStopIndex());
+        for (ConnectOptionContext each : ctx.connectOption()) {
+            if (null != each.MAX_QUERIES_PER_HOUR()) {
+                
result.setSpecifiedLimits(UserResourceSpecifiedLimitEnum.QUERIES_PER_HOUR);
+                result.setQuestions(new 
NumberLiteralValue(each.NUMBER_().getText()).getValue().intValue());
+            }
+            if (null != each.MAX_UPDATES_PER_HOUR()) {
+                
result.setSpecifiedLimits(UserResourceSpecifiedLimitEnum.UPDATES_PER_HOUR);
+                result.setUpdates(new 
NumberLiteralValue(each.NUMBER_().getText()).getValue().intValue());
+            }
+            if (null != each.MAX_CONNECTIONS_PER_HOUR()) {
+                
result.setSpecifiedLimits(UserResourceSpecifiedLimitEnum.CONNECTIONS_PER_HOUR);
+                result.setConnPerHour(new 
NumberLiteralValue(each.NUMBER_().getText()).getValue().intValue());
+            }
+            if (null != each.MAX_USER_CONNECTIONS()) {
+                
result.setSpecifiedLimits(UserResourceSpecifiedLimitEnum.USER_CONNECTIONS);
+                result.setUserConn(new 
NumberLiteralValue(each.NUMBER_().getText()).getValue().intValue());
+            }
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitCreateUserEntryNoOption(final 
CreateUserEntryNoOptionContext ctx) {
+        UserSegment result = (UserSegment) visit(ctx.userName());
+        result.setStartIndex(ctx.start.getStartIndex());
+        result.setStopIndex(ctx.stop.getStopIndex());
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitCreateUserEntryIdentifiedBy(final 
CreateUserEntryIdentifiedByContext ctx) {
+        UserSegment result = (UserSegment) visit(ctx.userName());
+        result.setStartIndex(ctx.start.getStartIndex());
+        result.setStopIndex(ctx.stop.getStopIndex());
+        if (null != ctx.string_()) {
+            result.setAuth(ctx.string_().getText());
+            result.setHasPasswordGenerator(false);
+            result.setUsesIdentifiedByClause(true);
+            result.setDiscardOldPassword(false);
+        } else {
+            result.setHasPasswordGenerator(true);
+            result.setUsesIdentifiedByClause(true);
+            result.setDiscardOldPassword(false);
+            result.setUsesIdentifiedWithClause(false);
+        }
+        result.setRetainCurrentPassword(false);
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitCreateUserEntryIdentifiedWith(final 
CreateUserEntryIdentifiedWithContext ctx) {
+        UserSegment result = (UserSegment) visit(ctx.userName());
+        result.setStartIndex(ctx.start.getStartIndex());
+        result.setStopIndex(ctx.stop.getStopIndex());
+        if (null != ctx.textOrIdentifier()) {
+            result.setPlugin(ctx.textOrIdentifier().getText());
+            result.setHasPasswordGenerator(false);
+            result.setUsesIdentifiedByClause(true);
+            result.setDiscardOldPassword(false);
+            result.setRetainCurrentPassword(false);
+        } else if (null != ctx.AS()) {
+            result.setPlugin(ctx.textOrIdentifier().getText());
+            result.setAuth(ctx.string_().getText());
+            result.setHasPasswordGenerator(false);
+            result.setUsesIdentifiedByClause(true);
+            result.setDiscardOldPassword(false);
+            result.setRetainCurrentPassword(false);
+        } else if (null != ctx.BY() && null != ctx.string_()) {
+            result.setPlugin(ctx.textOrIdentifier().getText());
+            result.setAuth(ctx.string_().getText());
+            result.setHasPasswordGenerator(false);
+            result.setUsesIdentifiedByClause(true);
+            result.setUsesIdentifiedWithClause(true);
+            result.setDiscardOldPassword(false);
+            result.setRetainCurrentPassword(false);
+        } else {
+            result.setPlugin(ctx.textOrIdentifier().getText());
+            result.setAuth(ctx.string_().getText());
+            result.setHasPasswordGenerator(true);
+            result.setUsesIdentifiedByClause(true);
+            result.setUsesIdentifiedWithClause(true);
+            result.setDiscardOldPassword(false);
+            result.setRetainCurrentPassword(false);
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitAccountLockPasswordExpireOptions(final 
AccountLockPasswordExpireOptionsContext ctx) {
+        PasswordOrLockOptionSegment result = new PasswordOrLockOptionSegment();
+        for (AccountLockPasswordExpireOptionContext each : 
ctx.accountLockPasswordExpireOption()) {
+            fillAccountLockPasswordExpireOption(result, each);
+        }
+        return result;
+    }
+    
+    private void fillAccountLockPasswordExpireOption(final 
PasswordOrLockOptionSegment segment, final 
AccountLockPasswordExpireOptionContext ctx) {
+        if (null != ctx.ACCOUNT()) {
+            fillAccountLock(segment, ctx);
+        } else if (null != ctx.PASSWORD() && null != ctx.EXPIRE()) {
+            fillPasswordExpire(segment, ctx);
+        } else if (null != ctx.PASSWORD() && null != ctx.HISTORY()) {
+            fillPasswordHistory(segment, ctx);
+        } else if (null != ctx.PASSWORD() && null != ctx.REUSE()) {
+            fillPasswordReuse(segment, ctx);
+        } else if (null != ctx.PASSWORD() && null != ctx.REQUIRE()) {
+            fillPasswordRequire(segment, ctx);
+        } else if (null != ctx.FAILED_LOGIN_ATTEMPTS()) {
+            segment.setUpdateFailedLoginAttempts(true);
+            segment.setFailedLoginAttempts(new 
NumberLiteralValue(ctx.NUMBER_().getText()).getValue().intValue());
+        } else {
+            if (null != ctx.UNBOUNDED()) {
+                segment.setUpdatePasswordLockTime(true);
+                segment.setPasswordLockTime(-1);
+            } else {
+                segment.setUpdatePasswordLockTime(true);
+                segment.setPasswordLockTime(new 
NumberLiteralValue(ctx.NUMBER_().getText()).getValue().intValue());
+            }
+        }
+    }
+    
+    private void fillAccountLock(final PasswordOrLockOptionSegment segment, 
final AccountLockPasswordExpireOptionContext ctx) {
+        if (null != ctx.LOCK()) {
+            segment.setUpdateAccountLockedColumn(true);
+            segment.setAccountLocked(true);
+        } else {
+            segment.setUpdateAccountLockedColumn(true);
+            segment.setAccountLocked(false);
+        }
+    }
+    
+    private void fillPasswordExpire(final PasswordOrLockOptionSegment segment, 
final AccountLockPasswordExpireOptionContext ctx) {
+        if (null != ctx.INTERVAL()) {
+            segment.setExpireAfterDays(new 
NumberLiteralValue(ctx.NUMBER_().getText()).getValue().intValue());
+            segment.setUpdatePasswordExpiredColumn(false);
+            segment.setUpdatePasswordExpiredFields(true);
+            segment.setUseDefaultPasswordLifeTime(false);
+        } else if (null != ctx.NEVER()) {
+            segment.setExpireAfterDays(0);
+            segment.setUpdatePasswordExpiredColumn(false);
+            segment.setUpdatePasswordExpiredFields(true);
+            segment.setUseDefaultPasswordLifeTime(false);
+        } else if (null != ctx.DEFAULT()) {
+            segment.setExpireAfterDays(0);
+            segment.setUpdatePasswordExpiredColumn(false);
+            segment.setUpdatePasswordExpiredFields(true);
+            segment.setUseDefaultPasswordLifeTime(true);
+        } else {
+            segment.setExpireAfterDays(0);
+            segment.setUpdatePasswordExpiredColumn(true);
+            segment.setUpdatePasswordExpiredFields(true);
+            segment.setUseDefaultPasswordLifeTime(true);
+        }
+    }
+    
+    private void fillPasswordHistory(final PasswordOrLockOptionSegment 
segment, final AccountLockPasswordExpireOptionContext ctx) {
+        if (null != ctx.DEFAULT()) {
+            segment.setPasswordHistoryLength(0);
+            segment.setUpdatePasswordHistory(true);
+            segment.setUseDefaultPasswordHistory(true);
+        } else {
+            segment.setPasswordHistoryLength(new 
NumberLiteralValue(ctx.NUMBER_().getText()).getValue().intValue());
+            segment.setUpdatePasswordHistory(true);
+            segment.setUseDefaultPasswordHistory(false);
+        }
+    }
+    
+    private void fillPasswordReuse(final PasswordOrLockOptionSegment segment, 
final AccountLockPasswordExpireOptionContext ctx) {
+        if (null != ctx.DEFAULT()) {
+            segment.setPasswordReuseInterval(0);
+            segment.setUpdatePasswordReuseInterval(true);
+            segment.setUseDefaultPasswordReuseInterval(true);
+        } else {
+            segment.setPasswordReuseInterval(new 
NumberLiteralValue(ctx.NUMBER_().getText()).getValue().intValue());
+            segment.setUpdatePasswordReuseInterval(true);
+            segment.setUseDefaultPasswordReuseInterval(false);
+        }
+    }
+    
+    private void fillPasswordRequire(final PasswordOrLockOptionSegment 
segment, final AccountLockPasswordExpireOptionContext ctx) {
+        if (null != ctx.DEFAULT()) {
+            segment.setUpdatePasswordRequireCurrent(ACLAttributeEnum.DEFAULT);
+        } else if (null != ctx.OPTIONAL()) {
+            segment.setUpdatePasswordRequireCurrent(ACLAttributeEnum.NO);
+        } else {
+            segment.setUpdatePasswordRequireCurrent(ACLAttributeEnum.YES);
+        }
+    }
+    
+    @Override
+    public ASTNode visitUserName(final UserNameContext ctx) {
+        UserSegment result = new UserSegment();
+        if (null != ctx.userIdentifierOrText()) {
+            result.setUser(new 
IdentifierValue(ctx.userIdentifierOrText().textOrIdentifier(0).getText()).getValue());
+            if (null != ctx.userIdentifierOrText().AT_()) {
+                result.setHost(new 
IdentifierValue(ctx.userIdentifierOrText().textOrIdentifier(1).getText()).getValue());
+            }
+        }
+        return result;
     }
     
     @Override
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
index 0610a63..f67d906 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
@@ -17,13 +17,34 @@
 
 package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
 
+import lombok.Getter;
+import lombok.Setter;
 import lombok.ToString;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.CreateUserStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.PasswordOrLockOptionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.TLSOptionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserResourceSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserSegment;
+
+import java.util.Collection;
+import java.util.LinkedList;
 
 /**
  * MySQL create user statement.
  */
 @ToString
+@Getter
+@Setter
 public final class MySQLCreateUserStatement extends CreateUserStatement 
implements MySQLStatement {
+    
+    private final Collection<UserSegment> users = new LinkedList<>();
+    
+    private Collection<String> defaultRoles = new LinkedList<>();
+    
+    private TLSOptionSegment tlsOptionSegment;
+    
+    private UserResourceSegment userResource;
+    
+    private PasswordOrLockOptionSegment passwordOrLockOption;
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/ACLAttributeEnum.java
similarity index 70%
copy from 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
copy to 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/ACLAttributeEnum.java
index 0610a63..6540a7b 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/ACLAttributeEnum.java
@@ -15,15 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
+package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment;
 
-import lombok.ToString;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.CreateUserStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
-
-/**
- * MySQL create user statement.
- */
-@ToString
-public final class MySQLCreateUserStatement extends CreateUserStatement 
implements MySQLStatement {
+public enum ACLAttributeEnum {
+    
+    UNCHANGED, DEFAULT, YES, NO
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/PasswordOrLockOptionSegment.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/PasswordOrLockOptionSegment.java
new file mode 100644
index 0000000..dd7718d
--- /dev/null
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/PasswordOrLockOptionSegment.java
@@ -0,0 +1,65 @@
+/*
+ * 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.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
+
+@Getter
+@Setter
+public final class PasswordOrLockOptionSegment implements SQLSegment {
+    
+    private int startIndex;
+    
+    private int stopIndex;
+    
+    private boolean updatePasswordExpiredFields;
+    
+    private boolean updatePasswordExpiredColumn;
+    
+    private boolean useDefaultPasswordLifeTime;
+    
+    private int expireAfterDays;
+    
+    private boolean updateAccountLockedColumn;
+    
+    private boolean accountLocked;
+    
+    private int passwordHistoryLength;
+    
+    private boolean useDefaultPasswordHistory;
+    
+    private boolean updatePasswordHistory;
+    
+    private int passwordReuseInterval;
+    
+    private boolean useDefaultPasswordReuseInterval;
+    
+    private boolean updatePasswordReuseInterval;
+    
+    private int failedLoginAttempts;
+    
+    private boolean updateFailedLoginAttempts;
+    
+    private int passwordLockTime;
+    
+    private boolean updatePasswordLockTime;
+    
+    private ACLAttributeEnum updatePasswordRequireCurrent;
+}
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/SSLTypeEnum.java
similarity index 70%
copy from 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
copy to 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/SSLTypeEnum.java
index 0610a63..a774075 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/SSLTypeEnum.java
@@ -15,15 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
+package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment;
 
-import lombok.ToString;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.CreateUserStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
-
-/**
- * MySQL create user statement.
- */
-@ToString
-public final class MySQLCreateUserStatement extends CreateUserStatement 
implements MySQLStatement {
+public enum SSLTypeEnum {
+    
+    SSL_TYPE_NOT_SPECIFIED,
+    
+    SSL_TYPE_NONE,
+    
+    SSL_TYPE_ANY,
+    
+    SSL_TYPE_X509,
+    
+    SSL_TYPE_SPECIFIED
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/TLSOptionSegment.java
similarity index 64%
copy from 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
copy to 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/TLSOptionSegment.java
index 0610a63..54e0bb5 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/TLSOptionSegment.java
@@ -15,15 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
+package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment;
 
-import lombok.ToString;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.CreateUserStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
 
-/**
- * MySQL create user statement.
- */
-@ToString
-public final class MySQLCreateUserStatement extends CreateUserStatement 
implements MySQLStatement {
+@RequiredArgsConstructor
+@Getter
+@Setter
+public final class TLSOptionSegment implements SQLSegment {
+    
+    private int startIndex;
+    
+    private int stopIndex;
+    
+    private SSLTypeEnum type;
+    
+    private String x509Subject;
+    
+    private String x509Issuer;
+    
+    private String x509Cipher;
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/UserResourceSegment.java
similarity index 64%
copy from 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
copy to 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/UserResourceSegment.java
index 0610a63..49beba5 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/UserResourceSegment.java
@@ -15,15 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
+package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment;
 
-import lombok.ToString;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.CreateUserStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
 
-/**
- * MySQL create user statement.
- */
-@ToString
-public final class MySQLCreateUserStatement extends CreateUserStatement 
implements MySQLStatement {
+@Getter
+@Setter
+public final class UserResourceSegment implements SQLSegment {
+    
+    private int startIndex;
+    
+    private int stopIndex;
+    
+    private int questions;
+    
+    private int updates;
+    
+    private int connPerHour;
+    
+    private int userConn;
+    
+    private UserResourceSpecifiedLimitEnum specifiedLimits;
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/UserResourceSpecifiedLimitEnum.java
similarity index 70%
copy from 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
copy to 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/UserResourceSpecifiedLimitEnum.java
index 0610a63..53ba212 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/UserResourceSpecifiedLimitEnum.java
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
+package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment;
 
-import lombok.ToString;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.CreateUserStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
-
-/**
- * MySQL create user statement.
- */
-@ToString
-public final class MySQLCreateUserStatement extends CreateUserStatement 
implements MySQLStatement {
+public enum UserResourceSpecifiedLimitEnum {
+    
+    QUERIES_PER_HOUR,
+    
+    UPDATES_PER_HOUR,
+    
+    CONNECTIONS_PER_HOUR,
+    
+    USER_CONNECTIONS
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/UserSegment.java
similarity index 51%
copy from 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
copy to 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/UserSegment.java
index 0610a63..ffe3004 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLCreateUserStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/UserSegment.java
@@ -15,15 +15,43 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
+package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment;
 
-import lombok.ToString;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.CreateUserStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
 
-/**
- * MySQL create user statement.
- */
-@ToString
-public final class MySQLCreateUserStatement extends CreateUserStatement 
implements MySQLStatement {
+@Getter
+@Setter
+public final class UserSegment implements SQLSegment {
+    
+    private int startIndex;
+    
+    private int stopIndex;
+    
+    private String user;
+    
+    private String host;
+    
+    private String plugin;
+    
+    private String auth;
+    
+    private String currentAuth;
+    
+    private boolean usesIdentifiedByClause;
+    
+    private boolean usesIdentifiedWithClause;
+    
+    private boolean usesAuthenticationStringClause;
+    
+    private boolean usesReplaceClause;
+    
+    private boolean retainCurrentPassword;
+    
+    private boolean discardOldPassword;
+    
+    private boolean hasPasswordGenerator;
+    
+    private PasswordOrLockOptionSegment alterStatus;
 }

Reply via email to