Merge branch 'master' of

https://wenshao@github.com/AlibabaTech/druid.git

Conflicts:
	src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMultiInsertStatement.java
	src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java
	src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVIsitorAdapter.java
	src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java
	src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java
	src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java
	src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java
This commit is contained in:
温少
2012-02-25 17:09:41 +08:00
8 changed files with 239 additions and 19 deletions
@@ -96,16 +96,20 @@ public class OracleMultiInsertStatement extends OracleStatementImpl {
@Override
public void accept0(OracleASTVisitor visitor) {
// TODO Auto-generated method stub
if (visitor.visit(this)) {
acceptChild(visitor, items);
acceptChild(visitor, elseItem);
}
visitor.endVisit(this);
}
}
public static class ConditionalInsertClauseItem {
public static class ConditionalInsertClauseItem extends OracleSQLObjectImpl {
private SQLExpr when;
private InsertIntoClause then;
private static final long serialVersionUID = 1L;
private SQLExpr when;
private InsertIntoClause then;
public SQLExpr getWhen() {
return when;
@@ -123,6 +127,15 @@ public class OracleMultiInsertStatement extends OracleStatementImpl {
this.then = then;
}
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, when);
acceptChild(visitor, then);
}
visitor.endVisit(this);
}
}
public static class InsertIntoClause extends SQLInsertInto implements OracleSQLObject, Entry {
@@ -260,7 +260,7 @@ public class OracleStatementParser extends SQLStatementParser {
lexer.nextToken();
stmt.setOption(OracleMultiInsertStatement.Option.FIRST);
}
while (lexer.token() == Token.INTO) {
OracleMultiInsertStatement.InsertIntoClause clause = new OracleMultiInsertStatement.InsertIntoClause();
@@ -268,17 +268,39 @@ public class OracleStatementParser extends SQLStatementParser {
clause.setReturning(parseReturningClause());
clause.setErrorLogging(parseErrorLoggingClause());
stmt.getEntries().add(clause);
}
if (lexer.token() == Token.WHEN) {
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
OracleMultiInsertStatement.ConditionalInsertClause clause = new OracleMultiInsertStatement.ConditionalInsertClause();
while (lexer.token() == Token.WHEN) {
lexer.nextToken();
OracleMultiInsertStatement.ConditionalInsertClauseItem item = new OracleMultiInsertStatement.ConditionalInsertClauseItem();
item.setWhen(this.createExprParser().expr());
accept(Token.THEN);
OracleMultiInsertStatement.InsertIntoClause insertInto = new OracleMultiInsertStatement.InsertIntoClause();
parseInsert0(insertInto);
item.setThen(insertInto);
clause.getItems().add(item);
}
if (lexer.token() == Token.ELSE) {
lexer.nextToken();
OracleMultiInsertStatement.InsertIntoClause insertInto = new OracleMultiInsertStatement.InsertIntoClause();
parseInsert0(insertInto, false);
clause.setElseItem(insertInto);
}
}
SQLSelect subQuery = this.createSQLSelectParser().select();
stmt.setSubQuery(subQuery);
return stmt;
}
@@ -43,6 +43,8 @@ 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;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
@@ -735,5 +737,25 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
public void endVisit(OracleMultiInsertStatement x) {
}
@Override
public boolean visit(ConditionalInsertClause x) {
return true;
}
@Override
public void endVisit(ConditionalInsertClause x) {
}
@Override
public boolean visit(ConditionalInsertClauseItem x) {
return true;
}
@Override
public void endVisit(ConditionalInsertClauseItem x) {
}
}
@@ -47,6 +47,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
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;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
@@ -320,4 +322,12 @@ public interface OracleASTVisitor extends SQLASTVisitor {
boolean visit(OracleMultiInsertStatement x);
void endVisit(OracleMultiInsertStatement x);
boolean visit(ConditionalInsertClause x);
void endVisit(ConditionalInsertClause x);
boolean visit(ConditionalInsertClauseItem x);
void endVisit(ConditionalInsertClauseItem x);
}
@@ -75,6 +75,8 @@ 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;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
@@ -1543,7 +1545,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
x.getEntries().get(i).accept(this);
decrementIndent();
}
println();
x.getSubQuery().accept(this);
@@ -1554,4 +1556,50 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
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();
print("ELSE");
incrementIndent();
println();
x.getElseItem().accept(this);
decrementIndent();
}
return false;
}
@Override
public void endVisit(ConditionalInsertClause x) {
}
@Override
public boolean visit(ConditionalInsertClauseItem x) {
print("WHEN ");
x.getWhen().accept(this);
print(" THEN");
incrementIndent();
println();
x.getThen().accept(this);
decrementIndent();
return false;
}
@Override
public void endVisit(ConditionalInsertClauseItem x) {
}
}
@@ -5,6 +5,7 @@ import java.util.Map;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
@@ -56,6 +57,8 @@ 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;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
@@ -912,7 +915,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
@Override
public boolean visit(InsertIntoClause x) {
String originalTable = currentTableLocal.get();
if (x.getTableName() instanceof SQLName) {
String ident = ((SQLName) x.getTableName()).toString();
currentTableLocal.set(ident);
@@ -933,12 +936,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
aliasMap.put(ident, ident);
}
}
accept(x.getColumns());
accept(x.getQuery());
accept(x.getReturning());
accept(x.getErrorLogging());
return false;
}
@@ -953,13 +956,13 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
modeLocal.set(Mode.Insert);
aliasLocal.set(new HashMap<String, String>());
accept(x.getSubQuery());
for (OracleMultiInsertStatement.Entry entry : x.getEntries()) {
entry.setParent(x);
}
accept(x.getEntries());
return false;
@@ -968,5 +971,47 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
@Override
public void endVisit(OracleMultiInsertStatement x) {
}
@Override
public boolean visit(ConditionalInsertClause x) {
for (ConditionalInsertClauseItem item : x.getItems()) {
item.setParent(x);
}
if (x.getElseItem() != null) {
x.getElseItem().setParent(x);
}
return true;
}
@Override
public void endVisit(ConditionalInsertClause x) {
}
@Override
public boolean visit(ConditionalInsertClauseItem x) {
String originalTable = currentTableLocal.get();
SQLObject parent = x.getParent();
if (parent instanceof ConditionalInsertClause) {
parent = parent.getParent();
}
if (parent instanceof OracleMultiInsertStatement) {
SQLSelect subQuery = ((OracleMultiInsertStatement) parent).getSubQuery();
if (subQuery != null) {
String table = (String) subQuery.getAttribute("_table_");
currentTableLocal.set(table);
}
}
x.getWhen().accept(this);
x.getThen().accept(this);
currentTableLocal.set(originalTable);
return false;
}
@Override
public void endVisit(ConditionalInsertClauseItem x) {
}
}
@@ -168,8 +168,12 @@ public class SQLStatementParser extends SQLParser {
parseInsert0(insertStatement);
return insertStatement;
}
protected void parseInsert0(SQLInsertInto insertStatement) {
parseInsert0(insertStatement, true);
}
protected void parseInsert0(SQLInsertInto insertStatement, boolean acceptSubQuery) {
accept(Token.INTO);
SQLName tableName = this.exprParser.name();
@@ -193,7 +197,7 @@ public class SQLStatementParser extends SQLParser {
this.exprParser.exprList(values.getValues());
insertStatement.setValues(values);
accept(Token.RPAREN);
} else if (lexer.token() == Token.SELECT || lexer.token() == Token.LPAREN) {
} else if (acceptSubQuery && (lexer.token() == Token.SELECT || lexer.token() == Token.LPAREN)) {
SQLQueryExpr queryExpr = (SQLQueryExpr) this.createExprParser().expr();
insertStatement.setQuery(queryExpr.getSubQuery());
}