sql parser improved support db2 merge syntax. for issue #1324

This commit is contained in:
高铁
2016-07-09 16:52:46 +08:00
parent 9ca288e3d8
commit aeacdb649a
20 changed files with 487 additions and 429 deletions
@@ -40,6 +40,9 @@ public class DB2Lexer extends Lexer {
map.put("CONCAT", Token.CONCAT);
map.put("CONTINUE", Token.CONTINUE);
map.put("IDENTITY", Token.IDENTITY);
map.put("MERGE", Token.MERGE);
map.put("USING", Token.USING);
map.put("MATCHED", Token.MATCHED);
DEFAULT_DB2_KEYWORDS = new Keywords(map);
}
@@ -1,63 +0,0 @@
/*
* Copyright 1999-2101 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.ast.clause;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
public class OracleErrorLoggingClause extends OracleSQLObjectImpl {
private SQLName into;
private SQLExpr simpleExpression;
private SQLExpr limit;
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, into);
acceptChild(visitor, simpleExpression);
acceptChild(visitor, limit);
}
visitor.endVisit(this);
}
public SQLName getInto() {
return into;
}
public void setInto(SQLName into) {
this.into = into;
}
public SQLExpr getSimpleExpression() {
return simpleExpression;
}
public void setSimpleExpression(SQLExpr simpleExpression) {
this.simpleExpression = simpleExpression;
}
public SQLExpr getLimit() {
return limit;
}
public void setLimit(SQLExpr limit) {
this.limit = limit;
}
}
@@ -19,8 +19,8 @@ import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.statement.SQLErrorLoggingClause;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
@@ -29,7 +29,7 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class OracleInsertStatement extends SQLInsertStatement implements OracleStatement {
private OracleReturningClause returning;
private OracleErrorLoggingClause errorLogging;
private SQLErrorLoggingClause errorLogging;
private List<SQLHint> hints = new ArrayList<SQLHint>();
public List<SQLHint> getHints() {
@@ -48,11 +48,11 @@ public class OracleInsertStatement extends SQLInsertStatement implements OracleS
this.returning = returning;
}
public OracleErrorLoggingClause getErrorLogging() {
public SQLErrorLoggingClause getErrorLogging() {
return errorLogging;
}
public void setErrorLogging(OracleErrorLoggingClause errorLogging) {
public void setErrorLogging(SQLErrorLoggingClause errorLogging) {
this.errorLogging = errorLogging;
}
@@ -1,208 +0,0 @@
/*
* Copyright 1999-2101 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.ast.stmt;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
public class OracleMergeStatement extends OracleStatementImpl {
private final List<SQLHint> hints = new ArrayList<SQLHint>();
private SQLTableSource into;
private String alias;
private SQLTableSource using;
private SQLExpr on;
private MergeUpdateClause updateClause;
private MergeInsertClause insertClause;
private OracleErrorLoggingClause errorLoggingClause;
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, into);
acceptChild(visitor, using);
acceptChild(visitor, on);
acceptChild(visitor, updateClause);
acceptChild(visitor, insertClause);
acceptChild(visitor, errorLoggingClause);
}
visitor.endVisit(this);
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public SQLTableSource getInto() {
return into;
}
public void setInto(SQLName into) {
this.setInto(new SQLExprTableSource(into));
}
public void setInto(SQLTableSource into) {
if (into != null) {
into.setParent(this);
}
this.into = into;
}
public SQLTableSource getUsing() {
return using;
}
public void setUsing(SQLTableSource using) {
this.using = using;
}
public SQLExpr getOn() {
return on;
}
public void setOn(SQLExpr on) {
this.on = on;
}
public MergeUpdateClause getUpdateClause() {
return updateClause;
}
public void setUpdateClause(MergeUpdateClause updateClause) {
this.updateClause = updateClause;
}
public MergeInsertClause getInsertClause() {
return insertClause;
}
public void setInsertClause(MergeInsertClause insertClause) {
this.insertClause = insertClause;
}
public OracleErrorLoggingClause getErrorLoggingClause() {
return errorLoggingClause;
}
public void setErrorLoggingClause(OracleErrorLoggingClause errorLoggingClause) {
this.errorLoggingClause = errorLoggingClause;
}
public List<SQLHint> getHints() {
return hints;
}
public static class MergeUpdateClause extends OracleSQLObjectImpl {
private List<SQLUpdateSetItem> items = new ArrayList<SQLUpdateSetItem>();
private SQLExpr where;
private SQLExpr deleteWhere;
public List<SQLUpdateSetItem> getItems() {
return items;
}
public void addItem(SQLUpdateSetItem item) {
if (item != null) {
item.setParent(this);
}
this.items.add(item);
}
public SQLExpr getWhere() {
return where;
}
public void setWhere(SQLExpr where) {
this.where = where;
}
public SQLExpr getDeleteWhere() {
return deleteWhere;
}
public void setDeleteWhere(SQLExpr deleteWhere) {
this.deleteWhere = deleteWhere;
}
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, items);
acceptChild(visitor, where);
acceptChild(visitor, deleteWhere);
}
visitor.endVisit(this);
}
}
public static class MergeInsertClause extends OracleSQLObjectImpl {
private List<SQLExpr> columns = new ArrayList<SQLExpr>();
private List<SQLExpr> values = new ArrayList<SQLExpr>();
private SQLExpr where;
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, columns);
acceptChild(visitor, columns);
acceptChild(visitor, columns);
}
visitor.endVisit(this);
}
public List<SQLExpr> getColumns() {
return columns;
}
public void setColumns(List<SQLExpr> columns) {
this.columns = columns;
}
public List<SQLExpr> getValues() {
return values;
}
public void setValues(List<SQLExpr> values) {
this.values = values;
}
public SQLExpr getWhere() {
return where;
}
public void setWhere(SQLExpr where) {
this.where = where;
}
}
}
@@ -20,11 +20,11 @@ import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.statement.SQLErrorLoggingClause;
import com.alibaba.druid.sql.ast.statement.SQLInsertInto;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -158,7 +158,7 @@ public class OracleMultiInsertStatement extends OracleStatementImpl {
public static class InsertIntoClause extends SQLInsertInto implements OracleSQLObject, Entry {
private OracleReturningClause returning;
private OracleErrorLoggingClause errorLogging;
private SQLErrorLoggingClause errorLogging;
public InsertIntoClause(){
@@ -172,11 +172,11 @@ public class OracleMultiInsertStatement extends OracleStatementImpl {
this.returning = returning;
}
public OracleErrorLoggingClause getErrorLogging() {
public SQLErrorLoggingClause getErrorLogging() {
return errorLogging;
}
public void setErrorLogging(OracleErrorLoggingClause errorLogging) {
public void setErrorLogging(SQLErrorLoggingClause errorLogging) {
this.errorLogging = errorLogging;
}
@@ -51,11 +51,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLSetStatement;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement;
@@ -91,11 +87,9 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement.LockMode;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleStatement;
import com.alibaba.druid.sql.parser.Lexer;
@@ -119,10 +113,6 @@ public class OracleStatementParser extends SQLStatementParser {
return (OracleExprParser) exprParser;
}
public void parseHints(List<SQLHint> hints) {
this.getExprParser().parseHints(hints);
}
public OracleCreateTableParser getSQLCreateTableParser() {
return new OracleCreateTableParser(lexer);
}
@@ -1100,119 +1090,6 @@ public class OracleStatementParser extends SQLStatementParser {
return new OracleSelectParser(this.exprParser);
}
public OracleMergeStatement parseMerge() {
accept(Token.MERGE);
OracleMergeStatement stmt = new OracleMergeStatement();
parseHints(stmt.getHints());
accept(Token.INTO);
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
OracleSelect select = this.createSQLSelectParser().select();
SQLSubqueryTableSource tableSource = new SQLSubqueryTableSource(select);
stmt.setInto(tableSource);
accept(Token.RPAREN);
} else {
stmt.setInto(exprParser.name());
}
stmt.setAlias(as());
accept(Token.USING);
SQLTableSource using = this.createSQLSelectParser().parseTableSource();
stmt.setUsing(using);
accept(Token.ON);
stmt.setOn(exprParser.expr());
boolean insertFlag = false;
if (lexer.token() == Token.WHEN) {
lexer.nextToken();
if (lexer.token() == Token.MATCHED) {
OracleMergeStatement.MergeUpdateClause updateClause = new OracleMergeStatement.MergeUpdateClause();
lexer.nextToken();
accept(Token.THEN);
accept(Token.UPDATE);
accept(Token.SET);
for (;;) {
SQLUpdateSetItem item = this.exprParser.parseUpdateSetItem();
updateClause.addItem(item);
item.setParent(updateClause);
if (lexer.token() == (Token.COMMA)) {
lexer.nextToken();
continue;
}
break;
}
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
updateClause.setWhere(exprParser.expr());
}
if (lexer.token() == Token.DELETE) {
lexer.nextToken();
accept(Token.WHERE);
updateClause.setWhere(exprParser.expr());
}
stmt.setUpdateClause(updateClause);
} else if (lexer.token() == Token.NOT) {
lexer.nextToken();
insertFlag = true;
}
}
if (!insertFlag) {
if (lexer.token() == Token.WHEN) {
lexer.nextToken();
}
if (lexer.token() == Token.NOT) {
lexer.nextToken();
insertFlag = true;
}
}
if (insertFlag) {
OracleMergeStatement.MergeInsertClause insertClause = new OracleMergeStatement.MergeInsertClause();
accept(Token.MATCHED);
accept(Token.THEN);
accept(Token.INSERT);
if (lexer.token() == Token.LPAREN) {
accept(Token.LPAREN);
exprParser.exprList(insertClause.getColumns(), insertClause);
accept(Token.RPAREN);
}
accept(Token.VALUES);
accept(Token.LPAREN);
exprParser.exprList(insertClause.getValues(), insertClause);
accept(Token.RPAREN);
if (lexer.token() == Token.WHERE) {
lexer.nextToken();
insertClause.setWhere(exprParser.expr());
}
stmt.setInsertClause(insertClause);
}
OracleErrorLoggingClause errorClause = parseErrorLoggingClause();
stmt.setErrorLoggingClause(errorClause);
return stmt;
}
public OracleStatement parseInsert() {
if (lexer.token() == Token.LPAREN) {
OracleInsertStatement stmt = new OracleInsertStatement();
@@ -1322,34 +1199,6 @@ public class OracleStatementParser extends SQLStatementParser {
return stmt;
}
private OracleErrorLoggingClause parseErrorLoggingClause() {
if (identifierEquals("LOG")) {
OracleErrorLoggingClause errorClause = new OracleErrorLoggingClause();
lexer.nextToken();
accept(Token.ERRORS);
if (lexer.token() == Token.INTO) {
lexer.nextToken();
errorClause.setInto(exprParser.name());
}
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
errorClause.setSimpleExpression(exprParser.expr());
accept(Token.RPAREN);
}
if (lexer.token() == Token.REJECT) {
lexer.nextToken();
accept(Token.LIMIT);
errorClause.setLimit(exprParser.expr());
}
return errorClause;
}
return null;
}
public OracleReturningClause parseReturningClause() {
OracleReturningClause clause = null;
@@ -23,7 +23,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOf
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.OracleErrorLoggingClause;
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;
@@ -79,7 +78,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem;
@@ -269,22 +267,6 @@ public interface OracleASTVisitor extends SQLASTVisitor {
void endVisit(ModelClause x);
boolean visit(OracleMergeStatement x);
void endVisit(OracleMergeStatement x);
boolean visit(OracleMergeStatement.MergeUpdateClause x);
void endVisit(OracleMergeStatement.MergeUpdateClause x);
boolean visit(OracleMergeStatement.MergeInsertClause x);
void endVisit(OracleMergeStatement.MergeInsertClause x);
boolean visit(OracleErrorLoggingClause x);
void endVisit(OracleErrorLoggingClause x);
boolean visit(OracleReturningClause x);
void endVisit(OracleReturningClause x);
@@ -15,6 +15,8 @@
*/
package com.alibaba.druid.sql.dialect.oracle.visitor;
import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause;
import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeUpdateClause;
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;
@@ -31,7 +33,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumnCl
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.ReturnRowsClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
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;
@@ -87,9 +88,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem;
@@ -553,15 +551,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
}
@Override
public boolean visit(OracleMergeStatement x) {
return true;
}
@Override
public void endVisit(OracleMergeStatement x) {
}
@Override
public boolean visit(MergeUpdateClause x) {
return true;
@@ -582,16 +571,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
}
@Override
public boolean visit(OracleErrorLoggingClause x) {
return true;
}
@Override
public void endVisit(OracleErrorLoggingClause x) {
}
@Override
public boolean visit(OracleReturningClause x) {
return true;
@@ -65,7 +65,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesCla
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.OracleErrorLoggingClause;
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;
@@ -126,9 +125,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem;
@@ -1285,138 +1281,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
@Override
public boolean visit(OracleMergeStatement x) {
print0(ucase ? "MERGE " : "merge ");
if (x.getHints().size() > 0) {
printAndAccept(x.getHints(), ", ");
print(' ');
}
print0(ucase ? "INTO " : "into ");
x.getInto().accept(this);
if (x.getAlias() != null) {
print(' ');
print0(x.getAlias());
}
println();
print0(ucase ? "USING " : "using ");
x.getUsing().accept(this);
print0(ucase ? " ON (" : " on (");
x.getOn().accept(this);
print0(") ");
if (x.getUpdateClause() != null) {
println();
x.getUpdateClause().accept(this);
}
if (x.getInsertClause() != null) {
println();
x.getInsertClause().accept(this);
}
if (x.getErrorLoggingClause() != null) {
println();
x.getErrorLoggingClause().accept(this);
}
return false;
}
@Override
public void endVisit(OracleMergeStatement x) {
}
@Override
public boolean visit(MergeUpdateClause x) {
print0(ucase ? "WHEN MATCHED THEN UPDATE SET " : "when matched then update set ");
printAndAccept(x.getItems(), ", ");
if (x.getWhere() != null) {
incrementIndent();
println();
print0(ucase ? "WHERE " : "where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
decrementIndent();
}
if (x.getDeleteWhere() != null) {
incrementIndent();
println();
print0(ucase ? "DELETE WHERE " : "delete where ");
x.getDeleteWhere().setParent(x);
x.getDeleteWhere().accept(this);
decrementIndent();
}
return false;
}
@Override
public void endVisit(MergeUpdateClause x) {
}
@Override
public boolean visit(MergeInsertClause x) {
print0(ucase ? "WHEN NOT MATCHED THEN INSERT" : "when not matched then insert");
if (x.getColumns().size() > 0) {
print(' ');
printAndAccept(x.getColumns(), ", ");
}
print0(ucase ? " VALUES (" : " values (");
printAndAccept(x.getValues(), ", ");
print(')');
if (x.getWhere() != null) {
incrementIndent();
println();
print0(ucase ? "WHERE " : "where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
decrementIndent();
}
return false;
}
@Override
public void endVisit(MergeInsertClause x) {
}
@Override
public boolean visit(OracleErrorLoggingClause x) {
print0(ucase ? "LOG ERRORS " : "log errors ");
if (x.getInto() != null) {
print0(ucase ? "INTO " : "into ");
x.getInto().accept(this);
print(' ');
}
if (x.getSimpleExpression() != null) {
print('(');
x.getSimpleExpression().accept(this);
print(')');
}
if (x.getLimit() != null) {
print0(ucase ? " REJECT LIMIT " : " reject limit ");
x.getLimit().accept(this);
}
return false;
}
@Override
public void endVisit(OracleErrorLoggingClause x) {
}
@Override
public boolean visit(OracleReturningClause x) {
print0(ucase ? "RETURNING " : "returning ");
@@ -34,6 +34,8 @@ import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause;
import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeUpdateClause;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
@@ -54,7 +56,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumnCl
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.ReturnRowsClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
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;
@@ -110,9 +111,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem;
@@ -826,49 +824,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
}
@Override
public boolean visit(OracleMergeStatement x) {
setAliasMap();
String originalTable = getCurrentTable();
setMode(x.getUsing(), Mode.Select);
x.getUsing().accept(this);
setMode(x, Mode.Merge);
String ident = x.getInto().toString();
setCurrentTable(x, ident);
x.putAttribute("_old_local_", originalTable);
TableStat stat = getTableStat(ident);
stat.incrementMergeCount();
Map<String, String> aliasMap = getAliasMap();
if (aliasMap != null) {
if (x.getAlias() != null) {
putAliasMap(aliasMap, x.getAlias(), ident);
}
putAliasMap(aliasMap, ident, ident);
}
x.getOn().accept(this);
if (x.getUpdateClause() != null) {
x.getUpdateClause().accept(this);
}
if (x.getInsertClause() != null) {
x.getInsertClause().accept(this);
}
return false;
}
@Override
public void endVisit(OracleMergeStatement x) {
}
@Override
public boolean visit(MergeUpdateClause x) {
return true;
@@ -889,16 +844,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
}
@Override
public boolean visit(OracleErrorLoggingClause x) {
return true;
}
@Override
public void endVisit(OracleErrorLoggingClause x) {
}
@Override
public boolean visit(OracleReturningClause x) {
return true;