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;
}