/*
* 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.oracle.visitor;
import java.util.List;
import com.alibaba.druid.sql.ast.*;
import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellReferenceOption;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.MainModelClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumn;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumnClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRuleOption;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReferenceModelClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement.Rebuild;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleASTVisitor {
private final boolean printPostSemi;
{
this.dbType = JdbcConstants.ORACLE;
}
public OracleOutputVisitor(Appendable appender){
this(appender, true);
}
public OracleOutputVisitor(Appendable appender, boolean printPostSemi){
super(appender);
this.printPostSemi = printPostSemi;
}
public boolean isPrintPostSemi() {
return printPostSemi;
}
public void postVisit(SQLObject x) {
if (!(x instanceof SQLStatement)) {
return;
}
SQLObject parent = x.getParent();
if ((!isPrintPostSemi()) //
&& (!(parent instanceof SQLBlockStatement))
&& (!(parent instanceof OracleForStatement))) {
return;
}
if (x instanceof OraclePLSQLCommitStatement
|| x instanceof OracleLabelStatement
|| x instanceof OracleExceptionStatement.Item
|| x instanceof OracleExceptionStatement) {
return;
}
if (parent instanceof SQLCreateProcedureStatement
|| parent instanceof OracleExceptionStatement.Item
|| parent instanceof OracleForStatement) {
return;
}
if (isPrettyFormat()) {
if (parent != null) {
print(';');
} else {
println(";");
}
}
}
private void printHints(List<SQLHint> hints) {
if (hints.size() > 0) {
print0("/*+ ");
printAndAccept(hints, ", ");
print0(" */");
}
}
public boolean visit(SQLAllColumnExpr x) {
print('*');
return false;
}
public boolean visit(OracleAnalytic x) {
print0(ucase ? "OVER (" : "over (");
boolean space = false;
if (x.getPartitionBy().size() > 0) {
print0(ucase ? "PARTITION BY " : "partition by ");
printAndAccept(x.getPartitionBy(), ", ");
space = true;
}
if (x.getOrderBy() != null) {
if (space) {
print(' ');
}
x.getOrderBy().accept(this);
space = true;
}
if (x.getWindowing() != null) {
if (space) {
print(' ');
}
x.getWindowing().accept(this);
}
print(')');
return false;
}
public boolean visit(OracleAnalyticWindowing x) {
print0(x.getType().name().toUpperCase());
print(' ');
x.getExpr().accept(this);
return false;
}
public boolean visit(OracleDbLinkExpr x) {
x.getExpr().accept(this);
print('@');
print0(x.getDbLink());
return false;
}
public boolean visit(OracleDeleteStatement x) {
print0(ucase ? "DELETE " : "delete ");
SQLTableSource tableSource = x.getTableSource();
if (x.getHints().size() > 0) {
printAndAccept(x.getHints(), ", ");
print(' ');
}
print0(ucase ? "FROM " : "from ");
if (x.isOnly()) {
print0(ucase ? "ONLY (" : "only (");
x.getTableName().accept(this);
print(')');
printAlias(x.getAlias());
} else {
x.getTableSource().accept(this);
}
if (x.getWhere() != null) {
println();
incrementIndent();
print0(ucase ? "WHERE " : "where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
decrementIndent();
}
if (x.getReturning() != null) {
println();
x.getReturning().accept(this);
}
return false;
}
public boolean visit(OracleIntervalExpr x) {
if (x.getValue() instanceof SQLLiteralExpr) {
print0(ucase ? "INTERVAL " : "interval ");
x.getValue().accept(this);
print(' ');
} else {
print('(');
x.getValue().accept(this);
print0(") ");
}
print0(x.getType().name());
if (x.getPrecision() != null) {
print('(');
print(x.getPrecision().intValue());
if (x.getFactionalSecondsPrecision() != null) {
print0(", ");
print(x.getFactionalSecondsPrecision().intValue());
}
print(')');
}
if (x.getToType() != null) {
print0(ucase ? " TO " : " to ");
print0(x.getToType().name());
if (x.getToFactionalSecondsPrecision() != null) {
print('(');
print(x.getToFactionalSecondsPrecision().intValue());
print(')');
}
}
return false;
}
public boolean visit(OracleOuterExpr x) {
x.getExpr().accept(this);
print0("(+)");
return false;
}
public boolean visit(OraclePLSQLCommitStatement astNode) {
print('/');
println();
return false;
}
public boolean visit(SQLSelect x) {
if (x instanceof OracleSelect) {
return visit((OracleSelect) x);
}
return super.visit(x);
}
public boolean visit(OracleSelect x) {
if (x.getWithSubQuery() != null) {
x.getWithSubQuery().accept(this);
println();
}
SQLSelectQuery query = x.getQuery();
query.accept(this);
if (x.getRestriction() != null) {
print(' ');
x.getRestriction().accept(this);
}
if (x.getForUpdate() != null) {
println();
x.getForUpdate().accept(this);
}
SQLOrderBy orderBy = x.getOrderBy();
if (orderBy != null) {
boolean hasFirst = false;
if (query instanceof SQLSelectQueryBlock) {
SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query;
hasFirst = queryBlock.getFirst() != null;
}
if (!hasFirst) {
println();
orderBy.accept(this);
}
}
return false;
}
public boolean visit(OracleSelectForUpdate x) {
print0(ucase ? "FOR UPDATE" : "for update");
if (x.getOf().size() > 0) {
print('(');
printAndAccept(x.getOf(), ", ");
print(')');
}
if (x.isNotWait()) {
print0(ucase ? " NOWAIT" : " nowait");
} else if (x.isSkipLocked()) {
print0(ucase ? " SKIP LOCKED" : " skip locked");
} else if (x.getWait() != null) {
print0(ucase ? " WAIT " : " wait ");
x.getWait().accept(this);
}
return false;
}
public boolean visit(OracleSelectJoin x) {
x.getLeft().accept(this);
if (x.getJoinType() == JoinType.COMMA) {
print0(", ");
x.getRight().accept(this);
} else {
boolean isRoot = x.getParent() instanceof SQLSelectQueryBlock;
if (isRoot) {
incrementIndent();
}
println();
print0(ucase ? x.getJoinType().name : x.getJoinType().name_lcase);
print(' ');
x.getRight().accept(this);
if (isRoot) {
decrementIndent();
}
if (x.getCondition() != null) {
print0(ucase ? " ON " : " on ");
x.getCondition().accept(this);
print(' ');
}
if (x.getUsing().size() > 0) {
print0(ucase ? " USING (" : " using (");
printAndAccept(x.getUsing(), ", ");
print(')');
}
if (x.getFlashback() != null) {
println();
x.getFlashback().accept(this);
}
}
return false;
}
public boolean visit(SQLSelectOrderByItem x) {
x.getExpr().accept(this);
if (x.getType() != null) {
print(' ');
String typeName = x.getType().name();
print0(ucase ? typeName.toUpperCase() : typeName.toLowerCase());
}
if (x.getNullsOrderType() != null) {
print(' ');
print0(x.getNullsOrderType().toFormalString());
}
return false;
}
public boolean visit(OracleSelectPivot x) {
print0(ucase ? "PIVOT" : "pivot");
if (x.isXml()) {
print0(ucase ? " XML" : " xml");
}
print0(" (");
printAndAccept(x.getItems(), ", ");
if (x.getPivotFor().size() > 0) {
print0(ucase ? " FOR " : " for ");
if (x.getPivotFor().size() == 1) {
((SQLExpr) x.getPivotFor().get(0)).accept(this);
} else {
print('(');
printAndAccept(x.getPivotFor(), ", ");
print(')');
}
}
if (x.getPivotIn().size() > 0) {
print0(ucase ? " IN (" : " in (");
printAndAccept(x.getPivotIn(), ", ");
print(')');
}
print(')');
return false;
}
public boolean visit(OracleSelectPivot.Item x) {
x.getExpr().accept(this);
if ((x.getAlias() != null) && (x.getAlias().length() > 0)) {
print0(ucase ? " AS " : " as ");
print0(x.getAlias());
}
return false;
}
public boolean visit(SQLSelectQueryBlock select) {
if (select instanceof OracleSelectQueryBlock) {
return visit((OracleSelectQueryBlock) select);
}
return super.visit(select);
}
public boolean visit(OracleSelectQueryBlock x) {
print0(ucase ? "SELECT " : "select ");
if (x.getHints().size() > 0) {
printAndAccept(x.getHints(), ", ");
print(' ');
}
if (SQLSetQuantifier.ALL == x.getDistionOption()) {
print0(ucase ? "ALL " : "all ");
} else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) {
print0(ucase ? "DISTINCT " : "distinct ");
} else if (SQLSetQuantifier.UNIQUE == x.getDistionOption()) {
print0(ucase ? "UNIQUE " : "unique ");
}
printSelectList(x.getSelectList());
if (x.getInto() != null) {
println();
print0(ucase ? "INTO " : "into ");
x.getInto().accept(this);
}
println();
print0(ucase ? "FROM " : "from ");
if (x.getFrom() == null) {
print0(ucase ? "DUAL" : "dual");
} else {
x.getFrom().setParent(x);
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.getModelClause() != null) {
println();
x.getModelClause().accept(this);
}
printFetchFirst(x);
return false;
}
public boolean visit(OracleSelectRestriction.CheckOption x) {
print0(ucase ? "CHECK OPTION" : "check option");
if (x.getConstraint() != null) {
print(' ');
x.getConstraint().accept(this);
}
return false;
}
public boolean visit(OracleSelectRestriction.ReadOnly x) {
print0(ucase ? "READ ONLY" : "read only");
return false;
}
public boolean visit(OracleSelectSubqueryTableSource x) {
print('(');
incrementIndent();
println();
x.getSelect().accept(this);
decrementIndent();
println();
print(')');
if (x.getPivot() != null) {
println();
x.getPivot().accept(this);
}
if (x.getFlashback() != null) {
println();
x.getFlashback().accept(this);
}
if ((x.getAlias() != null) && (x.getAlias().length() != 0)) {
print(' ');
print0(x.getAlias());
}
return false;
}
public boolean visit(OracleSelectTableReference x) {
if (x.isOnly()) {
print0(ucase ? "ONLY (" : "only (");
printTableSourceExpr(x.getExpr());
if (x.getPartition() != null) {
print(' ');
x.getPartition().accept(this);
}
print(')');
} else {
printTableSourceExpr(x.getExpr());
if (x.getPartition() != null) {
print(' ');
x.getPartition().accept(this);
}
}
if (x.getHints().size() > 0) {
this.printHints(x.getHints());
}
if (x.getSampleClause() != null) {
print(' ');
x.getSampleClause().accept(this);
}
if (x.getPivot() != null) {
println();
x.getPivot().accept(this);
}
if (x.getFlashback() != null) {
println();
x.getFlashback().accept(this);
}
printAlias(x.getAlias());
return false;
}
public boolean visit(OracleSelectUnPivot x) {
print0(ucase ? "UNPIVOT" : "unpivot");
if (x.getNullsIncludeType() != null) {
print(' ');
print0(OracleSelectUnPivot.NullsIncludeType.toString(x.getNullsIncludeType(), ucase));
}
print0(" (");
if (x.getItems().size() == 1) {
((SQLExpr) x.getItems().get(0)).accept(this);
} else {
print0(" (");
printAndAccept(x.getItems(), ", ");
print(')');
}
if (x.getPivotFor().size() > 0) {
print0(ucase ? " FOR " : " for ");
if (x.getPivotFor().size() == 1) {
((SQLExpr) x.getPivotFor().get(0)).accept(this);
} else {
print('(');
printAndAccept(x.getPivotFor(), ", ");
print(')');
}
}
if (x.getPivotIn().size() > 0) {
print0(ucase ? " IN (" : " in (");
printAndAccept(x.getPivotIn(), ", ");
print(')');
}
print(')');
return false;
}
public boolean visit(OracleUpdateStatement x) {
print0(ucase ? "UPDATE " : "update ");
if (x.getHints().size() > 0) {
printAndAccept(x.getHints(), ", ");
print(' ');
}
if (x.isOnly()) {
print0(ucase ? "ONLY (" : "only (");
x.getTableSource().accept(this);
print(')');
} else {
x.getTableSource().accept(this);
}
printAlias(x.getAlias());
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();
print0(ucase ? "WHERE " : "where ");
incrementIndent();
x.getWhere().setParent(x);
x.getWhere().accept(this);
decrementIndent();
}
if (x.getReturning().size() > 0) {
println();
print0(ucase ? "RETURNING " : "returning ");
printAndAccept(x.getReturning(), ", ");
print0(ucase ? " INTO " : " into ");
printAndAccept(x.getReturningInto(), ", ");
}
return false;
}
@Override
public void endVisit(OraclePLSQLCommitStatement astNode) {
}
@Override
public void endVisit(OracleAnalytic x) {
}
@Override
public void endVisit(OracleAnalyticWindowing x) {
}
@Override
public void endVisit(OracleDbLinkExpr x) {
}
@Override
public void endVisit(OracleDeleteStatement x) {
}
@Override
public void endVisit(OracleIntervalExpr x) {
}
@Override
public void endVisit(SQLMethodInvokeExpr x) {
}
@Override
public void endVisit(OracleOuterExpr x) {
}
@Override
public void endVisit(OracleSelectForUpdate x) {
}
@Override
public void endVisit(OracleSelectJoin x) {
}
@Override
public void endVisit(OracleSelectPivot x) {
}
@Override
public void endVisit(Item x) {
}
@Override
public void endVisit(CheckOption x) {
}
@Override
public void endVisit(ReadOnly x) {
}
@Override
public void endVisit(OracleSelectSubqueryTableSource x) {
}
@Override
public void endVisit(OracleSelectUnPivot x) {
}
@Override
public void endVisit(OracleUpdateStatement x) {
}
@Override
public boolean visit(SampleClause x) {
print0(ucase ? "SAMPLE " : "sample ");
if (x.isBlock()) {
print0(ucase ? "BLOCK " : "block ");
}
print('(');
printAndAccept(x.getPercent(), ", ");
print(')');
if (x.getSeedValue() != null) {
print0(ucase ? " SEED (" : " seed (");
x.getSeedValue().accept(this);
print(')');
}
return false;
}
@Override
public void endVisit(SampleClause x) {
}
@Override
public void endVisit(OracleSelectTableReference x) {
}
@Override
public boolean visit(PartitionExtensionClause x) {
if (x.isSubPartition()) {
print0(ucase ? "SUBPARTITION " : "subpartition ");
} else {
print0(ucase ? "PARTITION " : "partition ");
}
if (x.getPartition() != null) {
print('(');
x.getPartition().accept(this);
print(')');
} else {
print0(ucase ? "FOR (" : "for (");
printAndAccept(x.getFor(), ",");
print(')');
}
return false;
}
@Override
public void endVisit(PartitionExtensionClause x) {
}
@Override
public boolean visit(VersionsFlashbackQueryClause x) {
print0(ucase ? "VERSIONS BETWEEN " : "versions between ");
print0(x.getType().name());
print(' ');
x.getBegin().accept(this);
print0(ucase ? " AND " : " and ");
x.getEnd().accept(this);
return false;
}
@Override
public void endVisit(VersionsFlashbackQueryClause x) {
}
@Override
public boolean visit(AsOfFlashbackQueryClause x) {
print0(ucase ? "AS OF " : "as of ");
print0(x.getType().name());
print0(" (");
x.getExpr().accept(this);
print(')');
return false;
}
@Override
public void endVisit(AsOfFlashbackQueryClause x) {
}
@Override
public boolean visit(OracleWithSubqueryEntry x) {
x.getName().accept(this);
if (x.getColumns().size() > 0) {
print0(" (");
printAndAccept(x.getColumns(), ", ");
print(')');
}
println();
print0(ucase ? "AS" : "as");
println();
print('(');
incrementIndent();
println();
x.getSubQuery().accept(this);
decrementIndent();
println();
print(')');
if (x.getSearchClause() != null) {
println();
x.getSearchClause().accept(this);
}
if (x.getCycleClause() != null) {
println();
x.getCycleClause().accept(this);
}
return false;
}
@Override
public void endVisit(OracleWithSubqueryEntry x) {
}
@Override
public boolean visit(SearchClause x) {
print0(ucase ? "SEARCH " : "search ");
print0(x.getType().name());
print0(ucase ? " FIRST BY " : " first by ");
printAndAccept(x.getItems(), ", ");
print0(ucase ? " SET " : " set ");
x.getOrderingColumn().accept(this);
return false;
}
@Override
public void endVisit(SearchClause x) {
}
@Override
public boolean visit(CycleClause x) {
print0(ucase ? "CYCLE " : "cycle ");
printAndAccept(x.getAliases(), ", ");
print0(ucase ? " SET " : " set ");
x.getMark().accept(this);
print0(ucase ? " TO " : " to ");
x.getValue().accept(this);
print0(ucase ? " DEFAULT " : " default ");
x.getDefaultValue().accept(this);
return false;
}
@Override
public void endVisit(CycleClause x) {
}
@Override
public boolean visit(OracleBinaryFloatExpr x) {
print0(x.getValue().toString());
print('F');
return false;
}
@Override
public void endVisit(OracleBinaryFloatExpr x) {
}
@Override
public boolean visit(OracleBinaryDoubleExpr x) {
print0(x.getValue().toString());
print('D');
return false;
}
@Override
public void endVisit(OracleBinaryDoubleExpr x) {
}
@Override
public void endVisit(OracleSelect x) {
}
@Override
public boolean visit(OracleCursorExpr x) {
print0(ucase ? "CURSOR(" : "cursor(");
incrementIndent();
println();
x.getQuery().accept(this);
decrementIndent();
println();
print(')');
return false;
}
@Override
public void endVisit(OracleCursorExpr x) {
}
@Override
public boolean visit(OracleIsSetExpr x) {
x.getNestedTable().accept(this);
print0(ucase ? " IS A SET" : " is a set");
return false;
}
@Override
public void endVisit(OracleIsSetExpr x) {
}
@Override
public boolean visit(ReturnRowsClause x) {
if (x.isAll()) {
print0(ucase ? "RETURN ALL ROWS" : "return all rows");
} else {
print0(ucase ? "RETURN UPDATED ROWS" : "return updated rows");
}
return false;
}
@Override
public void endVisit(ReturnRowsClause x) {
}
@Override
public boolean visit(ModelClause x) {
print0(ucase ? "MODEL" : "model");
incrementIndent();
for (CellReferenceOption opt : x.getCellReferenceOptions()) {
print(' ');
print0(opt.name);
}
if (x.getReturnRowsClause() != null) {
print(' ');
x.getReturnRowsClause().accept(this);
}
for (ReferenceModelClause item : x.getReferenceModelClauses()) {
print(' ');
item.accept(this);
}
x.getMainModel().accept(this);
decrementIndent();
return false;
}
@Override
public void endVisit(ModelClause x) {
}
@Override
public boolean visit(MainModelClause x) {
if (x.getMainModelName() != null) {
print0(ucase ? " MAIN " : " main ");
x.getMainModelName().accept(this);
}
println();
x.getModelColumnClause().accept(this);
for (CellReferenceOption opt : x.getCellReferenceOptions()) {
println();
print0(opt.name);
}
println();
x.getModelRulesClause().accept(this);
return false;
}
@Override
public void endVisit(MainModelClause x) {
}
@Override
public boolean visit(ModelColumnClause x) {
if (x.getQueryPartitionClause() != null) {
x.getQueryPartitionClause().accept(this);
println();
}
print0(ucase ? "DIMENSION BY (" : "dimension by (");
printAndAccept(x.getDimensionByColumns(), ", ");
print(')');
println();
print0(ucase ? "MEASURES (" : "measures (");
printAndAccept(x.getMeasuresColumns(), ", ");
print(')');
return false;
}
@Override
public void endVisit(ModelColumnClause x) {
}
@Override
public boolean visit(QueryPartitionClause x) {
print0(ucase ? "PARTITION BY (" : "partition by (");
printAndAccept(x.getExprList(), ", ");
print(')');
return false;
}
@Override
public void endVisit(QueryPartitionClause x) {
}
@Override
public boolean visit(ModelColumn x) {
x.getExpr().accept(this);
if (x.getAlias() != null) {
print(' ');
print0(x.getAlias());
}
return false;
}
@Override
public void endVisit(ModelColumn x) {
}
@Override
public boolean visit(ModelRulesClause x) {
if (x.getOptions().size() > 0) {
print0(ucase ? "RULES" : "rules");
for (ModelRuleOption opt : x.getOptions()) {
print(' ');
print0(opt.name);
}
}
if (x.getIterate() != null) {
print0(ucase ? " ITERATE (" : " iterate (");
x.getIterate().accept(this);
print(')');
if (x.getUntil() != null) {
print0(ucase ? " UNTIL (" : " until (");
x.getUntil().accept(this);
print(')');
}
}
print0(" (");
printAndAccept(x.getCellAssignmentItems(), ", ");
print(')');
return false;
}
@Override
public void endVisit(ModelRulesClause x) {
}
@Override
public boolean visit(CellAssignmentItem x) {
if (x.getOption() != null) {
print0(x.getOption().name);
print(' ');
}
x.getCellAssignment().accept(this);
if (x.getOrderBy() != null) {
print(' ');
x.getOrderBy().accept(this);
}
print0(" = ");
x.getExpr().accept(this);
return false;
}
@Override
public void endVisit(CellAssignmentItem x) {
}
@Override
public boolean visit(CellAssignment x) {
x.getMeasureColumn().accept(this);
print0("[");
printAndAccept(x.getConditions(), ", ");
print0("]");
return false;
}
@Override
public void endVisit(CellAssignment x) {
}
@Override
public boolean visit(OracleReturningClause x) {
print0(ucase ? "RETURNING " : "returning ");
printAndAccept(x.getItems(), ", ");
print0(ucase ? " INTO " : " into ");
printAndAccept(x.getValues(), ", ");
return false;
}
@Override
public void endVisit(OracleReturningClause x) {
}
@Override
public boolean visit(OracleInsertStatement x) {
//visit((SQLInsertStatement) x);
print0(ucase ? "INSERT " : "insert ");
if (x.getHints().size() > 0) {
printAndAccept(x.getHints(), ", ");
print(' ');
}
print0(ucase ? "INTO " : "into ");
x.getTableSource().accept(this);
printInsertColumns(x.getColumns());
if (x.getValues() != null) {
println();
print0(ucase ? "VALUES " : "values ");
x.getValues().accept(this);
} else {
if (x.getQuery() != null) {
println();
x.getQuery().setParent(x);
x.getQuery().accept(this);
}
}
if (x.getReturning() != null) {
println();
x.getReturning().accept(this);
}
if (x.getErrorLogging() != null) {
println();
x.getErrorLogging().accept(this);
}
return false;
}
@Override
public void endVisit(OracleInsertStatement x) {
endVisit((SQLInsertStatement) x);
}
@Override
public boolean visit(InsertIntoClause x) {
print0(ucase ? "INTO " : "into ");
x.getTableSource().accept(this);
if (x.getColumns().size() > 0) {
incrementIndent();
println();
print('(');
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.getValues() != null) {
println();
print0(ucase ? "VALUES " : "values ");
x.getValues().accept(this);
} else {
if (x.getQuery() != null) {
println();
x.getQuery().setParent(x);
x.getQuery().accept(this);
}
}
return false;
}
@Override
public void endVisit(InsertIntoClause x) {
}
@Override
public boolean visit(OracleMultiInsertStatement x) {
print0(ucase ? "INSERT " : "insert ");
if (x.getHints().size() > 0) {
this.printHints(x.getHints());
}
if (x.getOption() != null) {
print0(x.getOption().name());
print(' ');
}
for (int i = 0, size = x.getEntries().size(); i < size; ++i) {
incrementIndent();
println();
x.getEntries().get(i).accept(this);
decrementIndent();
}
println();
x.getSubQuery().accept(this);
return false;
}
@Override
public void endVisit(OracleMultiInsertStatement x) {
}
@Override
public boolean visit(ConditionalInsertClause x) {
for (int i = 0, size = x.getItems().size(); i < size; ++i) {
if (i != 0) {
println();
}
ConditionalInsertClauseItem item = x.getItems().get(i);
item.accept(this);
}
if (x.getElseItem() != null) {
println();
print0(ucase ? "ELSE" : "else");
incrementIndent();
println();
x.getElseItem().accept(this);
decrementIndent();
}
return false;
}
@Override
public void endVisit(ConditionalInsertClause x) {
}
@Override
public boolean visit(ConditionalInsertClauseItem x) {
print0(ucase ? "WHEN " : "when ");
x.getWhen().accept(this);
print0(ucase ? " THEN" : " then");
incrementIndent();
println();
x.getThen().accept(this);
decrementIndent();
return false;
}
@Override
public void endVisit(ConditionalInsertClauseItem x) {
}
@Override
public void endVisit(OracleSelectQueryBlock x) {
}
@Override
public boolean visit(SQLBlockStatement x) {
if (x.getParameters().size() != 0) {
incrementIndent();
if (x.getParent() instanceof SQLCreateProcedureStatement) {
printIndent();
}
if (!(x.getParent() instanceof SQLCreateProcedureStatement)) {
print0(ucase ? "DECLARE" : "declare");
println();
}
for (int i = 0, size = x.getParameters().size(); i < size; ++i) {
if (i != 0) {
println();
}
SQLParameter param = x.getParameters().get(i);
param.accept(this);
print(';');
}
decrementIndent();
println();
}
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);
}
decrementIndent();
SQLStatement exception = x.getException();
if (exception != null) {
println();
exception.accept(this);
}
println();
print0(ucase ? "END" : "end");
return false;
}
@Override
public void endVisit(SQLBlockStatement x) {
}
@Override
public boolean visit(OracleLockTableStatement x) {
print0(ucase ? "LOCK TABLE " : "lock table ");
x.getTable().accept(this);
print0(ucase ? " IN " : " in ");
print0(x.getLockMode().name());
print0(ucase ? " MODE " : " mode ");
if (x.isNoWait()) {
print0(ucase ? "NOWAIT" : "nowait");
} else if (x.getWait() != null) {
print0(ucase ? "WAIT " : "wait ");
x.getWait().accept(this);
}
return false;
}
@Override
public void endVisit(OracleLockTableStatement x) {
}
@Override
public boolean visit(OracleAlterSessionStatement x) {
print0(ucase ? "ALTER SESSION SET " : "alter session set ");
printAndAccept(x.getItems(), ", ");
return false;
}
@Override
public void endVisit(OracleAlterSessionStatement x) {
}
@Override
public boolean visit(OracleExprStatement x) {
x.getExpr().accept(this);
return false;
}
@Override
public void endVisit(OracleExprStatement x) {
}
@Override
public boolean visit(OracleDatetimeExpr x) {
x.getExpr().accept(this);
SQLExpr timeZone = x.getTimeZone();
if (timeZone instanceof SQLIdentifierExpr) {
if (((SQLIdentifierExpr) timeZone).getName().equalsIgnoreCase("LOCAL")) {
print0(ucase ? " AT LOCAL" : "alter session set ");
return false;
}
}
print0(ucase ? " AT TIME ZONE " : " at time zone ");
timeZone.accept(this);
return false;
}
@Override
public void endVisit(OracleDatetimeExpr x) {
}
@Override
public boolean visit(OracleSysdateExpr x) {
print0(ucase ? "SYSDATE" : "sysdate");
if (x.getOption() != null) {
print('@');
print0(x.getOption());
}
return false;
}
@Override
public void endVisit(OracleSysdateExpr x) {
}
@Override
public void endVisit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) {
}
@Override
public boolean visit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) {
print0(ucase ? "WHEN " : "when ");
x.getWhen().accept(this);
print0(ucase ? " THEN" : " then");
incrementIndent();
if (x.getStatements().size() > 1) {
println();
} else {
print(' ');
}
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
if (i != 0 && size > 1) {
println();
}
SQLStatement stmt = x.getStatements().get(i);
stmt.accept(this);
print(";");
}
decrementIndent();
return false;
}
@Override
public boolean visit(OracleExceptionStatement x) {
print0(ucase ? "EXCEPTION" : "exception");
incrementIndent();
List<OracleExceptionStatement.Item> items = x.getItems();
for (int i = 0, size = items.size(); i < size; ++i) {
println();
OracleExceptionStatement.Item item = items.get(i);
item.accept(this);
}
decrementIndent();
return false;
}
@Override
public void endVisit(OracleExceptionStatement x) {
}
@Override
public boolean visit(OracleArgumentExpr x) {
print0(x.getArgumentName());
print0(" => ");
x.getValue().accept(this);
return false;
}
@Override
public void endVisit(OracleArgumentExpr x) {
}
@Override
public boolean visit(OracleSetTransactionStatement x) {
if (x.isReadOnly()) {
print0(ucase ? "SET TRANSACTION READ ONLY NAME " : "set transaction read only name ");
} else {
print0(ucase ? "SET TRANSACTION NAME " : "set transaction name ");
}
x.getName().accept(this);
return false;
}
@Override
public void endVisit(OracleSetTransactionStatement x) {
}
@Override
public boolean visit(OracleExplainStatement x) {
print0(ucase ? "EXPLAIN PLAN" : "explain plan");
incrementIndent();
println();
if (x.getStatementId() != null) {
print0(ucase ? "SET STATEMENT_ID = " : "set statement_id = ");
x.getStatementId().accept(this);
println();
}
if (x.getInto() != null) {
print0(ucase ? "INTO " : "into ");
x.getInto().accept(this);
println();
}
print0(ucase ? "FRO" : "fro");
println();
x.getStatement().accept(this);
decrementIndent();
return false;
}
@Override
public void endVisit(OracleExplainStatement x) {
}
@Override
public boolean visit(OracleAlterProcedureStatement x) {
print0(ucase ? "ALTER PROCEDURE " : "alter procedure ");
x.getName().accept(this);
if (x.isCompile()) {
print0(ucase ? " COMPILE" : " compile");
}
if (x.isReuseSettings()) {
print0(ucase ? " REUSE SETTINGS" : " reuse settings");
}
return false;
}
@Override
public void endVisit(OracleAlterProcedureStatement x) {
}
@Override
public boolean visit(OracleAlterTableDropPartition x) {
print0(ucase ? "DROP PARTITION " : "drop partition ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(OracleAlterTableDropPartition x) {
}
@Override
public boolean visit(SQLAlterTableStatement x) {
print0(ucase ? "ALTER TABLE " : "alter table ");
printTableSourceExpr(x.getName());
incrementIndent();
for (SQLAlterTableItem item : x.getItems()) {
println();
item.accept(this);
}
if (x.isUpdateGlobalIndexes()) {
println();
print0(ucase ? "UPDATE GLOABL INDEXES" : "update gloabl indexes");
}
decrementIndent();
return false;
}
@Override
public boolean visit(OracleAlterTableTruncatePartition x) {
print0(ucase ? "TRUNCATE PARTITION " : "truncate partition ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(OracleAlterTableTruncatePartition x) {
}
@Override
public boolean visit(TableSpaceItem x) {
print0(ucase ? "TABLESPACE " : "tablespace ");
x.getTablespace().accept(this);
return false;
}
@Override
public void endVisit(TableSpaceItem x) {
}
@Override
public boolean visit(UpdateIndexesClause x) {
print0(ucase ? "UPDATE INDEXES" : "update indexes");
if (x.getItems().size() > 0) {
print('(');
printAndAccept(x.getItems(), ", ");
print(')');
}
return false;
}
@Override
public void endVisit(UpdateIndexesClause x) {
}
@Override
public boolean visit(OracleAlterTableSplitPartition x) {
print0(ucase ? "SPLIT PARTITION " : "split partition ");
x.getName().accept(this);
if (x.getAt().size() > 0) {
incrementIndent();
println();
print0(ucase ? "AT (" : "at (");
printAndAccept(x.getAt(), ", ");
print(')');
decrementIndent();
}
if (x.getInto().size() > 0) {
println();
incrementIndent();
print0(ucase ? "INTO (" : "into (");
printAndAccept(x.getInto(), ", ");
print(')');
decrementIndent();
}
if (x.getUpdateIndexes() != null) {
println();
incrementIndent();
x.getUpdateIndexes().accept(this);
decrementIndent();
}
return false;
}
@Override
public void endVisit(OracleAlterTableSplitPartition x) {
}
@Override
public boolean visit(NestedTablePartitionSpec x) {
print0(ucase ? "PARTITION " : "partition ");
x.getPartition().accept(this);
for (SQLObject item : x.getSegmentAttributeItems()) {
print(' ');
item.accept(this);
}
return false;
}
@Override
public void endVisit(NestedTablePartitionSpec x) {
}
@Override
public boolean visit(OracleAlterTableModify x) {
print0(ucase ? "MODIFY (" : "modify (");
incrementIndent();
for (int i = 0, size = x.getColumns().size(); i < size; ++i) {
println();
SQLColumnDefinition column = x.getColumns().get(i);
column.accept(this);
if (i != size - 1) {
print0(", ");
}
}
decrementIndent();
println();
print(')');
return false;
}
@Override
public void endVisit(OracleAlterTableModify x) {
}
@Override
public boolean visit(OracleCreateIndexStatement x) {
print0(ucase ? "CREATE " : "create ");
if (x.getType() != null) {
print0(x.getType());
print(' ');
}
print0(ucase ? "INDEX " : "index ");
x.getName().accept(this);
print0(ucase ? " ON " : " on ");
x.getTable().accept(this);
print('(');
printAndAccept(x.getItems(), ", ");
print(')');
if (x.isIndexOnlyTopLevel()) {
println();
print0(ucase ? "INDEX ONLY TOPLEVEL" : "index only toplevel");
}
if (x.getPtcfree() != null) {
println();
print0(ucase ? "PCTFREE " : "pctfree ");
x.getPtcfree().accept(this);
}
if (x.getInitrans() != null) {
println();
print0(ucase ? "INITRANS " : "initrans ");
x.getInitrans().accept(this);
}
if (x.getMaxtrans() != null) {
println();
print0(ucase ? "MAXTRANS " : "maxtrans ");
x.getMaxtrans().accept(this);
}
if (x.isComputeStatistics()) {
println();
print0(ucase ? "COMPUTE STATISTICS" : "compute statistics");
}
if (x.getTablespace() != null) {
println();
print0(ucase ? "TABLESPACE " : "tablespace ");
x.getTablespace().accept(this);
}
if (x.isOnline()) {
print0(ucase ? " ONLINE" : " online");
}
if (x.isNoParallel()) {
print0(ucase ? " NOPARALLEL" : " noparallel");
} else if (x.getParallel() != null) {
print0(ucase ? " PARALLEL " : " parallel ");
x.getParallel().accept(this);
}
return false;
}
@Override
public void endVisit(OracleCreateIndexStatement x) {
}
@Override
public boolean visit(OracleAlterIndexStatement x) {
print0(ucase ? "ALTER INDEX " : "alter index ");
x.getName().accept(this);
if (x.getRenameTo() != null) {
print0(ucase ? " RENAME TO " : " rename to ");
x.getRenameTo().accept(this);
}
if (x.getMonitoringUsage() != null) {
print0(ucase ? " MONITORING USAGE" : " monitoring usage");
}
if (x.getRebuild() != null) {
print(' ');
x.getRebuild().accept(this);
}
if (x.getParallel() != null) {
print0(ucase ? " PARALLEL" : " parallel");
x.getParallel().accept(this);
}
return false;
}
@Override
public void endVisit(OracleAlterIndexStatement x) {
}
@Override
public boolean visit(Rebuild x) {
print0(ucase ? "REBUILD" : "rebuild");
if (x.getOption() != null) {
print(' ');
x.getOption().accept(this);
}
return false;
}
@Override
public void endVisit(Rebuild x) {
}
@Override
public boolean visit(OracleForStatement x) {
boolean all = x.isAll();
if (all) {
print0(ucase ? "FORALL " : "forall ");
} else {
print0(ucase ? "FOR " : "for ");
}
x.getIndex().accept(this);
print0(ucase ? " IN " : " in ");
x.getRange().accept(this);
if (!all) {
println();
print0(ucase ? "LOOP" : "loop");
}
incrementIndent();
println();
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
SQLStatement stmt = x.getStatements().get(i);
stmt.accept(this);
if (!all) {
if (i != size - 1) {
println(";");
} else {
print(';');
}
}
}
decrementIndent();
if (!all) {
println();
print0(ucase ? "END LOOP" : "end loop");
SQLName endLabel = x.getEndLabel();
if (endLabel != null) {
print(' ');
endLabel.accept(this);
}
}
return false;
}
@Override
public void endVisit(OracleForStatement x) {
}
@Override
public boolean visit(SQLIfStatement.Else x) {
print0(ucase ? "ELSE" : "else");
incrementIndent();
println();
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
if (i != 0) {
println();
}
SQLStatement item = x.getStatements().get(i);
item.setParent(x);
item.accept(this);
}
print(';');
decrementIndent();
return false;
}
@Override
public boolean visit(SQLIfStatement.ElseIf x) {
print0(ucase ? "ELSE IF " : "else if ");
x.getCondition().accept(this);
print0(ucase ? " THEN" : " then");
incrementIndent();
println();
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
if (i != 0) {
println();
}
SQLStatement item = x.getStatements().get(i);
item.setParent(x);
item.accept(this);
}
print(';');
decrementIndent();
return false;
}
@Override
public boolean visit(SQLIfStatement x) {
print0(ucase ? "IF " : "if ");
int lines = this.lines;
incrementIndent();
x.getCondition().accept(this);
decrementIndent();
if (lines != this.lines) {
println();
} else {
print(' ');
}
print0(ucase ? "THEN" : "then");
incrementIndent();
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();
}
}
print(';');
decrementIndent();
for (SQLIfStatement.ElseIf elseIf : x.getElseIfList()) {
println();
elseIf.accept(this);
}
if (x.getElseItem() != null) {
println();
x.getElseItem().accept(this);
}
println();
print0(ucase ? "END IF" : "end if");
return false;
}
@Override
public boolean visit(OracleRangeExpr x) {
x.getLowBound().accept(this);
print0("..");
x.getUpBound().accept(this);
return false;
}
@Override
public void endVisit(OracleRangeExpr x) {
}
protected void visitColumnDefault(SQLColumnDefinition x) {
if (x.getParent() instanceof SQLBlockStatement) {
print0(" := ");
} else {
print0(ucase ? " DEFAULT " : " default ");
}
x.getDefaultExpr().accept(this);
}
@Override
public boolean visit(OraclePrimaryKey x) {
if (x.getName() != null) {
print0(ucase ? "CONSTRAINT " : "constraint ");
x.getName().accept(this);
print(' ');
}
print0(ucase ? "PRIMARY KEY (" : "primary key (");
printAndAccept(x.getColumns(), ", ");
print(')');
printConstraintState(x);
return false;
}
protected void printConstraintState(OracleConstraint x) {
if (x.getUsing() != null) {
println();
x.getUsing().accept(this);
}
if (x.getExceptionsInto() != null) {
println();
print0(ucase ? "EXCEPTIONS INTO " : "exceptions into ");
x.getExceptionsInto().accept(this);
}
if (x.getEnable() != null) {
if (x.getEnable().booleanValue()) {
print0(ucase ? " ENABLE" : " enable");
} else {
print0(ucase ? " DIABLE" : " diable");
}
}
if (x.getInitially() != null) {
print0(ucase ? " INITIALLY " : " initially ");
print0(x.getInitially().name());
}
if (x.getDeferrable() != null) {
if (x.getDeferrable().booleanValue()) {
print0(ucase ? " DEFERRABLE" : " deferrable");
} else {
print0(ucase ? " NOT DEFERRABLE" : " not deferrable");
}
}
}
@Override
public void endVisit(OraclePrimaryKey x) {
}
@Override
public boolean visit(OracleCreateTableStatement x) {
this.visit((SQLCreateTableStatement) x);
if (x.isOrganizationIndex()) {
println();
print0(ucase ? "ORGANIZATION INDEX" : "organization index");
}
if (x.getPtcfree() != null) {
println();
print0(ucase ? "PCTFREE " : "pctfree ");
x.getPtcfree().accept(this);
}
if (x.getInitrans() != null) {
println();
print0(ucase ? "INITRANS " : "initrans ");
x.getInitrans().accept(this);
}
if (x.getMaxtrans() != null) {
println();
print0(ucase ? "MAXTRANS " : "maxtrans ");
x.getMaxtrans().accept(this);
}
if (x.isInMemoryMetadata()) {
println();
print0(ucase ? "IN_MEMORY_METADATA" : "in_memory_metadata");
}
if (x.isCursorSpecificSegment()) {
println();
print0(ucase ? "CURSOR_SPECIFIC_SEGMENT" : "cursor_specific_segment");
}
if (x.getParallel() == Boolean.TRUE) {
println();
print0(ucase ? "PARALLEL" : "parallel");
} else if (x.getParallel() == Boolean.FALSE) {
println();
print0(ucase ? "NOPARALLEL" : "noparallel");
}
if (x.getCache() == Boolean.TRUE) {
println();
print0(ucase ? "CACHE" : "cache");
} else if (x.getCache() == Boolean.FALSE) {
println();
print0(ucase ? "NOCACHE" : "nocache");
}
if (x.getCompress() == Boolean.TRUE) {
println();
print0(ucase ? "COMPRESS" : "compress");
} else if (x.getCompress() == Boolean.FALSE) {
println();
print0(ucase ? "NOCOMPRESS" : "nocompress");
}
if (x.getLogging() == Boolean.TRUE) {
println();
print0(ucase ? "LOGGING" : "logging");
} else if (x.getLogging() == Boolean.FALSE) {
println();
print0(ucase ? "NOLOGGING" : "nologging");
}
if (x.getTablespace() != null) {
println();
print0(ucase ? "TABLESPACE " : "tablespace ");
x.getTablespace().accept(this);
}
if (x.getStorage() != null) {
println();
x.getStorage().accept(this);
}
if (x.getLobStorage() != null) {
println();
x.getLobStorage().accept(this);
}
if (x.isOnCommit()) {
println();
print0(ucase ? "ON COMMIT" : "on commit");
}
if (x.isPreserveRows()) {
println();
print0(ucase ? "PRESERVE ROWS" : "preserve rows");
}
if (x.getPartitioning() != null) {
println();
x.getPartitioning().accept(this);
}
if (x.getSelect() != null) {
println();
print0(ucase ? "AS" : "as");
println();
x.getSelect().accept(this);
}
return false;
}
@Override
public void endVisit(OracleCreateTableStatement x) {
}
@Override
public boolean visit(OracleStorageClause x) {
print0(ucase ? "STORAGE (" : "storage (");
boolean first = true;
if (x.getInitial() != null) {
if (!first) {
print(' ');
}
print0(ucase ? "INITIAL " : "initial ");
x.getInitial().accept(this);
first = false;
}
if (x.getMaxSize() != null) {
if (!first) {
print(' ');
}
print0(ucase ? "MAXSIZE " : "maxsize ");
x.getMaxSize().accept(this);
first = false;
}
if (x.getFreeLists() != null) {
if (!first) {
print(' ');
}
print0(ucase ? "FREELISTS " : "freelists ");
x.getFreeLists().accept(this);
first = false;
}
if (x.getFreeListGroups() != null) {
if (!first) {
print(' ');
}
print0(ucase ? "FREELIST GROUPS " : "freelist groups ");
x.getFreeListGroups().accept(this);
first = false;
}
if (x.getBufferPool() != null) {
if (!first) {
print(' ');
}
print0(ucase ? "BUFFER_POOL " : "buffer_pool ");
x.getBufferPool().accept(this);
first = false;
}
if (x.getObjno() != null) {
if (!first) {
print(' ');
}
print0(ucase ? "OBJNO " : "objno ");
x.getObjno().accept(this);
first = false;
}
print(')');
return false;
}
@Override
public void endVisit(OracleStorageClause x) {
}
@Override
public boolean visit(OracleGotoStatement x) {
print0(ucase ? "GOTO " : "GOTO ");
x.getLabel().accept(this);
return false;
}
@Override
public void endVisit(OracleGotoStatement x) {
}
@Override
public boolean visit(OracleLabelStatement x) {
print0("<<");
x.getLabel().accept(this);
print0(">>");
return false;
}
@Override
public void endVisit(OracleLabelStatement x) {
}
@Override
public boolean visit(OracleCommitStatement x) {
print0(ucase ? "COMMIT" : "commit");
if (x.isWrite()) {
print0(ucase ? " WRITE" : " write");
if (x.getWait() != null) {
if (x.getWait().booleanValue()) {
print0(ucase ? " WAIT" : " wait");
} else {
print0(ucase ? " NOWAIT" : " nowait");
}
}
if (x.getImmediate() != null) {
if (x.getImmediate().booleanValue()) {
print0(ucase ? " IMMEDIATE" : " immediate");
} else {
print0(ucase ? " BATCH" : " batch");
}
}
}
return false;
}
@Override
public void endVisit(OracleCommitStatement x) {
}
@Override
public boolean visit(OracleAlterTriggerStatement x) {
print0(ucase ? "ALTER TRIGGER " : "alter trigger ");
x.getName().accept(this);
if (x.isCompile()) {
print0(ucase ? " COMPILE" : " compile");
}
if (x.getEnable() != null) {
if (x.getEnable().booleanValue()) {
print0(ucase ? "ENABLE" : "enable");
} else {
print0(ucase ? "DISABLE" : "disable");
}
}
return false;
}
@Override
public void endVisit(OracleAlterTriggerStatement x) {
}
@Override
public boolean visit(OracleAlterSynonymStatement x) {
print0(ucase ? "ALTER SYNONYM " : "alter synonym ");
x.getName().accept(this);
if (x.isCompile()) {
print0(ucase ? " COMPILE" : " compile");
}
if (x.getEnable() != null) {
if (x.getEnable().booleanValue()) {
print0(ucase ? "ENABLE" : "enable");
} else {
print0(ucase ? "DISABLE" : "disable");
}
}
return false;
}
@Override
public void endVisit(OracleAlterSynonymStatement x) {
}
@Override
public boolean visit(AsOfSnapshotClause x) {
print0(ucase ? "AS OF SNAPSHOT(" : "as of snapshot(");
x.getExpr().accept(this);
print(')');
return false;
}
@Override
public void endVisit(AsOfSnapshotClause x) {
}
@Override
public boolean visit(OracleAlterViewStatement x) {
print0(ucase ? "ALTER VIEW " : "alter view ");
x.getName().accept(this);
if (x.isCompile()) {
print0(ucase ? " COMPILE" : " compile");
}
if (x.getEnable() != null) {
if (x.getEnable().booleanValue()) {
print0(ucase ? "ENABLE" : "enable");
} else {
print0(ucase ? "DISABLE" : "disable");
}
}
return false;
}
@Override
public void endVisit(OracleAlterViewStatement x) {
}
@Override
public boolean visit(OracleAlterTableMoveTablespace x) {
print0(ucase ? " MOVE TABLESPACE " : " move tablespace ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(OracleAlterTableMoveTablespace x) {
}
@Override
public boolean visit(OracleSizeExpr x) {
x.getValue().accept(this);
print0(x.getUnit().name());
return false;
}
@Override
public void endVisit(OracleSizeExpr x) {
}
@Override
public boolean visit(OracleFileSpecification x) {
printAndAccept(x.getFileNames(), ", ");
if (x.getSize() != null) {
print0(ucase ? " SIZE " : " size ");
x.getSize().accept(this);
}
if (x.isAutoExtendOff()) {
print0(ucase ? " AUTOEXTEND OFF" : " autoextend off");
} else if (x.getAutoExtendOn() != null) {
print0(ucase ? " AUTOEXTEND ON " : " autoextend on ");
x.getAutoExtendOn().accept(this);
}
return false;
}
@Override
public void endVisit(OracleFileSpecification x) {
}
@Override
public boolean visit(OracleAlterTablespaceAddDataFile x) {
print0(ucase ? "ADD DATAFILE" : "add datafile");
incrementIndent();
for (OracleFileSpecification file : x.getFiles()) {
println();
file.accept(this);
}
decrementIndent();
return false;
}
@Override
public void endVisit(OracleAlterTablespaceAddDataFile x) {
}
@Override
public boolean visit(OracleAlterTablespaceStatement x) {
print0(ucase ? "ALTER TABLESPACE " : "alter tablespace ");
x.getName().accept(this);
println();
x.getItem().accept(this);
return false;
}
@Override
public void endVisit(OracleAlterTablespaceStatement x) {
}
@Override
public boolean visit(SQLTruncateStatement x) {
print0(ucase ? "TRUNCATE TABLE " : "truncate table ");
printAndAccept(x.getTableSources(), ", ");
if (x.isPurgeSnapshotLog()) {
print0(ucase ? " PURGE SNAPSHOT LOG" : " purge snapshot log");
}
return false;
}
@Override
public boolean visit(OracleExitStatement x) {
print0(ucase ? "EXIT" : "exit");
if (x.getWhen() != null) {
print0(ucase ? " WHEN " : " when ");
x.getWhen().accept(this);
}
return false;
}
@Override
public void endVisit(OracleExitStatement x) {
}
@Override
public boolean visit(OracleConntinueStatement x) {
print0(ucase ? "CONTINUE" : "continue");
SQLName label = x.getLabel();
if (label != null) {
print(' ');
label.accept(this);
}
if (x.getWhen() != null) {
print0(ucase ? " WHEN " : " when ");
x.getWhen().accept(this);
}
return false;
}
@Override
public void endVisit(OracleConntinueStatement x) {
}
@Override
public boolean visit(OracleRaiseStatement x) {
print0(ucase ? "RAISE" : "raise");
if (x.getException() != null) {
print(' ');
x.getException().accept(this);
}
return false;
}
@Override
public void endVisit(OracleRaiseStatement x) {
}
@Override
public void endVisit(SQLRollbackStatement x) {
}
@Override
public boolean visit(OracleSavePointStatement x) {
print0(ucase ? "ROLLBACK" : "rollback");
if (x.getTo() != null) {
print0(ucase ? " TO " : " to ");
x.getTo().accept(this);
}
return false;
}
@Override
public void endVisit(OracleSavePointStatement x) {
}
@Override
public boolean visit(SQLCreateProcedureStatement x) {
boolean create = x.isCreate();
if (!create) {
print0(ucase ? "PROCEDURE " : "procedure ");
} else 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();
if (paramSize > 0) {
print0(" (");
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(')');
}
SQLName authid = x.getAuthid();
if (authid != null) {
print(ucase ? " AUTHID " : " authid ");
authid.accept(this);
}
SQLStatement block = x.getBlock();
if (!create) {
println();
println("IS");
} else {
println();
if (block instanceof SQLBlockStatement) {
SQLBlockStatement blockStatement = (SQLBlockStatement) block;
if (blockStatement.getParameters().size() > 0 || authid != null) {
println(ucase ? "AS" : "as");
}
}
}
String javaCallSpec = x.getJavaCallSpec();
if (javaCallSpec != null) {
print0(ucase ? "LANGUAGE JAVA NAME '" : "language java name '");
print0(javaCallSpec);
print('\'');
return false;
}
block.accept(this);
return false;
}
@Override
public void endVisit(SQLCreateProcedureStatement x) {
}
@Override
public boolean visit(OracleCreateDatabaseDbLinkStatement x) {
print0(ucase ? "CREATE " : "create ");
if (x.isShared()) {
print0(ucase ? "SHARE " : "share ");
}
if (x.isPublic()) {
print0(ucase ? "PUBLIC " : "public ");
}
print0(ucase ? "DATABASE LINK " : "database link ");
x.getName().accept(this);
if (x.getUser() != null) {
print0(ucase ? " CONNECT TO " : " connect to ");
x.getUser().accept(this);
if (x.getPassword() != null) {
print0(ucase ? " IDENTIFIED BY " : " identified by ");
print0(x.getPassword());
}
}
if (x.getAuthenticatedUser() != null) {
print0(ucase ? " AUTHENTICATED BY " : " authenticated by ");
x.getAuthenticatedUser().accept(this);
if (x.getAuthenticatedPassword() != null) {
print0(ucase ? " IDENTIFIED BY " : " identified by ");
print0(x.getAuthenticatedPassword());
}
}
if (x.getUsing() != null) {
print0(ucase ? " USING " : " using ");
x.getUsing().accept(this);
}
return false;
}
@Override
public void endVisit(OracleCreateDatabaseDbLinkStatement x) {
}
@Override
public boolean visit(OracleDropDbLinkStatement x) {
print0(ucase ? "DROP " : "drop ");
if (x.isPublic()) {
print0(ucase ? "PUBLIC " : "public ");
}
print0(ucase ? "DATABASE LINK " : "database link ");
x.getName().accept(this);
return false;
}
@Override
public void endVisit(OracleDropDbLinkStatement x) {
}
public boolean visit(SQLCharacterDataType x) {
print0(x.getName());
if (x.getArguments().size() > 0) {
print('(');
x.getArguments().get(0).accept(this);
if (x.getCharType() != null) {
print(' ');
print0(x.getCharType());
}
print(')');
}
return false;
}
@Override
public boolean visit(OracleDataTypeTimestamp x) {
print0(x.getName());
if (x.getArguments().size() > 0) {
print('(');
x.getArguments().get(0).accept(this);
print(')');
}
if (x.isWithTimeZone()) {
print0(ucase ? " WITH TIME ZONE" : " with time zone");
} else if (x.isWithLocalTimeZone()) {
print0(ucase ? " WITH LOCAL TIME ZONE" : " with local time zone");
}
return false;
}
@Override
public void endVisit(OracleDataTypeTimestamp x) {
}
@Override
public boolean visit(OracleDataTypeIntervalYear x) {
print0(x.getName());
if (x.getArguments().size() > 0) {
print('(');
x.getArguments().get(0).accept(this);
print(')');
}
print0(ucase ? " TO MONTH" : " to month");
return false;
}
@Override
public void endVisit(OracleDataTypeIntervalYear x) {
}
@Override
public boolean visit(OracleDataTypeIntervalDay x) {
print0(x.getName());
if (x.getArguments().size() > 0) {
print('(');
x.getArguments().get(0).accept(this);
print(')');
}
print0(ucase ? " TO SECOND" : " to second");
if (x.getFractionalSeconds().size() > 0) {
print('(');
x.getFractionalSeconds().get(0).accept(this);
print(')');
}
return false;
}
@Override
public void endVisit(OracleDataTypeIntervalDay x) {
}
@Override
public boolean visit(OracleUsingIndexClause x) {
print0(ucase ? "USING INDEX" : "using index");
if (x.getIndex() != null) {
print(' ');
x.getIndex().accept(this);
} else {
if (x.getPtcfree() != null) {
print0(ucase ? " PCTFREE " : " pctfree ");
x.getPtcfree().accept(this);
}
if (x.getInitrans() != null) {
print0(ucase ? " INITRANS " : " initrans ");
x.getInitrans().accept(this);
}
if (x.getMaxtrans() != null) {
print0(ucase ? " MAXTRANS " : " maxtrans ");
x.getMaxtrans().accept(this);
}
if (x.isComputeStatistics()) {
print0(ucase ? " COMPUTE STATISTICS" : " compute statistics");
}
if (x.getTablespace() != null) {
print0(ucase ? " TABLESPACE " : " tablespace ");
x.getTablespace().accept(this);
}
if (x.getEnable() != null) {
if (x.getEnable().booleanValue()) {
print0(ucase ? " ENABLE" : " enable");
} else {
print0(ucase ? " DISABLE" : " disable");
}
}
if (x.getStorage() != null) {
println();
x.getStorage().accept(this);
}
}
return false;
}
@Override
public void endVisit(OracleUsingIndexClause x) {
}
@Override
public boolean visit(OracleLobStorageClause x) {
print0(ucase ? "LOB (" : "lob (");
printAndAccept(x.getItems(), ",");
print0(ucase ? ") STORE AS " : ") store as ");
if (x.isSecureFile()) {
print0(ucase ? "SECUREFILE " : "securefile ");
}
if (x.isBasicFile()) {
print0(ucase ? "BASICFILE " : "basicfile ");
}
boolean first = true;
print('(');
if (x.getTableSpace() != null) {
if (!first) {
print(' ');
}
print0(ucase ? "TABLESPACE " : "tablespace ");
x.getTableSpace().accept(this);
first = false;
}
if (x.getEnable() != null) {
if (!first) {
print(' ');
}
if (x.getEnable().booleanValue()) {
print0(ucase ? "ENABLE STORAGE IN ROW" : "enable storage in row");
} else {
print0(ucase ? "DISABLE STORAGE IN ROW" : "disable storage in row");
}
}
if (x.getChunk() != null) {
if (!first) {
print(' ');
}
print0(ucase ? "CHUNK " : "chunk ");
x.getChunk().accept(this);
}
if (x.getCache() != null) {
if (!first) {
print(' ');
}
if (x.getCache().booleanValue()) {
print0(ucase ? "CACHE" : "cache");
} else {
print0(ucase ? "NOCACHE" : "nocache");
}
if (x.getLogging() != null) {
if (x.getLogging().booleanValue()) {
print0(ucase ? " LOGGING" : " logging");
} else {
print0(ucase ? " NOLOGGING" : " nologging");
}
}
}
if (x.getCompress() != null) {
if (!first) {
print(' ');
}
if (x.getCompress().booleanValue()) {
print0(ucase ? "COMPRESS" : "compress");
} else {
print0(ucase ? "NOCOMPRESS" : "nocompress");
}
}
if (x.getKeepDuplicate() != null) {
if (!first) {
print(' ');
}
if (x.getKeepDuplicate().booleanValue()) {
print0(ucase ? "KEEP_DUPLICATES" : "keep_duplicates");
} else {
print0(ucase ? "DEDUPLICATE" : "deduplicate");
}
}
print(')');
return false;
}
@Override
public void endVisit(OracleLobStorageClause x) {
}
@Override
public boolean visit(OracleUnique x) {
visit((SQLUnique) x);
printConstraintState(x);
return false;
}
@Override
public void endVisit(OracleUnique x) {
}
@Override
public boolean visit(OracleForeignKey x) {
visit((SQLForeignKeyImpl) x);
printConstraintState(x);
return false;
}
@Override
public void endVisit(OracleForeignKey x) {
}
@Override
public boolean visit(OracleCheck x) {
visit((SQLCheck) x);
printConstraintState(x);
return false;
}
@Override
public void endVisit(OracleCheck x) {
}
@Override
protected void printCascade() {
print0(ucase ? " CASCADE CONSTRAINTS" : " cascade constraints");
}
@Override
public boolean visit(SQLMethodInvokeExpr x) {
if ("trim".equalsIgnoreCase(x.getMethodName())) {
SQLExpr trim_character = (SQLExpr) x.getAttribute("trim_character");
if (trim_character != null) {
print0(x.getMethodName());
print('(');
String trim_option = (String) x.getAttribute("trim_option");
if (trim_option != null && trim_option.length() != 0) {
print0(trim_option);
print(' ');
}
trim_character.accept(this);
if (x.getParameters().size() > 0) {
print0(ucase ? " FROM " : " from ");
x.getParameters().get(0).accept(this);
}
print(')');
return false;
}
}
return super.visit(x);
}
public boolean visit(SQLCharExpr x) {
if (x.getText() != null && x.getText().length() == 0) {
print0(ucase ? "NULL" : "null");
} else {
super.visit(x);
}
return false;
}
}