diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterSequenceStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterSequenceStatement.java index 31586e46bc..b319074c7d 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterSequenceStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterSequenceStatement.java @@ -25,6 +25,9 @@ public class SQLAlterSequenceStatement extends SQLStatementImpl implements SQLAl private Boolean cache; private SQLExpr cacheValue; + private boolean restart; + private SQLExpr restartWith; + private Boolean order; private boolean changeToSimple; @@ -203,4 +206,23 @@ public class SQLAlterSequenceStatement extends SQLStatementImpl implements SQLAl public void setChangeToTime(boolean changeToTime) { this.changeToTime = changeToTime; } + + public boolean isRestart() { + return restart; + } + + public void setRestart(boolean restart) { + this.restart = restart; + } + + public SQLExpr getRestartWith() { + return restartWith; + } + + public void setRestartWith(SQLExpr x) { + if (x != null) { + x.setParent(this); + } + this.restartWith = x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 951642723c..7907eff5c1 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -6548,6 +6548,18 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.token() == Token.ORDER) { lexer.nextToken(); stmt.setOrder(Boolean.TRUE); + continue; + } else if (lexer.identifierEquals(FnvHash.Constants.RESTART)) { + lexer.nextToken(); + stmt.setRestart(true); + + if (lexer.token == Token.WITH || lexer.token == Token.EQ) { + lexer.nextToken(); + stmt.setRestartWith(this.exprParser.primary()); + } else if(lexer.token == LITERAL_INT) { + stmt.setRestartWith(this.exprParser.primary()); + } + continue; } else if (lexer.identifierEquals("NOORDER")) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index cf0ca2cec6..25be7f23d6 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -7820,6 +7820,16 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } } + if (x.isRestart()) { + print0(ucase ? " RESTART" : " restart"); + + SQLExpr restartWith = x.getRestartWith(); + if (restartWith != null) { + print0(ucase ? " WITH " : " with "); + restartWith.accept(this); + } + } + return false; } diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java index 3583754372..a74e3c87e0 100644 --- a/src/main/java/com/alibaba/druid/util/FnvHash.java +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -1114,5 +1114,6 @@ public final class FnvHash { long X = fnv1a_64_lower("X"); long TRANSFORM = fnv1a_64_lower("TRANSFORM"); long NESTED = fnv1a_64_lower("NESTED"); + long RESTART = fnv1a_64_lower("RESTART"); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/alter/MySqlAlterSequence_0.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/alter/MySqlAlterSequence_0.java index 57f8699e55..7036b009af 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/alter/MySqlAlterSequence_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/alter/MySqlAlterSequence_0.java @@ -46,4 +46,32 @@ public class MySqlAlterSequence_0 extends TestCase { String output = SQLUtils.toOracleString(stmt); Assert.assertEquals("ALTER SEQUENCE customers_seq CYCLE CACHE 5;", output); } + + public void test_alter_seq_3() throws Exception { + String sql = "ALTER SEQUENCE s1 MINVALUE 10 RESTART;"; + SQLStatement stmt = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL).get(0); + String output = SQLUtils.toOracleString(stmt); + Assert.assertEquals("ALTER SEQUENCE s1 MINVALUE 10 RESTART;", output); + } + + public void test_alter_seq_4() throws Exception { + String sql = "ALTER SEQUENCE s1 MINVALUE 10 RESTART 10;"; + SQLStatement stmt = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL).get(0); + String output = SQLUtils.toOracleString(stmt); + Assert.assertEquals("ALTER SEQUENCE s1 MINVALUE 10 RESTART WITH 10;", output); + } + + public void test_alter_seq_5() throws Exception { + String sql = "ALTER SEQUENCE s1 MINVALUE 10 RESTART with 10;"; + SQLStatement stmt = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL).get(0); + String output = SQLUtils.toOracleString(stmt); + Assert.assertEquals("ALTER SEQUENCE s1 MINVALUE 10 RESTART WITH 10;", output); + } + + public void test_alter_seq_6() throws Exception { + String sql = "ALTER SEQUENCE s1 MINVALUE 10 RESTART = 10;"; + SQLStatement stmt = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL).get(0); + String output = SQLUtils.toOracleString(stmt); + Assert.assertEquals("ALTER SEQUENCE s1 MINVALUE 10 RESTART WITH 10;", output); + } }