/*
* 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.visitor;
import com.alibaba.druid.sql.ast.SQLCommentHint;
import com.alibaba.druid.sql.ast.SQLDataType;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.SQLParameter;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.SQLSubPartitionBy;
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.ConditionValue;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.ConditionValue.ConditionType;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareConditionStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareHandlerStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlExplainType;
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.clause.MySqlWhileStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr;
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.MySqlCommitStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement;
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.MySqlRollbackStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement;
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.MySqlUnionQuery;
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;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.util.JdbcConstants;
import java.security.AccessControlException;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTVisitor {
{
this.dbType = JdbcConstants.MYSQL;
this.shardingSupport = true;
}
public MySqlOutputVisitor(Appendable appender) {
super(appender);
}
public MySqlOutputVisitor(Appendable appender, boolean parameterized) {
super(appender, parameterized);
try {
configFromProperty(System.getProperties());
} catch (AccessControlException e) {
// skip
}
}
public void configFromProperty(Properties properties) {
if (parameterized) {
String property = properties.getProperty("druid.parameterized.shardingSupport");
if ("true".equals(property)) {
this.setShardingSupport(true);
} else if ("false".equals(property)) {
this.setShardingSupport(false);
}
}
}
public boolean isShardingSupport() {
return shardingSupport;
}
public void setShardingSupport(boolean shardingSupport) {
this.shardingSupport = shardingSupport;
}
@Override
public boolean visit(SQLSelectQueryBlock select) {
if (select instanceof MySqlSelectQueryBlock) {
return visit((MySqlSelectQueryBlock) select);
}
return super.visit(select);
}
public boolean visit(MySqlSelectQueryBlock x) {
if ((!isParameterized()) && isPrettyFormat() && x.hasBeforeComment()) {
printComment(x.getBeforeCommentsDirect(), "\n");
}
print0(ucase ? "SELECT " : "select ");
for (int i = 0, size = x.getHintsSize(); i < size; ++i) {
SQLCommentHint hint = x.getHints().get(i);
hint.accept(this);
print(' ');
}
if (SQLSetQuantifier.ALL == x.getDistionOption()) {
print0(ucase ? "ALL " : "all ");
} else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) {
print0(ucase ? "DISTINCT " : "distinct ");
} else if (SQLSetQuantifier.DISTINCTROW == x.getDistionOption()) {
print0(ucase ? "DISTINCTROW " : "distinctrow ");
}
if (x.isHignPriority()) {
print0(ucase ? "HIGH_PRIORITY " : "high_priority ");
}
if (x.isStraightJoin()) {
print0(ucase ? "STRAIGHT_JOIN " : "straight_join ");
}
if (x.isSmallResult()) {
print0(ucase ? "SQL_SMALL_RESULT " : "sql_small_result ");
}
if (x.isBigResult()) {
print0(ucase ? "SQL_BIG_RESULT " : "sql_big_result ");
}
if (x.isBufferResult()) {
print0(ucase ? "SQL_BUFFER_RESULT " : "sql_buffer_result ");
}
if (x.getCache() != null) {
if (x.getCache().booleanValue()) {
print0(ucase ? "SQL_CACHE " : "sql_cache ");
} else {
print0(ucase ? "SQL_NO_CACHE " : "sql_no_cache ");
}
}
if (x.isCalcFoundRows()) {
print0(ucase ? "SQL_CALC_FOUND_ROWS " : "sql_calc_found_rows ");
}
printSelectList(x.getSelectList());
if (x.getInto() != null) {
println();
print0(ucase ? "INTO " : "into ");
x.getInto().accept(this);
}
if (x.getFrom() != null) {
println();
print0(ucase ? "FROM " : "from ");
x.getFrom().accept(this);
}
if (x.getWhere() != null) {
println();
print0(ucase ? "WHERE " : "where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
}
printHierarchical(x);
if (x.getGroupBy() != null) {
println();
x.getGroupBy().accept(this);
}
if (x.getOrderBy() != null) {
println();
x.getOrderBy().accept(this);
}
if (x.getLimit() != null) {
println();
x.getLimit().accept(this);
}
if (x.getProcedureName() != null) {
print0(ucase ? " PROCEDURE " : " procedure ");
x.getProcedureName().accept(this);
if (!x.getProcedureArgumentList().isEmpty()) {
print('(');
printAndAccept(x.getProcedureArgumentList(), ", ");
print(')');
}
}
if (x.isForUpdate()) {
println();
print0(ucase ? "FOR UPDATE" : "for update");
if (x.isNoWait()) {
print0(ucase ? " NO_WAIT" : " no_wait");
} else if (x.getWaitTime() != null) {
print0(ucase ? " WAIT " : " wait ");
x.getWaitTime().accept(this);
}
}
if (x.isLockInShareMode()) {
println();
print0(ucase ? "LOCK IN SHARE MODE" : "lock in share mode");
}
return false;
}
public boolean visit(SQLColumnDefinition x) {
x.getName().accept(this);
SQLDataType dataType = x.getDataType();
if (dataType != null) {
print(' ');
dataType.accept(this);
}
if (x.getCharsetExpr() != null) {
print0(ucase ? " CHARSET " : " charset ");
x.getCharsetExpr().accept(this);
}
for (SQLColumnConstraint item : x.getConstraints()) {
print(' ');
item.accept(this);
}
if (x.getDefaultExpr() != null) {
print0(ucase ? " DEFAULT " : " default ");
x.getDefaultExpr().accept(this);
}
if (x.getStorage() != null) {
print0(ucase ? " STORAGE " : " storage ");
x.getStorage().accept(this);
}
if (x.getOnUpdate() != null) {
print0(ucase ? " ON UPDATE " : " on update ");
x.getOnUpdate().accept(this);
}
if (x.isAutoIncrement()) {
print0(ucase ? " AUTO_INCREMENT" : " auto_increment");
}
if (x.getComment() != null) {
print0(ucase ? " COMMENT " : " comment ");
x.getComment().accept(this);
}
if (x.getAsExpr() != null) {
print0(ucase ? " AS (" : " as (");
x.getAsExpr().accept(this);
print(')');
}
if (x.isSorted()) {
print0(ucase ? " SORTED" : " sorted");
}
return false;
}
public boolean visit(SQLDataType x) {
print0(x.getName());
if (!x.getArguments().isEmpty()) {
print('(');
printAndAccept(x.getArguments(), ", ");
print(')');
}
if (Boolean.TRUE == x.getAttribute("UNSIGNED")) {
print0(ucase ? " UNSIGNED" : " unsigned");
}
if (Boolean.TRUE == x.getAttribute("ZEROFILL")) {
print0(ucase ? " ZEROFILL" : " zerofill");
}
if (x instanceof SQLCharacterDataType) {
SQLCharacterDataType charType = (SQLCharacterDataType) x;
if (charType.getCharSetName() != null) {
print0(ucase ? " CHARACTER SET " : " character set ");
print0(charType.getCharSetName());
if (charType.getCollate() != null) {
print0(ucase ? " COLLATE " : " collate ");
print0(charType.getCollate());
}
}
List<SQLCommentHint> hints = ((SQLCharacterDataType) x).hints;
if (hints != null) {
print(' ');
for (SQLCommentHint hint : hints) {
hint.accept(this);
}
}
}
return false;
}
@Override
public boolean visit(SQLCharacterDataType x) {
print0(x.getName());
if (!x.getArguments().isEmpty()) {
print('(');
printAndAccept(x.getArguments(), ", ");
print(')');
}
if (x.isHasBinary()) {
print0(ucase ? " BINARY " : " binary ");
}
if (x.getCharSetName() != null) {
print0(ucase ? " CHARACTER SET " : " character set ");
print0(x.getCharSetName());
if (x.getCollate() != null) {
print0(ucase ? " COLLATE " : " collate ");
print0(x.getCollate());
}
} else if (x.getCollate() != null) {
print0(ucase ? " COLLATE " : " collate ");
print0(x.getCollate());
}
List<SQLCommentHint> hints = ((SQLCharacterDataType) x).hints;
if (hints != null) {
print(' ');
for (SQLCommentHint hint : hints) {
hint.accept(this);
}
}
return false;
}
@Override
public void endVisit(MySqlTableIndex x) {
}
@Override
public boolean visit(MySqlTableIndex x) {
print0(ucase ? "INDEX" : "index");
if (x.getName() != null) {
print(' ');
x.getName().accept(this);
}
if (x.getIndexType() != null) {
print0(ucase ? " USING " : " using ");
print0(x.getIndexType());
}
print('(');
for (int i = 0, size = x.getColumns().size(); i < size; ++i) {
if (i != 0) {
print0(", ");
}
x.getColumns().get(i).accept(this);
}
print(')');
return false;
}
public boolean visit(MySqlCreateTableStatement x) {
print0(ucase ? "CREATE " : "create ");
for (SQLCommentHint hint : x.getHints()) {
hint.accept(this);
print(' ');
}
if (SQLCreateTableStatement.Type.GLOBAL_TEMPORARY.equals(x.getType())) {
print0(ucase ? "TEMPORARY TABLE " : "temporary table ");
} else {
print0(ucase ? "TABLE " : "table ");
}
if (x.isIfNotExiists()) {
print0(ucase ? "IF NOT EXISTS " : "if not exists ");
}
printTableSourceExpr(x.getName());
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
int size = x.getTableElementList().size();
if (size > 0) {
print0(" (");
incrementIndent();
println();
for (int i = 0; i < size; ++i) {
if (i != 0) {
print0(", ");
println();
}
x.getTableElementList().get(i).accept(this);
}
decrementIndent();
println();
print(')');
}
for (Map.Entry<String, SQLObject> option : x.getTableOptions().entrySet()) {
String key = option.getKey();
print(' ');
print0(ucase ? key : key.toLowerCase());
if ("TABLESPACE".equals(key)) {
print(' ');
option.getValue().accept(this);
continue;
} else if ("UNION".equals(key)) {
print0(" = (");
option.getValue().accept(this);
print(')');
continue;
}
print0(" = ");
option.getValue().accept(this);
}
if (x.getPartitioning() != null) {
println();
x.getPartitioning().accept(this);
}
if (x.getTableGroup() != null) {
println();
print0(ucase ? "TABLEGROUP " : "tablegroup ");
x.getTableGroup().accept(this);
}
if (x.getSelect() != null) {
incrementIndent();
println();
x.getSelect().accept(this);
decrementIndent();
}
for (SQLCommentHint hint : x.getOptionHints()) {
print(' ');
hint.accept(this);
}
return false;
}
@Override
public void endVisit(MySqlKey x) {
}
@Override
public void endVisit(MySqlPrimaryKey x) {
}
@Override
public void endVisit(MysqlForeignKey x) {
}
@Override
public boolean visit(MySqlKey x) {
if (x.isHasConstaint()) {
print0(ucase ? "CONSTRAINT " : "constraint ");
if (x.getName() != null) {
x.getName().accept(this);
print(' ');
}
}
print0(ucase ? "KEY" : "key");
if (x.getIndexName() != null) {
print(' ');
x.getIndexName().accept(this);
}
if (x.getIndexType() != null) {
print0(ucase ? " USING " : " using ");
print0(x.getIndexType());
}
print0(" (");
for (int i = 0, size = x.getColumns().size(); i < size; ++i) {
if (i != 0) {
print0(", ");
}
x.getColumns().get(i).accept(this);
}
print(')');
return false;
}
@Override
public boolean visit(MySqlPrimaryKey x) {
if (x.getName() != null) {
print0(ucase ? "CONSTRAINT " : "constraint ");
x.getName().accept(this);
print(' ');
}
print0(ucase ? "PRIMARY KEY" : "primary key");
if (x.getIndexType() != null) {
print0(ucase ? " USING " : " using ");
print0(x.getIndexType());
}
print0(" (");
for (int i = 0, size = x.getColumns().size(); i < size; ++i) {
if (i != 0) {
print0(", ");
}
x.getColumns().get(i).accept(this);
}
print(')');
return false;
}
public boolean visit(SQLCharExpr x) {
if (this.parameterized
&& ParameterizedOutputVisitorUtils.checkParameterize(x)) {
print('?');
incrementReplaceCunt();
if (this instanceof ExportParameterVisitor || this.parameters != null) {
ExportParameterVisitorUtils.exportParameter(this.parameters, x);
}
return false;
}
print('\'');
String text = x.getText();
StringBuilder buf = new StringBuilder(text.length());
for (int i = 0; i < text.length(); ++i) {
char ch = text.charAt(i);
if (ch == '\'') {
buf.append('\'');
buf.append('\'');
} else if (ch == '\\') {
buf.append('\\');
buf.append('\\');
} else if (ch == '\0') {
buf.append('\\');
buf.append('0');
} else {
buf.append(ch);
}
}
if (buf.length() != text.length()) {
text = buf.toString();
}
print0(text);
print('\'');
return false;
}
public boolean visit(SQLVariantRefExpr x) {
{
int parametersSize = this.getParametersSize();
int index = x.getIndex();
if (index >= 0 && index < parametersSize) {
return super.visit(x);
}
}
String varName = x.getName();
if (x.isGlobal()) {
print0("@@global.");
} else {
if ((!varName.startsWith("@")) // /
&& (!varName.equals("?")) //
&& (!varName.startsWith("#")) //
&& (!varName.startsWith("$")) //
&& (!varName.startsWith(":"))) {
boolean subPartitionOption = false;
if (x.getParent() != null) {
subPartitionOption = x.getParent().getParent() instanceof SQLSubPartitionBy;
}
if (!subPartitionOption) {
print0("@@");
}
}
}
for (int i = 0; i < x.getName().length(); ++i) {
char ch = x.getName().charAt(i);
if (ch == '\'') {
if (x.getName().startsWith("@@") && i == 2) {
print(ch);
} else if (x.getName().startsWith("@") && i == 1) {
print(ch);
} else if (i != 0 && i != x.getName().length() - 1) {
print0("\\'");
} else {
print(ch);
}
} else {
print(ch);
}
}
String collate = (String) x.getAttribute("COLLATE");
if (collate != null) {
print0(ucase ? " COLLATE " : " collate ");
print0(collate);
}
return false;
}
public boolean visit(SQLMethodInvokeExpr x) {
if ("SUBSTRING".equalsIgnoreCase(x.getMethodName())) {
if (x.getOwner() != null) {
x.getOwner().accept(this);
print('.');
}
print0(x.getMethodName());
print('(');
printAndAccept(x.getParameters(), ", ");
SQLExpr from = (SQLExpr) x.getAttribute("FROM");
if (from != null) {
print0(ucase ? " FROM " : " from ");
from.accept(this);
}
SQLExpr forExpr = (SQLExpr) x.getAttribute("FOR");
if (forExpr != null) {
print0(ucase ? " FOR " : " for ");
forExpr.accept(this);
}
print(')');
return false;
}
if ("TRIM".equalsIgnoreCase(x.getMethodName())) {
if (x.getOwner() != null) {
x.getOwner().accept(this);
print('.');
}
print0(x.getMethodName());
print('(');
String trimType = (String) x.getAttribute("TRIM_TYPE");
if (trimType != null) {
print0(trimType);
print(' ');
}
printAndAccept(x.getParameters(), ", ");
SQLExpr from = (SQLExpr) x.getAttribute("FROM");
if (from != null) {
print0(ucase ? " FROM " : " from ");
from.accept(this);
}
print(')');
return false;
}
if (("CONVERT".equalsIgnoreCase(x.getMethodName())) || "CHAR".equalsIgnoreCase(x.getMethodName())) {
if (x.getOwner() != null) {
x.getOwner().accept(this);
print('.');
}
print0(x.getMethodName());
print('(');
printAndAccept(x.getParameters(), ", ");
String charset = (String) x.getAttribute("USING");
if (charset != null) {
print0(ucase ? " USING " : " using ");
print0(charset);
}
print(')');
return false;
}
return super.visit(x);
}
@Override
public void endVisit(MySqlIntervalExpr x) {
}
@Override
public boolean visit(MySqlIntervalExpr x) {
print0(ucase ? "INTERVAL " : "interval ");
SQLExpr value = x.getValue();
value.accept(this);
print(' ');
print0(ucase ? x.getUnit().name() : x.getUnit().name_lcase);
return false;
}
@Override
public boolean visit(MySqlExtractExpr x) {
print0(ucase ? "EXTRACT(" : "extract(");
print0(x.getUnit().name());
print0(ucase ? " FROM " : " from ");
x.getValue().accept(this);
print(')');
return false;
}
@Override
public void endVisit(MySqlExtractExpr x) {
}
@Override
public void endVisit(MySqlMatchAgainstExpr x) {
}
@Override
public boolean visit(MySqlMatchAgainstExpr x) {
print0(ucase ? "MATCH (" : "match (");
printAndAccept(x.getColumns(), ", ");
print(')');
print0(ucase ? " AGAINST (" : " against (");
x.getAgainst().accept(this);
if (x.getSearchModifier() != null) {
print(' ');
print0(ucase ? x.getSearchModifier().name : x.getSearchModifier().name_lcase);
}
print(')');
return false;
}
@Override
public void endVisit(MySqlPrepareStatement x) {
}
@Override
public boolean visit(MySqlPrepareStatement x) {
print0(ucase ? "PREPARE " : "prepare ");
x.getName().accept(this);
print0(ucase ? " FROM " : " from ");
x.getFrom().accept(this);
return false;
}
@Override
public void endVisit(MySqlExecuteStatement x) {
}
@Override
public boolean visit(MySqlExecuteStatement x) {
print0(ucase ? "EXECUTE " : "execute ");
x.getStatementName().accept(this);
if (x.getParameters().size() > 0) {
print0(ucase ? " USING " : " using ");
;
printAndAccept(x.getParameters(), ", ");
}
return false;
}
@Override
public void endVisit(MysqlDeallocatePrepareStatement x) {
}
public boolean visit(MysqlDeallocatePrepareStatement x) {
print0(ucase ? "DEALLOCATE PREPARE " : "deallocate prepare ");
x.getStatementName().accept(this);
return false;
}
@Override
public void endVisit(MySqlDeleteStatement x) {
}
@Override
public boolean visit(MySqlDeleteStatement x) {
print0(ucase ? "DELETE " : "delete ");
for (int i = 0, size = x.getHintsSize(); i < size; ++i) {
SQLCommentHint hint = x.getHints().get(i);
hint.accept(this);
print(' ');
}
if (x.isLowPriority()) {
print0(ucase ? "LOW_PRIORITY " : "low_priority ");
}
if (x.isQuick()) {
print0(ucase ? "QUICK " : "quick ");
}
if (x.isIgnore()) {
print0(ucase ? "IGNORE " : "ignore ");
}
if (x.getFrom() == null) {
print0(ucase ? "FROM " : "from ");
x.getTableSource().accept(this);
} else {
x.getTableSource().accept(this);
println();
print0(ucase ? "FROM " : "from ");
x.getFrom().accept(this);
}
if (x.getUsing() != null) {
println();
print0(ucase ? "USING " : "using ");
x.getUsing().accept(this);
}
if (x.getWhere() != null) {
println();
incrementIndent();
print0(ucase ? "WHERE " : "where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
decrementIndent();
}
if (x.getOrderBy() != null) {
println();
x.getOrderBy().accept(this);
}
if (x.getLimit() != null) {
println();
x.getLimit().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlInsertStatement x) {
}
@Override
public boolean visit(MySqlInsertStatement x) {
print0(ucase ? "INSERT " : "insert ");
if (x.isLowPriority()) {
print0(ucase ? "LOW_PRIORITY " : "low_priority ");
}
if (x.isDelayed()) {
print0(ucase ? "DELAYED " : "delayed ");
}
if (x.isHighPriority()) {
print0(ucase ? "HIGH_PRIORITY " : "high_priority ");
}
if (x.isIgnore()) {
print0(ucase ? "IGNORE " : "ignore ");
}
if (x.isRollbackOnFail()) {
print0(ucase ? "ROLLBACK_ON_FAIL " : "rollback_on_fail ");
}
print0(ucase ? "INTO " : "into ");
x.getTableSource().accept(this);
if (x.getColumns().size() > 0) {
incrementIndent();
print0(" (");
for (int i = 0, size = x.getColumns().size(); i < size; ++i) {
if (i != 0) {
if (i % 5 == 0) {
println();
}
print0(", ");
}
x.getColumns().get(i).accept(this);
}
print(')');
decrementIndent();
}
if (!x.getValuesList().isEmpty()) {
println();
printValuesList(x);
}
if (x.getQuery() != null) {
println();
x.getQuery().accept(this);
}
if (x.getDuplicateKeyUpdate().size() != 0) {
println();
print0(ucase ? "ON DUPLICATE KEY UPDATE " : "on duplicate key update ");
for (int i = 0, size = x.getDuplicateKeyUpdate().size(); i < size; ++i) {
if (i != 0) {
if (i % 5 == 0) {
println();
}
print0(", ");
}
x.getDuplicateKeyUpdate().get(i).accept(this);
}
}
return false;
}
protected void printValuesList(MySqlInsertStatement x) {
List<SQLInsertStatement.ValuesClause> valuesList = x.getValuesList();
if (parameterized) {
print0(ucase ? "VALUES " : "values ");
incrementIndent();
valuesList.get(0).accept(this);
decrementIndent();
if (valuesList.size() > 1) {
this.incrementReplaceCunt();
}
return;
}
print0(ucase ? "VALUES " : "values ");
if (x.getValuesList().size() > 1) {
incrementIndent();
}
for (int i = 0, size = valuesList.size(); i < size; ++i) {
if (i != 0) {
print(',');
println();
}
valuesList.get(i).accept(this);
}
if (valuesList.size() > 1) {
decrementIndent();
}
}
@Override
public void endVisit(MySqlLoadDataInFileStatement x) {
}
@Override
public boolean visit(MySqlLoadDataInFileStatement x) {
print0(ucase ? "LOAD DATA " : "load data ");
if (x.isLowPriority()) {
print0(ucase ? "LOW_PRIORITY " : "low_priority ");
}
if (x.isConcurrent()) {
print0(ucase ? "CONCURRENT " : "concurrent ");
}
if (x.isLocal()) {
print0(ucase ? "LOCAL " : "local ");
}
print0(ucase ? "INFILE " : "infile ");
x.getFileName().accept(this);
if (x.isReplicate()) {
print0(ucase ? " REPLACE " : " replace ");
}
if (x.isIgnore()) {
print0(ucase ? " IGNORE " : " ignore ");
}
print0(ucase ? " INTO TABLE " : " into table ");
x.getTableName().accept(this);
if (x.getColumnsTerminatedBy() != null || x.getColumnsEnclosedBy() != null || x.getColumnsEscaped() != null) {
print0(ucase ? " COLUMNS" : " columns");
if (x.getColumnsTerminatedBy() != null) {
print0(ucase ? " TERMINATED BY " : " terminated by ");
x.getColumnsTerminatedBy().accept(this);
}
if (x.getColumnsEnclosedBy() != null) {
if (x.isColumnsEnclosedOptionally()) {
print0(ucase ? " OPTIONALLY" : " optionally");
}
print0(ucase ? " ENCLOSED BY " : " enclosed by ");
x.getColumnsEnclosedBy().accept(this);
}
if (x.getColumnsEscaped() != null) {
print0(ucase ? " ESCAPED BY " : " escaped by ");
x.getColumnsEscaped().accept(this);
}
}
if (x.getLinesStartingBy() != null || x.getLinesTerminatedBy() != null) {
print0(ucase ? " LINES" : " lines");
if (x.getLinesStartingBy() != null) {
print0(ucase ? " STARTING BY " : " starting by ");
x.getLinesStartingBy().accept(this);
}
if (x.getLinesTerminatedBy() != null) {
print0(ucase ? " TERMINATED BY " : " terminated by ");
x.getLinesTerminatedBy().accept(this);
}
}
if (x.getIgnoreLinesNumber() != null) {
print0(ucase ? " IGNORE " : " ignore ");
x.getIgnoreLinesNumber().accept(this);
print0(ucase ? " LINES" : " lines");
}
if (x.getColumns().size() != 0) {
print0(" (");
printAndAccept(x.getColumns(), ", ");
print(')');
}
if (x.getSetList().size() != 0) {
print0(ucase ? " SET " : " set ");
printAndAccept(x.getSetList(), ", ");
}
return false;
}
@Override
public void endVisit(MySqlReplaceStatement x) {
}
@Override
public boolean visit(MySqlReplaceStatement x) {
print0(ucase ? "REPLACE " : "replace ");
if (x.isLowPriority()) {
print0(ucase ? "LOW_PRIORITY " : "low_priority ");
}
if (x.isDelayed()) {
print0(ucase ? "DELAYED " : "delayed ");
}
print0(ucase ? "INTO " : "into ");
x.getTableName().accept(this);
if (x.getColumns().size() > 0) {
print0(" (");
for (int i = 0, size = x.getColumns().size(); i < size; ++i) {
if (i != 0) {
print0(", ");
}
x.getColumns().get(i).accept(this);
}
print(')');
}
if (x.getValuesList().size() != 0) {
println();
print0(ucase ? "VALUES " : "values ");
int size = x.getValuesList().size();
if (size == 0) {
print0("()");
} else {
for (int i = 0; i < size; ++i) {
if (i != 0) {
print0(", ");
}
x.getValuesList().get(i).accept(this);
}
}
}
if (x.getQuery() != null) {
x.getQuery().accept(this);
}
return false;
}
@Override
public boolean visit(SQLStartTransactionStatement x) {
print0(ucase ? "START TRANSACTION" : "start transaction");
if (x.isConsistentSnapshot()) {
print0(ucase ? " WITH CONSISTENT SNAPSHOT" : " with consistent snapshot");
}
if (x.getHints() != null && x.getHints().size() > 0) {
print(' ');
printAndAccept(x.getHints(), " ");
}
if (x.isBegin()) {
print0(ucase ? " BEGIN" : " begin");
}
if (x.isWork()) {
print0(ucase ? " WORK" : " work");
}
return false;
}
@Override
public void endVisit(MySqlCommitStatement x) {
}
@Override
public boolean visit(MySqlCommitStatement x) {
print0(ucase ? "COMMIT" : "commit");
if (x.isWork()) {
print0(ucase ? " WORK" : " work");
}
if (x.getChain() != null) {
if (x.getChain().booleanValue()) {
print0(ucase ? " AND CHAIN" : " and chain");
} else {
print0(ucase ? " AND NO CHAIN" : " and no chain");
}
}
if (x.getRelease() != null) {
if (x.getRelease().booleanValue()) {
print0(ucase ? " AND RELEASE" : " and release");
} else {
print0(ucase ? " AND NO RELEASE" : " and no release");
}
}
return false;
}
@Override
public void endVisit(MySqlRollbackStatement x) {
}
@Override
public boolean visit(MySqlRollbackStatement x) {
print0(ucase ? "ROLLBACK" : "rollback");
if (x.getChain() != null) {
if (x.getChain().booleanValue()) {
print0(ucase ? " AND CHAIN" : " and chain");
} else {
print0(ucase ? " AND NO CHAIN" : " and no chain");
}
}
if (x.getRelease() != null) {
if (x.getRelease().booleanValue()) {
print0(ucase ? " AND RELEASE" : " and release");
} else {
print0(ucase ? " AND NO RELEASE" : " and no release");
}
}
if (x.getTo() != null) {
print0(ucase ? " TO " : " to ");
x.getTo().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowColumnsStatement x) {
}
@Override
public boolean visit(MySqlShowColumnsStatement x) {
if (x.isFull()) {
print0(ucase ? "SHOW FULL COLUMNS" : "show full columns");
} else {
print0(ucase ? "SHOW COLUMNS" : "show columns");
}
if (x.getTable() != null) {
print0(ucase ? " FROM " : " from ");
if (x.getDatabase() != null) {
x.getDatabase().accept(this);
print('.');
}
x.getTable().accept(this);
}
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
}
return false;
}
@Override
public boolean visit(SQLShowTablesStatement x) {
if (x.isFull()) {
print0(ucase ? "SHOW FULL TABLES" : "show full tables");
} else {
print0(ucase ? "SHOW TABLES" : "show tables");
}
if (x.getDatabase() != null) {
print0(ucase ? " FROM " : " from ");
x.getDatabase().accept(this);
}
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowDatabasesStatement x) {
}
@Override
public boolean visit(MySqlShowDatabasesStatement x) {
print0(ucase ? "SHOW DATABASES" : "show databases");
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowWarningsStatement x) {
}
@Override
public boolean visit(MySqlShowWarningsStatement x) {
if (x.isCount()) {
print0(ucase ? "SHOW COUNT(*) WARNINGS" : "show count(*) warnings");
} else {
print0(ucase ? "SHOW WARNINGS" : "show warnings");
if (x.getLimit() != null) {
print(' ');
x.getLimit().accept(this);
}
}
return false;
}
@Override
public void endVisit(MySqlShowStatusStatement x) {
}
@Override
public boolean visit(MySqlShowStatusStatement x) {
print0(ucase ? "SHOW " : "show ");
if (x.isGlobal()) {
print0(ucase ? "GLOBAL " : "global ");
}
if (x.isSession()) {
print0(ucase ? "SESSION " : "session ");
}
print0(ucase ? "STATUS" : "status");
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlLoadXmlStatement x) {
}
@Override
public boolean visit(MySqlLoadXmlStatement x) {
print0(ucase ? "LOAD XML " : "load xml ");
if (x.isLowPriority()) {
print0(ucase ? "LOW_PRIORITY " : "low_priority ");
}
if (x.isConcurrent()) {
print0(ucase ? "CONCURRENT " : "concurrent ");
}
if (x.isLocal()) {
print0(ucase ? "LOCAL " : "local ");
}
print0(ucase ? "INFILE " : "infile ");
x.getFileName().accept(this);
if (x.isReplicate()) {
print0(ucase ? " REPLACE " : " replace ");
}
if (x.isIgnore()) {
print0(ucase ? " IGNORE " : " ignore ");
}
print0(ucase ? " INTO TABLE " : " into table ");
x.getTableName().accept(this);
if (x.getCharset() != null) {
print0(ucase ? " CHARSET " : " charset ");
print0(x.getCharset());
}
if (x.getRowsIdentifiedBy() != null) {
print0(ucase ? " ROWS IDENTIFIED BY " : " rows identified by ");
x.getRowsIdentifiedBy().accept(this);
}
if (x.getSetList().size() != 0) {
print0(ucase ? " SET " : " set ");
printAndAccept(x.getSetList(), ", ");
}
return false;
}
@Override
public void endVisit(CobarShowStatus x) {
}
@Override
public boolean visit(CobarShowStatus x) {
print0(ucase ? "SHOW COBAR_STATUS" : "show cobar_status");
return false;
}
@Override
public void endVisit(MySqlKillStatement x) {
}
@Override
public boolean visit(MySqlKillStatement x) {
if (MySqlKillStatement.Type.CONNECTION.equals(x.getType())) {
print0(ucase ? "KILL CONNECTION " : "kill connection ");
} else if (MySqlKillStatement.Type.QUERY.equals(x.getType())) {
print0(ucase ? "KILL QUERY " : "kill query ");
} else {
print0(ucase ? "KILL " : "kill ");
}
printAndAccept(x.getThreadIds(), ", ");
return false;
}
@Override
public void endVisit(MySqlBinlogStatement x) {
}
@Override
public boolean visit(MySqlBinlogStatement x) {
print0(ucase ? "BINLOG " : "binlog ");
x.getExpr().accept(this);
return false;
}
@Override
public void endVisit(MySqlResetStatement x) {
}
@Override
public boolean visit(MySqlResetStatement x) {
print0(ucase ? "RESET " : "reset ");
for (int i = 0; i < x.getOptions().size(); ++i) {
if (i != 0) {
print0(", ");
}
print0(x.getOptions().get(i));
}
return false;
}
@Override
public void endVisit(MySqlCreateUserStatement x) {
}
@Override
public boolean visit(MySqlCreateUserStatement x) {
print0(ucase ? "CREATE USER " : "create user ");
printAndAccept(x.getUsers(), ", ");
return false;
}
@Override
public void endVisit(UserSpecification x) {
}
@Override
public boolean visit(UserSpecification x) {
x.getUser().accept(this);
if (x.getPassword() != null) {
print0(ucase ? " IDENTIFIED BY " : " identified by ");
if (x.isPasswordHash()) {
print0(ucase ? "PASSWORD " : "password ");
}
x.getPassword().accept(this);
}
if (x.getAuthPlugin() != null) {
print0(ucase ? " IDENTIFIED WITH " : " identified with ");
x.getAuthPlugin().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlPartitionByKey x) {
}
@Override
public boolean visit(MySqlPartitionByKey x) {
if (x.isLinear()) {
print0(ucase ? "PARTITION BY LINEAR KEY (" : "partition by linear key (");
} else {
print0(ucase ? "PARTITION BY KEY (" : "partition by key (");
}
printAndAccept(x.getColumns(), ", ");
print(')');
printPartitionsCountAndSubPartitions(x);
return false;
}
//
@Override
public void endVisit(MySqlSelectQueryBlock x) {
}
@Override
public boolean visit(MySqlOutFileExpr x) {
print0(ucase ? "OUTFILE " : "outfile ");
x.getFile().accept(this);
if (x.getCharset() != null) {
print0(ucase ? " CHARACTER SET " : " character set ");
print0(x.getCharset());
}
if (x.getColumnsTerminatedBy() != null || x.getColumnsEnclosedBy() != null || x.getColumnsEscaped() != null) {
print0(ucase ? " COLUMNS" : " columns");
if (x.getColumnsTerminatedBy() != null) {
print0(ucase ? " TERMINATED BY " : " terminated by ");
x.getColumnsTerminatedBy().accept(this);
}
if (x.getColumnsEnclosedBy() != null) {
if (x.isColumnsEnclosedOptionally()) {
print0(ucase ? " OPTIONALLY" : " optionally");
}
print0(ucase ? " ENCLOSED BY " : " enclosed by ");
x.getColumnsEnclosedBy().accept(this);
}
if (x.getColumnsEscaped() != null) {
print0(ucase ? " ESCAPED BY " : " escaped by ");
x.getColumnsEscaped().accept(this);
}
}
if (x.getLinesStartingBy() != null || x.getLinesTerminatedBy() != null) {
print0(ucase ? " LINES" : " lines");
if (x.getLinesStartingBy() != null) {
print0(ucase ? " STARTING BY " : " starting by ");
x.getLinesStartingBy().accept(this);
}
if (x.getLinesTerminatedBy() != null) {
print0(ucase ? " TERMINATED BY " : " terminated by ");
x.getLinesTerminatedBy().accept(this);
}
}
return false;
}
@Override
public void endVisit(MySqlOutFileExpr x) {
}
@Override
public boolean visit(MySqlExplainStatement x) {
String name = x.isDescribe() ? "desc" : "explain";
print0(ucase ? name.toUpperCase() : name);
print(' ');
// tbl_name [col_name | wild]
if (x.getTableName() != null) {
x.getTableName().accept(this);
if (x.getColumnName() != null) {
print(' ');
x.getColumnName().accept(this);
} else if (x.getWild() != null) {
print(' ');
x.getWild().accept(this);
}
} else {
// [explain_type]
String type = x.getType();
if (type != null) {
print0(type);
print(' ');
if ("format".equalsIgnoreCase(type)) {
print0("= ");
print0(x.getFormat());
print(' ');
}
}
// {explainable_stmt | FOR CONNECTION connection_id}
if (x.getConnectionId() != null) {
print0(ucase ? "FOR CONNECTION " : "for connection ");
x.getConnectionId().accept(this);
} else {
x.getStatement().accept(this);
}
}
return false;
}
@Override
public void endVisit(MySqlExplainStatement x) {
}
@Override
public boolean visit(MySqlUpdateStatement x) {
if (x.getReturning() != null && x.getReturning().size() > 0) {
print0(ucase ? "SELECT " : "select ");
printAndAccept(x.getReturning(), ", ");
println();
print0(ucase ? "FROM " : "from ");
}
print0(ucase ? "UPDATE " : "update ");
if (x.isLowPriority()) {
print0(ucase ? "LOW_PRIORITY " : "low_priority ");
}
if (x.isIgnore()) {
print0(ucase ? "IGNORE " : "ignore ");
}
if (x.isCommitOnSuccess()) {
print0(ucase ? "COMMIT_ON_SUCCESS " : "commit_on_success ");
}
if (x.isRollBackOnFail()) {
print0(ucase ? "ROLLBACK_ON_FAIL " : "rollback_on_fail ");
}
if (x.isQueryOnPk()) {
print0(ucase ? "QUEUE_ON_PK " : "queue_on_pk ");
}
if (x.getTargetAffectRow() != null) {
print0(ucase ? "TARGET_AFFECT_ROW " : "target_affect_row ");
x.getTargetAffectRow().accept(this);
print(' ');
}
x.getTableSource().accept(this);
println();
print0(ucase ? "SET " : "set ");
for (int i = 0, size = x.getItems().size(); i < size; ++i) {
if (i != 0) {
print0(", ");
}
x.getItems().get(i).accept(this);
}
if (x.getWhere() != null) {
println();
incrementIndent();
print0(ucase ? "WHERE " : "where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
decrementIndent();
}
if (x.getOrderBy() != null) {
println();
x.getOrderBy().accept(this);
}
if (x.getLimit() != null) {
println();
x.getLimit().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlUpdateStatement x) {
}
@Override
public boolean visit(MySqlSetTransactionStatement x) {
if (x.getGlobal() == null) {
print0(ucase ? "SET TRANSACTION " : "set transaction ");
} else if (x.getGlobal().booleanValue()) {
print0(ucase ? "SET GLOBAL TRANSACTION " : "set global transaction ");
} else {
print0(ucase ? "SET SESSION TRANSACTION " : "set session transaction ");
}
if (x.getIsolationLevel() != null) {
print0(ucase ? "ISOLATION LEVEL " : "isolation level ");
print0(x.getIsolationLevel());
}
if (x.getAccessModel() != null) {
print0(ucase ? "READ " : "read ");
print0(x.getAccessModel());
}
return false;
}
@Override
public void endVisit(MySqlSetTransactionStatement x) {
}
@Override
public boolean visit(MySqlSetNamesStatement x) {
print0(ucase ? "SET NAMES " : "set names ");
if (x.isDefault()) {
print0(ucase ? "DEFAULT" : "default");
} else {
print0(x.getCharSet());
if (x.getCollate() != null) {
print0(ucase ? " COLLATE " : " collate ");
print0(x.getCollate());
}
}
return false;
}
@Override
public void endVisit(MySqlSetNamesStatement x) {
}
@Override
public boolean visit(MySqlSetCharSetStatement x) {
print0(ucase ? "SET CHARACTER SET " : "set character set ");
if (x.isDefault()) {
print0(ucase ? "DEFAULT" : "default");
} else {
print0(x.getCharSet());
if (x.getCollate() != null) {
print0(ucase ? " COLLATE " : " collate ");
print0(x.getCollate());
}
}
return false;
}
@Override
public void endVisit(MySqlSetCharSetStatement x) {
}
@Override
public void endVisit(MySqlShowAuthorsStatement x) {
}
@Override
public boolean visit(MySqlShowAuthorsStatement x) {
print0(ucase ? "SHOW AUTHORS" : "show authors");
return false;
}
@Override
public void endVisit(MySqlShowBinaryLogsStatement x) {
}
@Override
public boolean visit(MySqlShowBinaryLogsStatement x) {
print0(ucase ? "SHOW BINARY LOGS" : "show binary logs");
return false;
}
@Override
public boolean visit(MySqlShowMasterLogsStatement x) {
print0(ucase ? "SHOW MASTER LOGS" : "show master logs");
return false;
}
@Override
public void endVisit(MySqlShowMasterLogsStatement x) {
}
@Override
public boolean visit(MySqlShowCollationStatement x) {
print0(ucase ? "SHOW COLLATION" : "show collation");
if (x.getPattern() != null) {
print0(ucase ? " LIKE " : " like ");
x.getPattern().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowCollationStatement x) {
}
@Override
public boolean visit(MySqlShowBinLogEventsStatement x) {
print0(ucase ? "SHOW BINLOG EVENTS" : "show binlog events");
if (x.getIn() != null) {
print0(ucase ? " IN " : " in ");
x.getIn().accept(this);
}
if (x.getFrom() != null) {
print0(ucase ? " FROM " : " from ");
x.getFrom().accept(this);
}
if (x.getLimit() != null) {
print(' ');
x.getLimit().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowBinLogEventsStatement x) {
}
@Override
public boolean visit(MySqlShowCharacterSetStatement x) {
print0(ucase ? "SHOW CHARACTER SET" : "show character set");
if (x.getPattern() != null) {
print0(ucase ? " LIKE " : " like ");
x.getPattern().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowCharacterSetStatement x) {
}
@Override
public boolean visit(MySqlShowContributorsStatement x) {
print0(ucase ? "SHOW CONTRIBUTORS" : "show contributors");
return false;
}
@Override
public void endVisit(MySqlShowContributorsStatement x) {
}
@Override
public boolean visit(MySqlShowCreateDatabaseStatement x) {
print0(ucase ? "SHOW CREATE DATABASE " : "show create database ");
x.getDatabase().accept(this);
return false;
}
@Override
public void endVisit(MySqlShowCreateDatabaseStatement x) {
}
@Override
public boolean visit(MySqlShowCreateEventStatement x) {
print0(ucase ? "SHOW CREATE EVENT " : "show create event ");
x.getEventName().accept(this);
return false;
}
@Override
public void endVisit(MySqlShowCreateEventStatement x) {
}
@Override
public boolean visit(MySqlShowCreateFunctionStatement x) {
print0(ucase ? "SHOW CREATE FUNCTION " : "show create function ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(MySqlShowCreateFunctionStatement x) {
}
@Override
public boolean visit(MySqlShowCreateProcedureStatement x) {
print0(ucase ? "SHOW CREATE PROCEDURE " : "show create procedure ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(MySqlShowCreateProcedureStatement x) {
}
@Override
public boolean visit(MySqlShowCreateTableStatement x) {
print0(ucase ? "SHOW CREATE TABLE " : "show create table ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(MySqlShowCreateTableStatement x) {
}
@Override
public boolean visit(MySqlShowCreateTriggerStatement x) {
print0(ucase ? "SHOW CREATE TRIGGER " : "show create trigger ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(MySqlShowCreateTriggerStatement x) {
}
@Override
public boolean visit(MySqlShowCreateViewStatement x) {
print0(ucase ? "SHOW CREATE VIEW " : "show create view ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(MySqlShowCreateViewStatement x) {
}
@Override
public boolean visit(MySqlShowEngineStatement x) {
print0(ucase ? "SHOW ENGINE " : "show engine ");
x.getName().accept(this);
print(' ');
print0(x.getOption().name());
return false;
}
@Override
public void endVisit(MySqlShowEngineStatement x) {
}
@Override
public boolean visit(MySqlShowEventsStatement x) {
print0(ucase ? "SHOW EVENTS" : "show events");
if (x.getSchema() != null) {
print0(ucase ? " FROM " : " from ");
x.getSchema().accept(this);
}
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowEventsStatement x) {
}
@Override
public boolean visit(MySqlShowFunctionCodeStatement x) {
print0(ucase ? "SHOW FUNCTION CODE " : "show function code ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(MySqlShowFunctionCodeStatement x) {
}
@Override
public boolean visit(MySqlShowFunctionStatusStatement x) {
print0(ucase ? "SHOW FUNCTION STATUS" : "show function status");
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowFunctionStatusStatement x) {
}
@Override
public boolean visit(MySqlShowEnginesStatement x) {
if (x.isStorage()) {
print0(ucase ? "SHOW STORAGE ENGINES" : "show storage engines");
} else {
print0(ucase ? "SHOW ENGINES" : "show engines");
}
return false;
}
@Override
public void endVisit(MySqlShowEnginesStatement x) {
}
@Override
public boolean visit(MySqlShowErrorsStatement x) {
if (x.isCount()) {
print0(ucase ? "SHOW COUNT(*) ERRORS" : "show count(*) errors");
} else {
print0(ucase ? "SHOW ERRORS" : "show errors");
if (x.getLimit() != null) {
print(' ');
x.getLimit().accept(this);
}
}
return false;
}
@Override
public void endVisit(MySqlShowErrorsStatement x) {
}
@Override
public boolean visit(MySqlShowGrantsStatement x) {
print0(ucase ? "SHOW GRANTS" : "show grants");
if (x.getUser() != null) {
print0(ucase ? " FOR " : " for ");
x.getUser().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowGrantsStatement x) {
}
@Override
public boolean visit(MySqlUserName x) {
print0(x.getUserName());
if (x.getHost() != null) {
print('@');
print0(x.getHost());
}
return false;
}
@Override
public void endVisit(MySqlUserName x) {
}
@Override
public boolean visit(MySqlShowIndexesStatement x) {
print0(ucase ? "SHOW INDEX" : "show index");
if (x.getTable() != null) {
print0(ucase ? " FROM " : " from ");
if (x.getDatabase() != null) {
x.getDatabase().accept(this);
print('.');
}
x.getTable().accept(this);
}
if (x.getHints() != null && x.getHints().size() > 0) {
print(' ');
printAndAccept(x.getHints(), " ");
}
return false;
}
@Override
public void endVisit(MySqlShowIndexesStatement x) {
}
@Override
public boolean visit(MySqlShowKeysStatement x) {
print0(ucase ? "SHOW KEYS" : "show keys");
if (x.getTable() != null) {
print0(ucase ? " FROM " : " from ");
if (x.getDatabase() != null) {
x.getDatabase().accept(this);
print('.');
}
x.getTable().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowKeysStatement x) {
}
@Override
public boolean visit(MySqlShowMasterStatusStatement x) {
print0(ucase ? "SHOW MASTER STATUS" : "show master status");
return false;
}
@Override
public void endVisit(MySqlShowMasterStatusStatement x) {
}
@Override
public boolean visit(MySqlShowOpenTablesStatement x) {
print0(ucase ? "SHOW OPEN TABLES" : "show open tables");
if (x.getDatabase() != null) {
print0(ucase ? " FROM " : " from ");
x.getDatabase().accept(this);
}
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowOpenTablesStatement x) {
}
@Override
public boolean visit(MySqlShowPluginsStatement x) {
print0(ucase ? "SHOW PLUGINS" : "show plugins");
return false;
}
@Override
public void endVisit(MySqlShowPluginsStatement x) {
}
@Override
public boolean visit(MySqlShowPrivilegesStatement x) {
print0(ucase ? "SHOW PRIVILEGES" : "show privileges");
return false;
}
@Override
public void endVisit(MySqlShowPrivilegesStatement x) {
}
@Override
public boolean visit(MySqlShowProcedureCodeStatement x) {
print0(ucase ? "SHOW PROCEDURE CODE " : "show procedure code ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(MySqlShowProcedureCodeStatement x) {
}
@Override
public boolean visit(MySqlShowProcedureStatusStatement x) {
print0(ucase ? "SHOW PROCEDURE STATUS" : "show procedure status");
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowProcedureStatusStatement x) {
}
@Override
public boolean visit(MySqlShowProcessListStatement x) {
if (x.isFull()) {
print0(ucase ? "SHOW FULL PROCESSLIST" : "show full processlist");
} else {
print0(ucase ? "SHOW PROCESSLIST" : "show processlist");
}
return false;
}
@Override
public void endVisit(MySqlShowProcessListStatement x) {
}
@Override
public boolean visit(MySqlShowProfileStatement x) {
print0(ucase ? "SHOW PROFILE" : "show profile");
for (int i = 0; i < x.getTypes().size(); ++i) {
if (i == 0) {
print(' ');
} else {
print0(", ");
}
print0(x.getTypes().get(i).name);
}
if (x.getForQuery() != null) {
print0(ucase ? " FOR QUERY " : " for query ");
x.getForQuery().accept(this);
}
if (x.getLimit() != null) {
print(' ');
x.getLimit().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowProfileStatement x) {
}
@Override
public boolean visit(MySqlShowProfilesStatement x) {
print0(ucase ? "SHOW PROFILES" : "show profiles");
return false;
}
@Override
public void endVisit(MySqlShowProfilesStatement x) {
}
@Override
public boolean visit(MySqlShowRelayLogEventsStatement x) {
print0("SHOW RELAYLOG EVENTS");
if (x.getLogName() != null) {
print0(ucase ? " IN " : " in ");
x.getLogName().accept(this);
}
if (x.getFrom() != null) {
print0(ucase ? " FROM " : " from ");
x.getFrom().accept(this);
}
if (x.getLimit() != null) {
print(' ');
x.getLimit().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowRelayLogEventsStatement x) {
}
@Override
public boolean visit(MySqlShowSlaveHostsStatement x) {
print0(ucase ? "SHOW SLAVE HOSTS" : "show slave hosts");
return false;
}
@Override
public void endVisit(MySqlShowSlaveHostsStatement x) {
}
@Override
public boolean visit(MySqlShowSlaveStatusStatement x) {
print0(ucase ? "SHOW SLAVE STATUS" : "show slave status");
return false;
}
@Override
public void endVisit(MySqlShowSlaveStatusStatement x) {
}
@Override
public boolean visit(MySqlShowTableStatusStatement x) {
print0(ucase ? "SHOW TABLE STATUS" : "show table status");
if (x.getDatabase() != null) {
print0(ucase ? " FROM " : " from ");
x.getDatabase().accept(this);
}
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowTableStatusStatement x) {
}
@Override
public boolean visit(MySqlShowTriggersStatement x) {
print0(ucase ? "SHOW TRIGGERS" : "show triggers");
if (x.getDatabase() != null) {
print0(ucase ? " FROM " : " from ");
x.getDatabase().accept(this);
}
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowTriggersStatement x) {
}
@Override
public boolean visit(MySqlShowVariantsStatement x) {
print0(ucase ? "SHOW " : "show ");
if (x.isGlobal()) {
print0(ucase ? "GLOBAL " : "global ");
}
if (x.isSession()) {
print0(ucase ? "SESSION " : "session ");
}
print0(ucase ? "VARIABLES" : "variables");
if (x.getLike() != null) {
print0(ucase ? " LIKE " : " like ");
x.getLike().accept(this);
}
if (x.getWhere() != null) {
print0(ucase ? " WHERE " : " where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlShowVariantsStatement x) {
}
@Override
public boolean visit(SQLAlterTableStatement x) {
if (x.isIgnore()) {
print0(ucase ? "ALTER IGNORE TABLE " : "alter ignore table ");
} else {
print0(ucase ? "ALTER TABLE " : "alter table ");
}
printTableSourceExpr(x.getName());
incrementIndent();
for (int i = 0; i < x.getItems().size(); ++i) {
SQLAlterTableItem item = x.getItems().get(i);
if (i != 0) {
print(',');
}
println();
item.accept(this);
}
if (x.isRemovePatiting()) {
println();
print0(ucase ? "REMOVE PARTITIONING" : "remove partitioning");
}
if (x.isUpgradePatiting()) {
println();
print0(ucase ? "UPGRADE PARTITIONING" : "upgrade partitioning");
}
if (x.getTableOptions().size() > 0) {
println();
}
decrementIndent();
int i = 0;
for (Map.Entry<String, SQLObject> option : x.getTableOptions().entrySet()) {
String key = option.getKey();
if (i != 0) {
print(' ');
}
print0(ucase ? key : key.toLowerCase());
if ("TABLESPACE".equals(key)) {
print(' ');
option.getValue().accept(this);
continue;
} else if ("UNION".equals(key)) {
print0(" = (");
option.getValue().accept(this);
print(')');
continue;
}
print0(" = ");
option.getValue().accept(this);
i++;
}
return false;
}
@Override
public boolean visit(SQLAlterTableAddColumn x) {
print0(ucase ? "ADD COLUMN " : "add column ");
if (x.getColumns().size() > 1) {
print('(');
}
printAndAccept(x.getColumns(), ", ");
if (x.getFirstColumn() != null) {
print0(ucase ? " FIRST " : " first ");
x.getFirstColumn().accept(this);
} else if (x.getAfterColumn() != null) {
print0(ucase ? " AFTER " : " after ");
x.getAfterColumn().accept(this);
} else if (x.isFirst()) {
print0(ucase ? " FIRST" : " first");
}
if (x.getColumns().size() > 1) {
print(')');
}
return false;
}
@Override
public boolean visit(MySqlRenameTableStatement.Item x) {
x.getName().accept(this);
print0(ucase ? " TO " : " to ");
x.getTo().accept(this);
return false;
}
@Override
public void endVisit(MySqlRenameTableStatement.Item x) {
}
@Override
public boolean visit(MySqlRenameTableStatement x) {
print0(ucase ? "RENAME TABLE " : "rename table ");
printAndAccept(x.getItems(), ", ");
return false;
}
@Override
public void endVisit(MySqlRenameTableStatement x) {
}
@Override
public boolean visit(MySqlUnionQuery x) {
print('(');
x.getLeft().accept(this);
print(')');
println();
print0(ucase ? x.getOperator().name : x.getOperator().name_lcase);
println();
SQLSelectQuery right = x.getRight();
boolean needParen = ! (right instanceof SQLUnionQuery);
if (needParen) {
print('(');
right.accept(this);
print(')');
} else {
right.accept(this);
}
if (x.getOrderBy() != null) {
println();
x.getOrderBy().accept(this);
}
if (x.getLimit() != null) {
println();
x.getLimit().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlUnionQuery x) {
}
@Override
public boolean visit(MySqlUseIndexHint x) {
print0(ucase ? "USE INDEX " : "use index ");
if (x.getOption() != null) {
print0(ucase ? "FOR " : "for ");
print0(x.getOption().name);
print(' ');
}
print('(');
printAndAccept(x.getIndexList(), ", ");
print(')');
return false;
}
@Override
public void endVisit(MySqlUseIndexHint x) {
}
@Override
public boolean visit(MySqlIgnoreIndexHint x) {
print0(ucase ? "IGNORE INDEX " : "ignore index ");
if (x.getOption() != null) {
print0(ucase ? "FOR " : "for ");
print0(ucase ? x.getOption().name : x.getOption().name_lcase);
print(' ');
}
print('(');
printAndAccept(x.getIndexList(), ", ");
print(')');
return false;
}
@Override
public void endVisit(MySqlIgnoreIndexHint x) {
}
public boolean visit(SQLExprTableSource x) {
printTableSourceExpr(x.getExpr());
if (x.getAlias() != null) {
print(' ');
print0(x.getAlias());
}
for (int i = 0; i < x.getHintsSize(); ++i) {
print(' ');
x.getHints().get(i).accept(this);
}
if (x.getPartitionSize() > 0) {
print0(ucase ? " PARTITION (" : " partition (");
printlnAndAccept(x.getPartitions(), ", ");
print(')');
}
return false;
}
@Override
public boolean visit(MySqlLockTableStatement x) {
print0(ucase ? "LOCK TABLES " : "lock tables ");
x.getTableSource().accept(this);
if (x.getLockType() != null) {
print(' ');
print0(x.getLockType().name);
}
if (x.getHints() != null && x.getHints().size() > 0) {
print(' ');
printAndAccept(x.getHints(), " ");
}
return false;
}
@Override
public void endVisit(MySqlLockTableStatement x) {
}
@Override
public boolean visit(MySqlUnlockTablesStatement x) {
print0(ucase ? "UNLOCK TABLES" : "unlock tables");
return false;
}
@Override
public void endVisit(MySqlUnlockTablesStatement x) {
}
@Override
public boolean visit(MySqlForceIndexHint x) {
print0(ucase ? "FORCE INDEX " : "force index ");
if (x.getOption() != null) {
print0(ucase ? "FOR " : "for ");
print0(x.getOption().name);
print(' ');
}
print('(');
printAndAccept(x.getIndexList(), ", ");
print(')');
return false;
}
@Override
public void endVisit(MySqlForceIndexHint x) {
}
@Override
public boolean visit(MySqlAlterTableChangeColumn x) {
print0(ucase ? "CHANGE COLUMN " : "change column ");
x.getColumnName().accept(this);
print(' ');
x.getNewColumnDefinition().accept(this);
if (x.getFirstColumn() != null) {
print0(ucase ? " FIRST " : " first ");
x.getFirstColumn().accept(this);
} else if (x.getAfterColumn() != null) {
print0(ucase ? " AFTER " : " after ");
x.getAfterColumn().accept(this);
} else if (x.isFirst()) {
print0(ucase ? " FIRST" : " first");
}
return false;
}
@Override
public void endVisit(MySqlAlterTableChangeColumn x) {
}
@Override
public boolean visit(MySqlAlterTableModifyColumn x) {
print0(ucase ? "MODIFY COLUMN " : "modify column ");
x.getNewColumnDefinition().accept(this);
if (x.getFirstColumn() != null) {
print0(ucase ? " FIRST " : " first ");
x.getFirstColumn().accept(this);
} else if (x.getAfterColumn() != null) {
print0(ucase ? " AFTER " : " after ");
x.getAfterColumn().accept(this);
} else if (x.isFirst()) {
print0(ucase ? " FIRST" : " first");
}
return false;
}
@Override
public void endVisit(MySqlAlterTableModifyColumn x) {
}
@Override
public boolean visit(MySqlAlterTableCharacter x) {
print0(ucase ? "CHARACTER SET = " : "character set = ");
x.getCharacterSet().accept(this);
if (x.getCollate() != null) {
print0(ucase ? ", COLLATE = " : ", collate = ");
x.getCollate().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlAlterTableCharacter x) {
}
@Override
public boolean visit(MySqlAlterTableOption x) {
print0(x.getName());
print0(" = ");
print0(x.getValue().toString());
return false;
}
@Override
public void endVisit(MySqlAlterTableOption x) {
}
@Override
public void endVisit(MySqlCreateTableStatement x) {
}
@Override
public boolean visit(MySqlHelpStatement x) {
print0(ucase ? "HELP " : "help ");
x.getContent().accept(this);
return false;
}
@Override
public void endVisit(MySqlHelpStatement x) {
}
@Override
public boolean visit(MySqlCharExpr x) {
if (parameterized && ParameterizedOutputVisitorUtils.checkParameterize(x)) {
print('?');
incrementReplaceCunt();
if (this instanceof ExportParameterVisitor || this.parameters != null) {
ExportParameterVisitorUtils.exportParameter(this.parameters, x);
}
return false;
}
print0(x.toString());
return false;
}
@Override
public void endVisit(MySqlCharExpr x) {
}
@Override
public boolean visit(MySqlUnique x) {
if (x.isHasConstaint()) {
print0(ucase ? "CONSTRAINT " : "constraint ");
if (x.getName() != null) {
x.getName().accept(this);
print(' ');
}
}
print0(ucase ? "UNIQUE" : "unique");
if (x.getIndexName() != null) {
print(' ');
x.getIndexName().accept(this);
}
if (x.getIndexType() != null) {
print0(ucase ? " USING " : " using ");
;
print0(x.getIndexType());
}
print0(" (");
printAndAccept(x.getColumns(), ", ");
print(')');
return false;
}
@Override
public boolean visit(MysqlForeignKey x) {
if (x.isHasConstraint()) {
print0(ucase ? "CONSTRAINT " : "constraint ");
if (x.getName() != null) {
x.getName().accept(this);
print(' ');
}
}
print0(ucase ? "FOREIGN KEY" : "foreign key");
if (x.getIndexName() != null) {
print(' ');
x.getIndexName().accept(this);
}
print0(" (");
printAndAccept(x.getReferencingColumns(), ", ");
print(')');
print0(ucase ? " REFERENCES " : " references ");
x.getReferencedTableName().accept(this);
print0(" (");
printAndAccept(x.getReferencedColumns(), ", ");
print(')');
MysqlForeignKey.Match match = x.getReferenceMatch();
if (match != null) {
print0(ucase ? " MATCH " : " match ");
print0(ucase ? match.name : match.name_lcase);
}
if (x.getOnDelete() != null) {
print0(ucase ? " ON DELETE " : " on delete ");
print0(ucase ? x.getOnDelete().name : x.getOnDelete().name_lcase);
}
if (x.getOnDelete() != null) {
print0(ucase ? " ON UPDATE " : " on update ");
print0(ucase ? x.getOnDelete().name : x.getOnDelete().name_lcase);
}
return false;
}
@Override
public void endVisit(MySqlUnique x) {
}
@Override
public boolean visit(MySqlAlterTableDiscardTablespace x) {
print0(ucase ? "DISCARD TABLESPACE" : "discard tablespace");
return false;
}
@Override
public void endVisit(MySqlAlterTableDiscardTablespace x) {
}
@Override
public boolean visit(MySqlAlterTableImportTablespace x) {
print0(ucase ? "IMPORT TABLESPACE" : "import tablespace");
return false;
}
@Override
public void endVisit(MySqlAlterTableImportTablespace x) {
}
@Override
public boolean visit(SQLAssignItem x) {
x.getTarget().accept(this);
if (!"NAMES".equalsIgnoreCase(x.getTarget().toString())) {
print0(" = ");
}
x.getValue().accept(this);
return false;
}
@Override
public boolean visit(TableSpaceOption x) {
x.getName().accept(this);
if (x.getStorage() != null) {
print(' ');
x.getStorage().accept(this);
}
return false;
}
@Override
public void endVisit(TableSpaceOption x) {
}
protected void visitAggreateRest(SQLAggregateExpr aggregateExpr) {
{
SQLOrderBy value = (SQLOrderBy) aggregateExpr.getAttribute("ORDER BY");
if (value != null) {
print(' ');
((SQLObject) value).accept(this);
}
}
{
Object value = aggregateExpr.getAttribute("SEPARATOR");
if (value != null) {
print0(ucase ? " SEPARATOR " : " separator ");
((SQLObject) value).accept(this);
}
}
}
@Override
public boolean visit(MySqlAnalyzeStatement x) {
print0(ucase ? "ANALYZE " : "analyze ");
if (x.isNoWriteToBinlog()) {
print0(ucase ? "NO_WRITE_TO_BINLOG " : "no_write_to_binlog ");
}
if (x.isLocal()) {
print0(ucase ? "LOCAL " : "local ");
}
print0(ucase ? "TABLE " : "table ");
printAndAccept(x.getTableSources(), ", ");
return false;
}
@Override
public void endVisit(MySqlAnalyzeStatement x) {
}
@Override
public boolean visit(MySqlOptimizeStatement x) {
print0(ucase ? "OPTIMIZE " : "optimize ");
if (x.isNoWriteToBinlog()) {
print0(ucase ? "NO_WRITE_TO_BINLOG " : "No_write_to_binlog ");
}
if (x.isLocal()) {
print0(ucase ? "LOCAL " : "local ");
}
print0(ucase ? "TABLE " : "table ");
printAndAccept(x.getTableSources(), ", ");
return false;
}
@Override
public void endVisit(MySqlOptimizeStatement x) {
}
@Override
public boolean visit(MySqlAlterUserStatement x) {
print0(ucase ? "ALTER USER" : "alter user");
for (SQLExpr user : x.getUsers()) {
print(' ');
user.accept(this);
print0(ucase ? " PASSWORD EXPIRE" : " password expire");
}
return false;
}
@Override
public void endVisit(MySqlAlterUserStatement x) {
}
@Override
public boolean visit(MySqlSetPasswordStatement x) {
print0(ucase ? "SET PASSWORD " : "set password ");
if (x.getUser() != null) {
print0(ucase ? "FOR " : "for ");
x.getUser().accept(this);
print(' ');
}
print0("= ");
if (x.getPassword() != null) {
x.getPassword().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlSetPasswordStatement x) {
}
@Override
public boolean visit(MySqlHintStatement x) {
List<SQLCommentHint> hints = x.getHints();
for (SQLCommentHint hint : hints) {
hint.accept(this);
}
return false;
}
@Override
public void endVisit(MySqlHintStatement x) {
}
@Override
public boolean visit(MySqlOrderingExpr x) {
x.getExpr().accept(this);
if (x.getType() != null) {
print(' ');
print0(ucase ? x.getType().name : x.getType().name_lcase);
}
return false;
}
@Override
public void endVisit(MySqlOrderingExpr x) {
}
@Override
public boolean visit(SQLBlockStatement x) {
if (x.getLabelName() != null && !x.getLabelName().equals("")) {
print0(x.getLabelName());
print0(": ");
}
print0(ucase ? "BEGIN" : "begin");
incrementIndent();
println();
for (int i = 0, size = x.getStatementList().size(); i < size; ++i) {
if (i != 0) {
println();
}
SQLStatement stmt = x.getStatementList().get(i);
stmt.setParent(x);
stmt.accept(this);
print(';');
}
decrementIndent();
println();
print0(ucase ? "END" : "end");
if (x.getLabelName() != null && !x.getLabelName().equals("")) {
print(' ');
print0(x.getLabelName());
}
return false;
}
/**
* visit procedure create node
*/
@Override
public boolean visit(SQLCreateProcedureStatement x) {
if (x.isOrReplace()) {
print0(ucase ? "CREATE OR REPLACE PROCEDURE " : "create or replace procedure ");
} else {
print0(ucase ? "CREATE PROCEDURE " : "create procedure ");
}
x.getName().accept(this);
int paramSize = x.getParameters().size();
print0(" (");
if (paramSize > 0) {
incrementIndent();
println();
for (int i = 0; i < paramSize; ++i) {
if (i != 0) {
print0(", ");
println();
}
SQLParameter param = x.getParameters().get(i);
param.accept(this);
}
decrementIndent();
println();
}
print(')');
println();
x.getBlock().setParent(x);
x.getBlock().accept(this);
return false;
}
@Override
public boolean visit(MySqlWhileStatement x) {
if (x.getLabelName() != null && !x.getLabelName().equals("")) {
print0(x.getLabelName());
print0(": ");
}
print0(ucase ? "WHILE " : "while ");
x.getCondition().accept(this);
print0(ucase ? " DO" : " do");
println();
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
SQLStatement item = x.getStatements().get(i);
item.setParent(x);
item.accept(this);
if (i != size - 1) {
println();
}
}
println();
print0(ucase ? "END WHILE" : "end while");
if (x.getLabelName() != null && !x.getLabelName().equals("")) print(' ');
print0(x.getLabelName());
return false;
}
@Override
public void endVisit(MySqlWhileStatement x) {
}
@Override
public boolean visit(SQLIfStatement x) {
print0(ucase ? "IF " : "if ");
x.getCondition().accept(this);
print0(ucase ? " THEN" : " then");
println();
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
SQLStatement item = x.getStatements().get(i);
item.setParent(x);
item.accept(this);
if (i != size - 1) {
println();
}
}
println();
for (SQLIfStatement.ElseIf iterable_element : x.getElseIfList()) {
iterable_element.accept(this);
}
if (x.getElseItem() != null) x.getElseItem().accept(this);
print0(ucase ? "END IF" : "end if");
return false;
}
@Override
public boolean visit(SQLIfStatement.ElseIf x) {
print0(ucase ? "ELSE IF " : "else if ");
x.getCondition().accept(this);
print0(ucase ? " THEN" : " then");
println();
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
SQLStatement item = x.getStatements().get(i);
item.setParent(x);
item.accept(this);
if (i != size - 1) {
println();
}
}
println();
return false;
}
@Override
public boolean visit(SQLIfStatement.Else x) {
print0(ucase ? "ELSE " : "else ");
println();
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
SQLStatement item = x.getStatements().get(i);
item.setParent(x);
item.accept(this);
if (i != size - 1) {
println();
}
}
println();
return false;
}
@Override
public boolean visit(MySqlCaseStatement x) {
print0(ucase ? "CASE " : "case ");
x.getCondition().accept(this);
println();
for (int i = 0; i < x.getWhenList().size(); i++) {
x.getWhenList().get(i).accept(this);
}
if (x.getElseItem() != null) x.getElseItem().accept(this);
print0(ucase ? "END CASE" : "end case");
return false;
}
@Override
public void endVisit(MySqlCaseStatement x) {
}
@Override
public boolean visit(MySqlDeclareStatement x) {
print0(ucase ? "DECLARE " : "declare ");
printAndAccept(x.getVarList(), ", ");
return false;
}
@Override
public void endVisit(MySqlDeclareStatement x) {
}
@Override
public boolean visit(MySqlSelectIntoStatement x) {
x.getSelect().accept(this);
print0(ucase ? " INTO " : " into ");
for (int i = 0; i < x.getVarList().size(); i++) {
x.getVarList().get(i).accept(this);
if (i != x.getVarList().size() - 1) print0(", ");
}
return false;
}
@Override
public void endVisit(MySqlSelectIntoStatement x) {
}
@Override
public boolean visit(MySqlWhenStatement x) {
print0(ucase ? "WHEN " : "when ");
x.getCondition().accept(this);
print0(" THEN");
println();
for (int i = 0; i < x.getStatements().size(); i++) {
x.getStatements().get(i).accept(this);
if (i != x.getStatements().size() - 1) {
println();
}
}
println();
return false;
}
@Override
public void endVisit(MySqlWhenStatement x) {
}
@Override
public boolean visit(SQLLoopStatement x) {
if (x.getLabelName() != null && !x.getLabelName().equals("")) {
print0(x.getLabelName());
print0(": ");
}
print0(ucase ? "LOOP " : "loop ");
println();
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
SQLStatement item = x.getStatements().get(i);
item.setParent(x);
item.accept(this);
if (i != size - 1) {
println();
}
}
println();
print0(ucase ? "END LOOP" : "end loop");
if (x.getLabelName() != null && !x.getLabelName().equals("")) {
print0(" ");
print0(x.getLabelName());
}
return false;
}
@Override
public boolean visit(MySqlLeaveStatement x) {
print0(ucase ? "LEAVE " : "leave ");
print0(x.getLabelName());
return false;
}
@Override
public void endVisit(MySqlLeaveStatement x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(MySqlIterateStatement x) {
print0(ucase ? "ITERATE " : "iterate ");
print0(x.getLabelName());
return false;
}
@Override
public void endVisit(MySqlIterateStatement x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(MySqlRepeatStatement x) {
// TODO Auto-generated method stub
if (x.getLabelName() != null && !x.getLabelName().equals("")) {
print0(x.getLabelName());
print0(": ");
}
print0(ucase ? "REPEAT " : "repeat ");
println();
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
SQLStatement item = x.getStatements().get(i);
item.setParent(x);
item.accept(this);
if (i != size - 1) {
println();
}
}
println();
print0(ucase ? "UNTIL " : "until ");
x.getCondition().accept(this);
println();
print0(ucase ? "END REPEAT" : "end repeat");
if (x.getLabelName() != null && !x.getLabelName().equals("")) {
print(' ');
print0(x.getLabelName());
}
return false;
}
@Override
public void endVisit(MySqlRepeatStatement x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(MySqlCursorDeclareStatement x) {
print0(ucase ? "DECLARE " : "declare ");
print0(x.getCursorName());
print0(ucase ? " CURSOR FOR " : " cursor for ");
x.getSelect().accept(this);
return false;
}
@Override
public void endVisit(MySqlCursorDeclareStatement x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(MySqlUpdateTableSource x) {
MySqlUpdateStatement update = x.getUpdate();
if (update != null) {
update.accept0(this);
}
return false;
}
@Override
public void endVisit(MySqlUpdateTableSource x) {
}
@Override
public boolean visit(MySqlAlterTableAlterColumn x) {
print0(ucase ? "ALTER COLUMN " : "alter column ");
x.getColumn().accept(this);
if (x.getDefaultExpr() != null) {
print0(ucase ? " SET DEFAULT " : " set default ");
x.getDefaultExpr().accept(this);
} else if (x.isDropDefault()) {
print0(ucase ? " DROP DEFAULT" : " drop default");
}
return false;
}
@Override
public void endVisit(MySqlAlterTableAlterColumn x) {
}
@Override
public boolean visit(MySqlSubPartitionByKey x) {
if (x.isLinear()) {
print0(ucase ? "SUBPARTITION BY LINEAR KEY (" : "subpartition by linear key (");
} else {
print0(ucase ? "SUBPARTITION BY KEY (" : "subpartition by key (");
}
printAndAccept(x.getColumns(), ", ");
print(')');
if (x.getSubPartitionsCount() != null) {
print0(ucase ? " SUBPARTITIONS " : " subpartitions ");
x.getSubPartitionsCount().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlSubPartitionByKey x) {
}
@Override
public boolean visit(MySqlSubPartitionByList x) {
print0(ucase ? "SUBPARTITION BY LIST " : "subpartition by list ");
if (x.getExpr() != null) {
print('(');
x.getExpr().accept(this);
print0(") ");
} else {
if (x.getColumns().size() == 1 && Boolean.TRUE.equals(x.getAttribute("ads.subPartitionList"))) {
print('(');
} else {
print0(ucase ? "COLUMNS (" : "columns (");
}
printAndAccept(x.getColumns(), ", ");
print(")");
}
if (x.getOptions().size() != 0) {
println();
print0(ucase ? "SUBPARTITION OPTIONS (" : "subpartition options (");
printAndAccept(x.getOptions(), ", ");
print(')');
}
return false;
}
@Override
public void endVisit(MySqlSubPartitionByList x) {
}
@Override
public boolean visit(MySqlDeclareHandlerStatement x) {
print0(ucase ? "DECLARE " : "declare ");
print0(ucase ? x.getHandleType().toString().toUpperCase() : x.getHandleType().toString().toLowerCase());
print0(ucase ? " HANDLER FOR " : " handler for ");
for (int i = 0; i < x.getConditionValues().size(); i++) {
ConditionValue cv = x.getConditionValues().get(i);
if (cv.getType() == ConditionType.SQLSTATE) {
print0(ucase ? " SQLSTATE " : " sqlstate ");
print0(cv.getValue());
} else if (cv.getType() == ConditionType.MYSQL_ERROR_CODE) {
print0(cv.getValue());
} else if (cv.getType() == ConditionType.SELF) {
print0(cv.getValue());
} else if (cv.getType() == ConditionType.SYSTEM) {
print0(ucase ? cv.getValue().toUpperCase() : cv.getValue().toLowerCase());
}
if (i != x.getConditionValues().size() - 1) {
print0(", ");
}
}
println();
return true;
}
@Override
public void endVisit(MySqlDeclareHandlerStatement x) {
}
@Override
public boolean visit(MySqlDeclareConditionStatement x) {
print0(ucase ? "DECLARE " : "declare ");
print0(x.getConditionName());
print0(ucase ? " CONDITION FOR " : " condition for ");
if (x.getConditionValue().getType() == ConditionType.SQLSTATE) {
print0(ucase ? "SQLSTATE " : "sqlstate ");
print0(x.getConditionValue().getValue());
} else {
print0(x.getConditionValue().getValue());
}
println();
return false;
}
@Override
public void endVisit(MySqlDeclareConditionStatement x) {
}
} //