From 3b0b090989723c442d7b008ffe044e803b285cfb Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 18 Aug 2017 10:16:53 +0800 Subject: [PATCH] improved sql parser. --- .../druid/sql/ast/SQLStatementImpl.java | 12 + .../sql/ast/statement/SQLDeleteStatement.java | 42 +++- .../sql/ast/statement/SQLExprTableSource.java | 16 ++ .../sql/ast/statement/SQLJoinTableSource.java | 65 ++++- .../druid/sql/ast/statement/SQLSelect.java | 3 + .../sql/ast/statement/SQLSelectItem.java | 9 + .../ast/statement/SQLSelectQueryBlock.java | 31 +-- .../sql/ast/statement/SQLSelectStatement.java | 10 - .../ast/statement/SQLSubqueryTableSource.java | 17 ++ .../sql/ast/statement/SQLTableSource.java | 2 + .../sql/ast/statement/SQLTableSourceImpl.java | 12 + .../ast/statement/MySqlDeleteStatement.java | 21 ++ .../ast/statement/MySqlFlushStatement.java | 232 ++++++++++++++++++ .../mysql/parser/MySqlStatementParser.java | 199 +++++++++------ .../mysql/visitor/MySqlASTVisitor.java | 86 +------ .../mysql/visitor/MySqlASTVisitorAdapter.java | 100 +------- .../visitor/MySqlExportParameterVisitor.java | 11 + .../mysql/visitor/MySqlOutputVisitor.java | 109 +++----- .../mysql/visitor/MySqlSchemaStatVisitor.java | 100 +------- .../visitor/transform/NameResolveVisitor.java | 2 +- .../ast/stmt/OracleDeleteStatement.java | 20 +- .../oracle/visitor/OracleOutputVisitor.java | 9 +- .../ast/stmt/PGDeleteStatement.java | 25 +- .../sql/repository/SchemaRepository.java | 11 +- .../sql/visitor/SQLASTOutputVisitor.java | 8 +- .../druid/parser/oracle/builtin_functions | 1 + ...rameterizedOutputVisitorTest_47_hints.java | 47 ++++ .../sql/mysql/select/MySqlFlushTest_0.java | 67 +++++ 28 files changed, 789 insertions(+), 478 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlFlushStatement.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_47_hints.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlFlushTest_0.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java b/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java index fcf311968a..bd708ce492 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java @@ -18,12 +18,16 @@ package com.alibaba.druid.sql.ast; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.List; + public abstract class SQLStatementImpl extends SQLObjectImpl implements SQLStatement { protected String dbType; private boolean afterSemi; + protected List headHints; + public SQLStatementImpl(){ } @@ -60,4 +64,12 @@ public abstract class SQLStatementImpl extends SQLObjectImpl implements SQLState public SQLStatement clone() { throw new UnsupportedOperationException(this.getClass().getName()); } + + public List getHeadHintsDirect() { + return headHints; + } + + public void setHeadHints(List headHints) { + this.headHints = headHints; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java index e53445c923..dc10784a8b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java @@ -15,10 +15,7 @@ */ package com.alibaba.druid.sql.ast.statement; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLReplaceable; -import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -28,6 +25,8 @@ public class SQLDeleteStatement extends SQLStatementImpl implements SQLReplaceab protected SQLExpr where; protected SQLTableSource from; + protected boolean only = false; + public SQLDeleteStatement(){ } @@ -36,6 +35,33 @@ public class SQLDeleteStatement extends SQLStatementImpl implements SQLReplaceab super (dbType); } + protected void cloneTo(SQLDeleteStatement x) { + if (headHints != null) { + for (SQLCommentHint h : headHints) { + SQLCommentHint h2 = h.clone(); + h2.setParent(x); + x.headHints.add(h2); + } + } + + if (tableSource != null) { + x.setTableSource(tableSource.clone()); + } + if (where != null) { + x.setWhere(where.clone()); + } + if (from != null) { + x.setFrom(from.clone()); + } + x.only = only; + } + + public SQLDeleteStatement clone() { + SQLDeleteStatement x = new SQLDeleteStatement(); + cloneTo(x); + return x; + } + public SQLTableSource getTableSource() { return tableSource; } @@ -131,4 +157,12 @@ public class SQLDeleteStatement extends SQLStatementImpl implements SQLReplaceab } return false; } + + public boolean isOnly() { + return only; + } + + public void setOnly(boolean only) { + this.only = only; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java index 183d3a4c37..67cd45c66b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java @@ -239,4 +239,20 @@ public class SQLExprTableSource extends SQLTableSourceImpl { return null; } + + public SQLTableSource findTableSource(String alias) { + if (alias == null) { + return null; + } + + if (SQLUtils.nameEquals(alias, computeAlias())) { + return this; + } + + if (containsAlias(alias)) { + return this; + } + + return null; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java index 079b7cfa31..6aa48a61b8 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java @@ -327,17 +327,58 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace } } - public boolean contains(SQLTableSource tableSource, SQLExpr conditionn) { + public boolean contains(SQLTableSource tableSource, SQLExpr condition) { if (right.equals(tableSource)) { - if (this.condition == conditionn) { + if (this.condition == condition) { return true; } - return this.condition != null && this.condition.equals(conditionn); + return this.condition != null && this.condition.equals(condition); } if (left instanceof SQLJoinTableSource) { - return ((SQLJoinTableSource) left).contains(tableSource, conditionn); + SQLJoinTableSource joinLeft = (SQLJoinTableSource) left; + + if (tableSource instanceof SQLJoinTableSource) { + SQLJoinTableSource join = (SQLJoinTableSource) tableSource; + + if (join.right.equals(right) && this.condition.equals(condition) && joinLeft.right.equals(join.left)) { + return true; + } + } + + return joinLeft.contains(tableSource, condition); + } + + return false; + } + + public boolean contains(SQLTableSource tableSource, SQLExpr condition, JoinType joinType) { + if (right.equals(tableSource)) { + if (this.condition == condition) { + return true; + } + + return this.condition != null && this.condition.equals(condition) && this.joinType == joinType; + } + + if (left instanceof SQLJoinTableSource) { + SQLJoinTableSource joinLeft = (SQLJoinTableSource) left; + + if (tableSource instanceof SQLJoinTableSource) { + SQLJoinTableSource join = (SQLJoinTableSource) tableSource; + + if (join.right.equals(right) + && this.condition != null && this.condition.equals(join.condition) + && joinLeft.right.equals(join.left) + && this.joinType == join.joinType + && joinLeft.condition != null && joinLeft.condition.equals(condition) + && joinLeft.joinType == joinType) { + return true; + } + } + + return joinLeft.contains(tableSource, condition, joinType); } return false; @@ -476,4 +517,20 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace return joined; } + public SQLTableSource findTableSource(String alias) { + if (alias == null) { + return null; + } + + if (SQLUtils.nameEquals(alias, computeAlias())) { + return this; + } + + SQLTableSource result = left.findTableSource(alias); + if (result != null) { + return result; + } + + return right.findTableSource(alias); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java index 57961a06d7..115207ae37 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java @@ -93,6 +93,9 @@ public class SQLSelect extends SQLObjectImpl { } public void setOrderBy(SQLOrderBy orderBy) { + if (orderBy != null) { + orderBy.setParent(this); + } this.orderBy = orderBy; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java index b1cd78eedb..24db15bb76 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.SQLReplaceable; +import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -178,6 +179,10 @@ public class SQLSelectItem extends SQLObjectImpl implements SQLReplaceable { return true; } + if (expr instanceof SQLAllColumnExpr) { + return true; + } + if (expr instanceof SQLIdentifierExpr) { String ident = ((SQLIdentifierExpr) expr).getName(); return alias_normalized.equalsIgnoreCase(SQLUtils.normalize(ident)); @@ -185,6 +190,10 @@ public class SQLSelectItem extends SQLObjectImpl implements SQLReplaceable { if (expr instanceof SQLPropertyExpr) { String ident = ((SQLPropertyExpr) expr).getName(); + if ("*".equals(ident)) { + return true; + } + return alias_normalized.equalsIgnoreCase(SQLUtils.normalize(ident)); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java index 60083cbecb..c2890036b7 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java @@ -435,7 +435,10 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery } public SQLTableSource findTableSource(String alias) { - return findTableSource(from, alias); + if (from == null) { + return null; + } + return from.findTableSource(alias); } public SQLTableSource findTableSourceWithColumn(String column) { @@ -445,32 +448,6 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery return from.findTableSourceWithColumn(column); } - private static SQLTableSource findTableSource(SQLTableSource from, String alias) { - if (from == null || alias == null) { - return null; - } - - if (alias.equalsIgnoreCase(from.computeAlias())) { - return from; - } - - if (from instanceof SQLJoinTableSource) { - SQLJoinTableSource join = (SQLJoinTableSource) from; - SQLTableSource result = findTableSource(join.getLeft(), alias); - if (result != null) { - return result; - } - - return findTableSource(join.getRight(), alias); - } - - if (from instanceof SQLExprTableSource && from.containsAlias(alias)) { - return from; - } - - return null; - } - @Override public boolean replace(SQLExpr expr, SQLExpr target) { if (where == expr) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectStatement.java index 448684da55..b3d19a1cb3 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectStatement.java @@ -25,8 +25,6 @@ public class SQLSelectStatement extends SQLStatementImpl { protected SQLSelect select; - private List headHints; - public SQLSelectStatement(){ } @@ -66,14 +64,6 @@ public class SQLSelectStatement extends SQLStatementImpl { visitor.endVisit(this); } - public List getHeadHintsDirect() { - return headHints; - } - - public void setHeadHints(List headHints) { - this.headHints = headHints; - } - public SQLSelectStatement clone() { SQLSelectStatement x = new SQLSelectStatement(); if (select != null) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java index 42bddfffe4..d7ff0450ed 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java @@ -77,4 +77,21 @@ public class SQLSubqueryTableSource extends SQLTableSourceImpl { } return x; } + + public SQLTableSource findTableSourceWithColumn(String columnName) { + if (select == null) { + return null; + } + + SQLSelectQueryBlock queryBlock = select.getFirstQueryBlock(); + if (queryBlock == null) { + return null; + } + + if (queryBlock.findSelectItem(columnName) != null) { + return this; + } + + return null; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java index 66899efe65..627ed79eca 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java @@ -39,4 +39,6 @@ public interface SQLTableSource extends SQLObject { SQLColumnDefinition findColumn(String columnName); SQLTableSource findTableSourceWithColumn(String columnName); + + SQLTableSource findTableSource(String alias); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java index 616c15c398..d03d018ceb 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java @@ -102,4 +102,16 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab public SQLTableSource findTableSourceWithColumn(String columnName) { return null; } + + public SQLTableSource findTableSource(String alias) { + if (alias == null) { + return null; + } + + if (SQLUtils.nameEquals(alias, computeAlias())) { + return this; + } + + return null; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java index 54b6b145a5..54d11e4bee 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java @@ -44,6 +44,27 @@ public class MySqlDeleteStatement extends SQLDeleteStatement { super(JdbcConstants.MYSQL); } + public MySqlDeleteStatement clone() { + MySqlDeleteStatement x = new MySqlDeleteStatement(); + cloneTo(x); + + x.lowPriority = lowPriority; + x.quick = quick; + x.ignore = ignore; + + if (using != null) { + x.setUsing(using.clone()); + } + if (orderBy != null) { + x.setOrderBy(orderBy.clone()); + } + if (limit != null) { + x.setLimit(limit.clone()); + } + + return x; + } + public List getHints() { if (hints == null) { hints = new ArrayList(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlFlushStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlFlushStatement.java new file mode 100644 index 0000000000..634e3cb67f --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlFlushStatement.java @@ -0,0 +1,232 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed 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 com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/08/2017. + */ +public class MySqlFlushStatement extends MySqlStatementImpl { + private boolean noWriteToBinlog = false; + private boolean local = false; + + private final List tables = new ArrayList(); + + private boolean withReadLock = false; + private boolean forExport; + + private boolean binaryLogs; + private boolean desKeyFile; + private boolean engineLogs; + private boolean errorLogs; + private boolean generalLogs; + private boolean hots; + private boolean logs; + private boolean privileges; + private boolean optimizerCosts; + private boolean queryCache; + private boolean relayLogs; + private SQLExpr relayLogsForChannel; + private boolean slowLogs; + private boolean status; + private boolean userResources; + + public boolean isNoWriteToBinlog() { + return noWriteToBinlog; + } + + public void setNoWriteToBinlog(boolean noWriteToBinlog) { + this.noWriteToBinlog = noWriteToBinlog; + } + + public boolean isLocal() { + return local; + } + + public void setLocal(boolean local) { + this.local = local; + } + + public List getTables() { + return tables; + } + + public boolean isWithReadLock() { + return withReadLock; + } + + public void setWithReadLock(boolean withReadLock) { + this.withReadLock = withReadLock; + } + + public boolean isForExport() { + return forExport; + } + + public void setForExport(boolean forExport) { + this.forExport = forExport; + } + + public boolean isBinaryLogs() { + return binaryLogs; + } + + public void setBinaryLogs(boolean binaryLogs) { + this.binaryLogs = binaryLogs; + } + + public boolean isDesKeyFile() { + return desKeyFile; + } + + public void setDesKeyFile(boolean desKeyFile) { + this.desKeyFile = desKeyFile; + } + + public boolean isEngineLogs() { + return engineLogs; + } + + public void setEngineLogs(boolean engineLogs) { + this.engineLogs = engineLogs; + } + + public boolean isGeneralLogs() { + return generalLogs; + } + + public void setGeneralLogs(boolean generalLogs) { + this.generalLogs = generalLogs; + } + + public boolean isHots() { + return hots; + } + + public void setHots(boolean hots) { + this.hots = hots; + } + + public boolean isLogs() { + return logs; + } + + public void setLogs(boolean logs) { + this.logs = logs; + } + + public boolean isPrivileges() { + return privileges; + } + + public void setPrivileges(boolean privileges) { + this.privileges = privileges; + } + + public boolean isOptimizerCosts() { + return optimizerCosts; + } + + public void setOptimizerCosts(boolean optimizerCosts) { + this.optimizerCosts = optimizerCosts; + } + + public boolean isQueryCache() { + return queryCache; + } + + public void setQueryCache(boolean queryCache) { + this.queryCache = queryCache; + } + + public boolean isRelayLogs() { + return relayLogs; + } + + public void setRelayLogs(boolean relayLogs) { + this.relayLogs = relayLogs; + } + + public SQLExpr getRelayLogsForChannel() { + return relayLogsForChannel; + } + + public void setRelayLogsForChannel(SQLExpr relayLogsForChannel) { + this.relayLogsForChannel = relayLogsForChannel; + } + + public boolean isSlowLogs() { + return slowLogs; + } + + public void setSlowLogs(boolean showLogs) { + this.slowLogs = showLogs; + } + + public boolean isStatus() { + return status; + } + + public void setStatus(boolean status) { + this.status = status; + } + + public boolean isUserResources() { + return userResources; + } + + public void setUserResources(boolean userResources) { + this.userResources = userResources; + } + + public boolean isErrorLogs() { + return errorLogs; + } + + public void setErrorLogs(boolean errorLogs) { + this.errorLogs = errorLogs; + } + + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, tables); + acceptChild(visitor, relayLogsForChannel); + } + visitor.endVisit(this); + } + + public void addTable(SQLName name) { + if (name == null) { + return; + } + this.addTable(new SQLExprTableSource(name)); + } + + public void addTable(SQLExprTableSource table) { + if (table == null) { + return; + } + table.setParent(this); + this.tables.add(table); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index ed366f9f11..879746f83f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -42,82 +42,8 @@ import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIterateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlLeaveStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlRepeatStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAlterColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterUserStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExplainStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHelpStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHintStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement.LockType; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlOptimizeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlResetStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinaryLogsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateProcedureStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTriggerStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateViewStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEngineStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEnginesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowErrorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowFunctionCodeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowFunctionStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowGrantsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowIndexesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowKeysStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowOpenTablesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowPluginsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowPrivilegesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcedureCodeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcedureStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcessListStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProfileStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProfilesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowRelayLogEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowSlaveHostsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowSlaveStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MysqlDeallocatePrepareStatement; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLSelectParser; @@ -642,6 +568,12 @@ public class MySqlStatementParser extends SQLStatementParser { return true; } + if (identifierEquals("FLUSH")) { + SQLStatement stmt = parseFlush(); + statementList.add(stmt); + return true; + } + if (lexer.token() == Token.DESC || identifierEquals(DESCRIBE)) { SQLStatement stmt = parseDescribe(); statementList.add(stmt); @@ -706,18 +638,26 @@ public class MySqlStatementParser extends SQLStatementParser { if (lexer.token() == Token.HINT) { List hints = this.exprParser.parseHints(); - boolean tddlSelectHints = false; + boolean tddlHints = false; - if (hints.size() == 1 && statementList.size() == 0 && lexer.token() == Token.SELECT) { + final Token token = lexer.token(); + if (hints.size() == 1 + && statementList.size() == 0 + && (token == Token.SELECT || token == Token.DELETE)) { SQLCommentHint hint = hints.get(0); String hintText = hint.getText(); if (hintText.startsWith("+TDDL")) { - tddlSelectHints = true; + tddlHints = true; } } - if (tddlSelectHints) { - SQLSelectStatement stmt = (SQLSelectStatement) this.parseStatement(); + if (tddlHints) { + SQLStatementImpl stmt; + if (token == Token.SELECT) { + stmt = (SQLSelectStatement) this.parseStatement(); + } else { + stmt = (SQLDeleteStatement) this.parseStatement(); + } stmt.setHeadHints(hints); statementList.add(stmt); return true; @@ -765,6 +705,105 @@ public class MySqlStatementParser extends SQLStatementParser { return false; } + public SQLStatement parseFlush() { + acceptIdentifier("FLUSH"); + MySqlFlushStatement stmt = new MySqlFlushStatement(); + + if (identifierEquals("NO_WRITE_TO_BINLOG")) { + lexer.nextToken(); + stmt.setNoWriteToBinlog(true); + } + + if (identifierEquals("LOCAL")) { + lexer.nextToken(); + stmt.setLocal(true); + } + + acceptIdentifier("TABLES"); + + for (;;) { + if (lexer.token() == Token.WITH) { + lexer.nextToken(); + acceptIdentifier("READ"); + accept(Token.LOCK); + stmt.setWithReadLock(true); + } else if (lexer.token() == Token.FOR) { + lexer.nextToken(); + acceptIdentifier("EXPORT"); + stmt.setForExport(true); + } else if (identifierEquals("BINARY")) { + lexer.nextToken(); + acceptIdentifier("LOGS"); + stmt.setBinaryLogs(true); + } else if (identifierEquals("DES_KEY_FILE")) { + lexer.nextToken(); + stmt.setDesKeyFile(true); + } else if (identifierEquals("ENGINE")) { + lexer.nextToken(); + acceptIdentifier("LOGS"); + stmt.setEngineLogs(true); + } else if (identifierEquals("ERROR")) { + lexer.nextToken(); + acceptIdentifier("LOGS"); + stmt.setErrorLogs(true); + } else if (identifierEquals("GENERAL")) { + lexer.nextToken(); + acceptIdentifier("LOGS"); + stmt.setGeneralLogs(true); + } else if (identifierEquals("HOSTS")) { + lexer.nextToken(); + stmt.setHots(true); + } else if (identifierEquals("LOGS")) { + lexer.nextToken(); + stmt.setLogs(true); + } else if (identifierEquals("PRIVILEGES")) { + lexer.nextToken(); + stmt.setPrivileges(true); + } else if (identifierEquals("OPTIMIZER_COSTS")) { + lexer.nextToken(); + stmt.setOptimizerCosts(true); + } else if (identifierEquals("QUERY")) { + lexer.nextToken(); + acceptIdentifier("CACHE"); + stmt.setQueryCache(true); + } else if (identifierEquals("RELAY")) { + lexer.nextToken(); + acceptIdentifier("LOGS"); + if (lexer.token() == Token.FOR) { + lexer.nextToken(); + acceptIdentifier("CHANNEL"); + stmt.setRelayLogsForChannel(this.exprParser.primary()); + } + } else if (identifierEquals("SLOW")) { + lexer.nextToken(); + acceptIdentifier("LOGS"); + stmt.setSlowLogs(true); + } else if (identifierEquals("STATUS")) { + lexer.nextToken(); + stmt.setStatus(true); + } else if (identifierEquals("USER_RESOURCES")) { + lexer.nextToken(); + stmt.setUserResources(true); + } else if (lexer.token() == Token.IDENTIFIER){ + for (;;) { + SQLName name = this.exprParser.name(); + stmt.addTable(name); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + break; + } else { + break; + } + } + + return stmt; + } + public SQLBlockStatement parseBlock() { SQLBlockStatement block = new SQLBlockStatement(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java index adf9284ae8..e8e07338f8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java @@ -39,87 +39,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAlterColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterUserStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExplainStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHelpStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHintStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlOptimizeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlResetStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinaryLogsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateProcedureStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTriggerStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateViewStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEngineStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEnginesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowErrorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowFunctionCodeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowFunctionStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowGrantsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowIndexesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowKeysStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowOpenTablesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowPluginsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowPrivilegesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcedureCodeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcedureStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcessListStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProfileStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProfilesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowRelayLogEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowSlaveHostsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowSlaveStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateTableSource; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MysqlDeallocatePrepareStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public interface MySqlASTVisitor extends SQLASTVisitor { @@ -555,4 +475,8 @@ public interface MySqlASTVisitor extends SQLASTVisitor { void endVisit(MySqlDeclareConditionStatement x); + boolean visit(MySqlFlushStatement x); + + void endVisit(MySqlFlushStatement x); + } // diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java index 6525360b24..5c3222582f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java @@ -39,89 +39,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAlterColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterUserStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExplainStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHelpStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHintStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlOptimizeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlResetStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinaryLogsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateProcedureStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTriggerStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateViewStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEngineStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEnginesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowErrorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowFunctionCodeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowFunctionStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowGrantsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowIndexesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowKeysStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowOpenTablesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowPluginsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowPrivilegesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcedureCodeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcedureStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcessListStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProfileStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProfilesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowRelayLogEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowSlaveHostsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowSlaveStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateTableSource; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MysqlDeallocatePrepareStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySqlASTVisitor { @@ -1202,26 +1122,32 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq @Override public boolean visit(MySqlDeclareHandlerStatement x) { - // TODO Auto-generated method stub return false; } @Override public void endVisit(MySqlDeclareHandlerStatement x) { - // TODO Auto-generated method stub - + } @Override public boolean visit(MySqlDeclareConditionStatement x) { - // TODO Auto-generated method stub return false; } @Override public void endVisit(MySqlDeclareConditionStatement x) { - // TODO Auto-generated method stub - + + } + + @Override + public boolean visit(MySqlFlushStatement x) { + return false; + } + + @Override + public void endVisit(MySqlFlushStatement x) { + } } // diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlExportParameterVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlExportParameterVisitor.java index 9be293cc9a..e9f3ffb70c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlExportParameterVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlExportParameterVisitor.java @@ -26,6 +26,7 @@ import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.SQLLimit; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlFlushStatement; import com.alibaba.druid.sql.visitor.ExportParameterVisitor; import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils; @@ -128,4 +129,14 @@ public class MySqlExportParameterVisitor extends MySqlOutputVisitor implements E ExportParameterVisitorUtils.exportParameter(this.parameters, x); return true; } + + @Override + public boolean visit(MySqlFlushStatement x) { + return true; + } + + @Override + public void endVisit(MySqlFlushStatement x) { + + } } \ No newline at end of file diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index 9b1b0728ed..ab0670c298 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -44,89 +44,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAlterColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterUserStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExplainStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHelpStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHintStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlOptimizeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlResetStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinaryLogsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateProcedureStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTriggerStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateViewStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEngineStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEnginesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowErrorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowFunctionCodeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowFunctionStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowGrantsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowIndexesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowKeysStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowOpenTablesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowPluginsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowPrivilegesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcedureCodeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcedureStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcessListStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProfileStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProfilesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowRelayLogEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowSlaveHostsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowSlaveStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateTableSource; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MysqlDeallocatePrepareStatement; import com.alibaba.druid.sql.visitor.ExportParameterVisitor; import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils; import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; @@ -3707,4 +3627,31 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV return false; } + + @Override + public boolean visit(MySqlFlushStatement x) { + print0(ucase ? "FLUSH " : "flush "); + + print0(ucase ? "TABLES" : "tables"); + + List tables = x.getTables(); + if (tables.size() > 0) { + print(' '); + printAndAccept(tables, ", "); + } + + if (x.isWithReadLock()) { + print0(ucase ? " WITH READ LOCK" : " with read lock"); + } + + if (x.isForExport()) { + print0(ucase ? " FOR EXPORT" : " for export"); + } + return false; + } + + @Override + public void endVisit(MySqlFlushStatement x) { + + } } // diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index deee382f29..52e61db688 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -46,89 +46,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAlterColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterUserStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExplainStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHelpStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHintStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlOptimizeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlResetStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinaryLogsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateProcedureStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTriggerStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateViewStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEngineStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEnginesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowErrorsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowFunctionCodeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowFunctionStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowGrantsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowIndexesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowKeysStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowOpenTablesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowPluginsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowPrivilegesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcedureCodeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcedureStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProcessListStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProfileStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowProfilesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowRelayLogEventsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowSlaveHostsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowSlaveStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateTableSource; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MysqlDeallocatePrepareStatement; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Mode; @@ -1371,25 +1291,31 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlDeclareHandlerStatement x) { - // TODO Auto-generated method stub return false; } @Override public void endVisit(MySqlDeclareHandlerStatement x) { - // TODO Auto-generated method stub - + } @Override public boolean visit(MySqlDeclareConditionStatement x) { - // TODO Auto-generated method stub return false; } @Override public void endVisit(MySqlDeclareConditionStatement x) { - // TODO Auto-generated method stub - + } + + @Override + public boolean visit(MySqlFlushStatement x) { + return false; + } + + @Override + public void endVisit(MySqlFlushStatement x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/transform/NameResolveVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/transform/NameResolveVisitor.java index b6913e75d7..c228e6bfdc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/transform/NameResolveVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/transform/NameResolveVisitor.java @@ -95,7 +95,7 @@ public class NameResolveVisitor extends OracleASTVisitorAdapter { continue; } - String alias = tableSource.getAlias(); + String alias = tableSource.computeAlias(); if (tableSource != null && ownerName.equalsIgnoreCase(alias) && !ownerName.equals(alias)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleDeleteStatement.java index 2be20a15f1..932e93a7b4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleDeleteStatement.java @@ -27,7 +27,7 @@ import com.alibaba.druid.util.JdbcConstants; public class OracleDeleteStatement extends SQLDeleteStatement { - private boolean only = false; + private final List hints = new ArrayList(); private OracleReturningClause returning = null; @@ -63,12 +63,20 @@ public class OracleDeleteStatement extends SQLDeleteStatement { visitor.endVisit(this); } - public boolean isOnly() { - return this.only; - } + public OracleDeleteStatement clone() { + OracleDeleteStatement x = new OracleDeleteStatement(); + cloneTo(x); - public void setOnly(boolean only) { - this.only = only; + for (SQLHint hint : hints) { + SQLHint hint2 = hint.clone(); + hint2.setParent(x); + x.hints.add(hint2); + } + if (returning != null) { + x.setReturning(returning.clone()); + } + + return x; } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index 29dbbfa53d..f7796b0313 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -259,6 +259,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public boolean visit(OracleSelectJoin x) { x.getLeft().accept(this); + SQLTableSource right = x.getRight(); if (x.getJoinType() == JoinType.COMMA) { print0(", "); @@ -273,7 +274,13 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print0(ucase ? x.getJoinType().name : x.getJoinType().name_lcase); print(' '); - x.getRight().accept(this); + if (right instanceof SQLJoinTableSource) { + print('('); + right.accept(this); + print(')'); + } else { + right.accept(this); + } if (isRoot) { decrementIndent(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java index bae048c4ee..6b99344164 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -28,7 +29,6 @@ import com.alibaba.druid.util.JdbcConstants; public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatement { private PGWithClause with; - private boolean only = false; private List using = new ArrayList(2); private boolean returning; private String alias; @@ -61,13 +61,7 @@ public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatem this.using = using; } - public boolean isOnly() { - return only; - } - public void setOnly(boolean only) { - this.only = only; - } public PGWithClause getWith() { return with; @@ -93,4 +87,21 @@ public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatem visitor.endVisit(this); } + public PGDeleteStatement clone() { + PGDeleteStatement x = new PGDeleteStatement(); + cloneTo(x); + + if (with != null) { + x.setWith(with.clone()); + } + for (SQLName item : using) { + SQLName item2 = item.clone(); + item2.setParent(x); + x.using.add(item2); + } + x.returning = returning; + x.alias = alias; + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java index 85c3a4c902..c6a7800eb7 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java @@ -519,10 +519,19 @@ public class SchemaRepository { String ident = x.getName(); SQLTableSource tableSource = null; - if (queryBlock.getFrom() instanceof SQLJoinTableSource) { + if (queryBlock.getFrom() instanceof SQLJoinTableSource + || queryBlock.getFrom() instanceof SQLSubqueryTableSource) { tableSource = queryBlock.findTableSourceWithColumn(ident); } else { tableSource = queryBlock.getFrom(); + if (tableSource instanceof SQLExprTableSource) { + SchemaObject table = ((SQLExprTableSource) tableSource).getSchemaObject(); + if (table != null) { + if (table.findColumn(ident) == null) { + tableSource = null; // maybe parent + } + } + } } if (tableSource != null) { 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 e6612ac90b..25050bce73 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -2261,7 +2261,13 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet print(' '); SQLTableSource right = x.getRight(); - right.accept(this); + if (right instanceof SQLJoinTableSource) { + print('('); + right.accept(this); + print(')'); + } else { + right.accept(this); + } SQLExpr condition = x.getCondition(); if (condition != null) { diff --git a/src/main/resources/META-INF/druid/parser/oracle/builtin_functions b/src/main/resources/META-INF/druid/parser/oracle/builtin_functions index 433e3f2ad9..dd129ba55c 100644 --- a/src/main/resources/META-INF/druid/parser/oracle/builtin_functions +++ b/src/main/resources/META-INF/druid/parser/oracle/builtin_functions @@ -9,6 +9,7 @@ COS COSH EXP FLOOR +LEN LN LOG MOD diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_47_hints.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_47_hints.java new file mode 100644 index 0000000000..55ba4fbddd --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_47_hints.java @@ -0,0 +1,47 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_47_hints extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "/* ///d45b1886/ *//*+TDDL({'extra':{'SOCKET_TIMEOUT':'0'}})*/ DELETE FROM page_scores WHERE createdat <= '2017-06-16 00:39:09.1';"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement statement = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + List parameters = new ArrayList(); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + /*visitor.setPrettyFormat(false);*/ + statement.accept(visitor); + /* JSONArray array = new JSONArray(); + for(String table : visitor.getTables()){ + array.add(table.replaceAll("`","")); + }*/ + + String psql = out.toString(); + + System.out.println(psql); + + + assertEquals("DELETE FROM page_scores\n" + + "WHERE createdat <= ?;", psql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlFlushTest_0.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlFlushTest_0.java new file mode 100644 index 0000000000..fef37f7b44 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlFlushTest_0.java @@ -0,0 +1,67 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed 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 com.alibaba.druid.bvt.sql.mysql.select; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class MySqlFlushTest_0 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "flush tables with read lock"; + + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL, true); + SQLStatement stmt = statementList.get(0); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("orderBy : " + visitor.getOrderByColumns()); + +// assertEquals(1, visitor.getTables().size()); +// assertEquals(1, visitor.getColumns().size()); +// assertEquals(0, visitor.getConditions().size()); +// assertEquals(0, visitor.getOrderByColumns().size()); + + { + String output = SQLUtils.toMySqlString(stmt); + assertEquals("FLUSH TABLES WITH READ LOCK", // + output); + } + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + assertEquals("flush tables with read lock", // + output); + } + + { + String output = SQLUtils.toMySqlString(stmt, new SQLUtils.FormatOption(true, true, true)); + assertEquals("FLUSH TABLES WITH READ LOCK", // + output); + } + } +}