mysql parser bug fixed

This commit is contained in:
温少
2012-05-17 14:06:42 +08:00
34 changed files with 526 additions and 117 deletions
@@ -0,0 +1,6 @@
package com.alibaba.druid.sql.ast;
public interface SQLHint extends SQLObject {
}
@@ -91,24 +91,24 @@ public class SQLJoinTableSource extends SQLTableSourceImpl {
}
public static enum JoinType {
COMMA, JOIN, INNER_JOIN, CROSS_JOIN, NATURAL_JOIN, NATURAL_INNER_JOIN, LEFT_OUTER_JOIN, RIGHT_OUTER_JOIN,
FULL_OUTER_JOIN;
COMMA(","), //
JOIN("JOIN"), //
INNER_JOIN("INNER JOIN"), //
CROSS_JOIN("CROSS JOIN"), //
NATURAL_JOIN("NATURAL JOIN"), //
NATURAL_INNER_JOIN("NATURAL INNER JOIN"), //
LEFT_OUTER_JOIN("LEFT JOIN"),
RIGHT_OUTER_JOIN("RIGHT JOIN"),
FULL_OUTER_JOIN("FULL JOIN"),
STRAIGHT_JOIN("STRAIGHT_JOIN");
public final String name;
JoinType(String name){
this.name = name;
}
public static String toString(JoinType joinType) {
if (JOIN.equals(joinType)) return "JOIN";
if (INNER_JOIN.equals(joinType)) return "INNER JOIN";
if (CROSS_JOIN.equals(joinType)) return "CROSS JOIN";
if (NATURAL_JOIN.equals(joinType)) return "NATURAL JOIN";
if (NATURAL_INNER_JOIN.equals(joinType)) return "NATURAL INNER JOIN";
if (LEFT_OUTER_JOIN.equals(joinType)) return "LEFT JOIN";
if (RIGHT_OUTER_JOIN.equals(joinType)) return "RIGHT JOIN";
if (FULL_OUTER_JOIN.equals(joinType)) {
return "FULL JOIN";
}
if (COMMA.equals(joinType)) {
return ",";
}
throw new IllegalStateException("not supported join " + joinType);
return joinType.name;
}
}
}
@@ -1,5 +1,8 @@
package com.alibaba.druid.sql.ast.statement;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.SQLObject;
public interface SQLTableSource extends SQLObject {
@@ -7,4 +10,6 @@ public interface SQLTableSource extends SQLObject {
String getAlias();
void setAlias(String alias);
List<SQLHint> getHints();
}
@@ -15,6 +15,10 @@
*/
package com.alibaba.druid.sql.ast.statement;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.SQLObjectImpl;
public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTableSource {
@@ -23,6 +27,8 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab
protected String alias;
protected List<SQLHint> hints = new ArrayList<SQLHint>(2);
public SQLTableSourceImpl(){
}
@@ -39,4 +45,13 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab
public void setAlias(String alias) {
this.alias = alias;
}
public List<SQLHint> getHints() {
return hints;
}
public void setHints(List<SQLHint> hints) {
this.hints = hints;
}
}
@@ -1,7 +1,7 @@
package com.alibaba.druid.sql.ast.statement;
public enum SQLUnionOperator {
UNION("UNION"), UNION_ALL("UNION ALL"), MINUS("MINUS"), INTERSECT("INTERSECT");
UNION("UNION"), UNION_ALL("UNION ALL"), MINUS("MINUS"), INTERSECT("INTERSECT"), DISTINCT("UNION DISTINCT");
public final String name;
@@ -68,6 +68,7 @@ public class SQLUnionQuery extends SQLSelectQuery {
if (visitor.visit(this)) {
acceptChild(visitor, left);
acceptChild(visitor, right);
acceptChild(visitor, orderBy);
}
visitor.endVisit(this);
}
@@ -0,0 +1,8 @@
package com.alibaba.druid.sql.dialect.mysql.ast;
import com.alibaba.druid.sql.ast.SQLHint;
public interface MySqlHint extends SQLHint, MySqlObject {
}
@@ -0,0 +1,16 @@
package com.alibaba.druid.sql.dialect.mysql.ast;
public interface MySqlIndexHint extends MySqlHint {
public static enum Option {
JOIN("JOIN"),
ORDER_BY("ORDER BY"),
GROUP_BY("GROUP BY")
;
public final String name;
Option(String name) {
this.name = name;
}
}
}
@@ -0,0 +1,36 @@
package com.alibaba.druid.sql.dialect.mysql.ast;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public abstract class MySqlIndexHintImpl extends MySqlObjectImpl implements MySqlIndexHint {
private static final long serialVersionUID = 1L;
private MySqlIndexHint.Option option;
private List<SQLName> indexList = new ArrayList<SQLName>();
@Override
public abstract void accept0(MySqlASTVisitor visitor);
public MySqlIndexHint.Option getOption() {
return option;
}
public void setOption(MySqlIndexHint.Option option) {
this.option = option;
}
public List<SQLName> getIndexList() {
return indexList;
}
public void setIndexList(List<SQLName> indexList) {
this.indexList = indexList;
}
}
@@ -0,0 +1,17 @@
package com.alibaba.druid.sql.dialect.mysql.ast;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlUseIndexHint extends MySqlIndexHintImpl {
private static final long serialVersionUID = 1L;
@Override
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, getIndexList());
}
visitor.endVisit(this);
}
}
@@ -0,0 +1,41 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class MySqlUnionQuery extends SQLUnionQuery implements MySqlStatement {
private static final long serialVersionUID = 1L;
private Limit limit;
public Limit getLimit() {
return limit;
}
public void setLimit(Limit limit) {
this.limit = limit;
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor instanceof MySqlASTVisitor) {
accept0((MySqlASTVisitor) visitor);
} else {
throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName());
}
}
@Override
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, getLeft());
acceptChild(visitor, getRight());
acceptChild(visitor, getOrderBy());
acceptChild(visitor, getLimit());
}
visitor.endVisit(this);
}
}
@@ -23,11 +23,13 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectGroupBy;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnionQuery;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnionQuery;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLSelectParser;
@@ -249,19 +251,55 @@ public class MySqlSelectParser extends SQLSelectParser {
protected MySqlExprParser createExprParser() {
return new MySqlExprParser(lexer);
}
protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) throws ParserException {
if (identifierEquals("USING")) {
return tableSource;
}
if (identifierEquals("USE")) {
lexer.nextToken();
MySqlUseIndexHint hint = new MySqlUseIndexHint();
if (lexer.token() == Token.INDEX) {
lexer.nextToken();
} else {
accept(Token.KEY);
}
if (lexer.token() == Token.FOR) {
lexer.nextToken();
if (lexer.token() == Token.JOIN) {
lexer.nextToken();
hint.setOption(MySqlIndexHint.Option.JOIN);
} else if (lexer.token() == Token.ORDER) {
lexer.nextToken();
accept(Token.BY);
hint.setOption(MySqlIndexHint.Option.ORDER_BY);
} else {
accept(Token.GROUP);
accept(Token.BY);
hint.setOption(MySqlIndexHint.Option.GROUP_BY);
}
}
accept(Token.LPAREN);
this.createExprParser().names(hint.getIndexList());
accept(Token.RPAREN);
tableSource.getHints().add(hint);
}
if (identifierEquals("IGNORE")) {
throw new ParserException("TODO");
}
return super.parseTableSourceRest(tableSource);
}
protected MySqlUnionQuery createSQLUnionQuery() {
return new MySqlUnionQuery();
}
public SQLUnionQuery unionRest(SQLUnionQuery union) {
if (lexer.token() == Token.LIMIT) {
MySqlUnionQuery mysqlUnionQuery = (MySqlUnionQuery) union;
@@ -269,7 +307,7 @@ public class MySqlSelectParser extends SQLSelectParser {
}
return super.unionRest(union);
}
public Limit parseLimit() {
return this.createExprParser().parseLimit();
}
@@ -17,6 +17,7 @@ package com.alibaba.druid.sql.dialect.mysql.visitor;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr;
@@ -97,6 +98,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatem
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnionQuery;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -445,4 +447,12 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
boolean visit(MySqlDropViewStatement x);
void endVisit(MySqlDropViewStatement x);
boolean visit(MySqlUnionQuery x);
void endVisit(MySqlUnionQuery x);
boolean visit(MySqlUseIndexHint x);
void endVisit(MySqlUseIndexHint x);
}
@@ -2,6 +2,7 @@ package com.alibaba.druid.sql.dialect.mysql.visitor;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr;
@@ -84,6 +85,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatem
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnionQuery;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement;
import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter;
@@ -969,4 +971,24 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements
public void endVisit(MySqlDropViewStatement x) {
}
@Override
public boolean visit(MySqlUnionQuery x) {
return true;
}
@Override
public void endVisit(MySqlUnionQuery x) {
}
@Override
public boolean visit(MySqlUseIndexHint x) {
return true;
}
@Override
public void endVisit(MySqlUseIndexHint x) {
}
}
@@ -29,10 +29,12 @@ import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType;
import com.alibaba.druid.sql.ast.statement.SQLColumnConstraint;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr;
@@ -118,6 +120,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatem
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnionQuery;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
@@ -1350,7 +1353,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public boolean visit(MySqlDropTableStatement x) {
if (x.isTemporary()) {
print("DROP TEMPORARY TABLE ");
print("DROP TEMPORARY TABLE ");
} else {
print("DROP TABLE ");
}
@@ -1359,14 +1362,14 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
}
printAndAccept(x.getTableSources(), ", ");
if (x.getOption() != null) {
print(' ');
print(x.getOption());
}
return false;
}
@Override
public void endVisit(MySqlPartitionByKey x) {
@@ -2221,16 +2224,16 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
print(x.getType());
print(" ");
}
print("INDEX ");
x.getName().accept(this);
print(" ON ");
x.getTable().accept(this);
print(" (");
printAndAccept(x.getItems(), ", ");
print(")");
if (x.getUsing() != null) {
print(" USING ");
print(x.getUsing());
@@ -2240,7 +2243,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlCreateIndexStatement x) {
}
@Override
@@ -2253,7 +2256,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlRenameTableStatement.Item x) {
}
@Override
@@ -2265,7 +2268,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlRenameTableStatement x) {
}
@Override
@@ -2274,9 +2277,9 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
if (x.isIfExists()) {
print("IF EXISTS ");
}
printAndAccept(x.getTableSources(), ", ");
if (x.getOption() != null) {
print(' ');
print(x.getOption());
@@ -2286,7 +2289,100 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlDropViewStatement x) {
}
@Override
public boolean visit(MySqlUnionQuery x) {
{
boolean needParen = false;
if (x.getLeft() instanceof MySqlSelectQueryBlock) {
MySqlSelectQueryBlock right = (MySqlSelectQueryBlock) x.getLeft();
if (right.getOrderBy() != null || right.getLimit() != null) {
needParen = true;
}
}
if (needParen) {
print('(');
x.getLeft().accept(this);
print(')');
} else {
x.getLeft().accept(this);
}
}
println();
print(x.getOperator().name);
println();
boolean needParen = false;
if (x.getOrderBy() != null || x.getLimit() != null) {
needParen = true;
} else if (x.getRight() instanceof MySqlSelectQueryBlock) {
MySqlSelectQueryBlock right = (MySqlSelectQueryBlock) x.getRight();
if (right.getOrderBy() != null || right.getLimit() != null) {
needParen = true;
}
}
if (needParen) {
print('(');
x.getRight().accept(this);
print(')');
} else {
x.getRight().accept(this);
}
if (x.getOrderBy() != null) {
println();
x.getOrderBy().accept(this);
}
if (x.getLimit() != null) {
println();
x.getLimit().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlUnionQuery x) {
}
@Override
public boolean visit(MySqlUseIndexHint x) {
print("USE INDEX ");
if (x.getOption() != null) {
print("FOR ");
print(x.getOption().name);
print(' ');
}
print('(');
printAndAccept(x.getIndexList(), ", ");
print(')');
return false;
}
@Override
public void endVisit(MySqlUseIndexHint x) {
}
public boolean visit(SQLExprTableSource x) {
x.getExpr().accept(this);
if (x.getAlias() != null) {
print(' ');
print(x.getAlias());
}
for (int i = 0; i < x.getHints().size(); ++i) {
print(' ');
x.getHints().get(i).accept(this);
}
return false;
}
}
@@ -8,9 +8,11 @@ import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr;
@@ -93,6 +95,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatem
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnionQuery;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.stat.TableStat;
@@ -1032,4 +1035,24 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
public void endVisit(MySqlDropViewStatement x) {
}
@Override
public boolean visit(MySqlUnionQuery x) {
return visit((SQLUnionQuery) x);
}
@Override
public void endVisit(MySqlUnionQuery x) {
}
@Override
public boolean visit(MySqlUseIndexHint x) {
return false;
}
@Override
public void endVisit(MySqlUseIndexHint x) {
}
}
@@ -15,9 +15,10 @@
*/
package com.alibaba.druid.sql.dialect.oracle.ast;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
public class OracleHint extends OracleSQLObjectImpl {
public class OracleHint extends OracleSQLObjectImpl implements SQLHint {
private static final long serialVersionUID = 1L;
@@ -18,8 +18,8 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
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;
@@ -30,7 +30,7 @@ public class OracleDeleteStatement extends SQLDeleteStatement {
private boolean only = false;
private final List<OracleHint> hints = new ArrayList<OracleHint>();
private final List<SQLHint> hints = new ArrayList<SQLHint>();
private OracleReturningClause returning = null;
public OracleDeleteStatement(){
@@ -45,7 +45,7 @@ public class OracleDeleteStatement extends SQLDeleteStatement {
this.returning = returning;
}
public List<OracleHint> getHints() {
public List<SQLHint> getHints() {
return this.hints;
}
@@ -3,8 +3,8 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
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;
@@ -16,13 +16,13 @@ public class OracleInsertStatement extends SQLInsertStatement implements OracleS
private OracleReturningClause returning;
private OracleErrorLoggingClause errorLogging;
private List<OracleHint> hints = new ArrayList<OracleHint>();
private List<SQLHint> hints = new ArrayList<SQLHint>();
public List<OracleHint> getHints() {
public List<SQLHint> getHints() {
return hints;
}
public void setHints(List<OracleHint> hints) {
public void setHints(List<SQLHint> hints) {
this.hints = hints;
}
@@ -4,10 +4,10 @@ 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.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
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;
@@ -16,7 +16,7 @@ public class OracleMergeStatement extends OracleStatementImpl {
private static final long serialVersionUID = 1L;
private final List<OracleHint> hints = new ArrayList<OracleHint>();
private final List<SQLHint> hints = new ArrayList<SQLHint>();
private SQLName into;
private String alias;
@@ -94,7 +94,7 @@ public class OracleMergeStatement extends OracleStatementImpl {
this.errorLoggingClause = errorLoggingClause;
}
public List<OracleHint> getHints() {
public List<SQLHint> getHints() {
return hints;
}
@@ -4,9 +4,9 @@ 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.statement.SQLInsertInto;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
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;
@@ -25,13 +25,13 @@ public class OracleMultiInsertStatement extends OracleStatementImpl {
private SQLSelect subQuery;
private Option option;
private List<Entry> entries = new ArrayList<Entry>();
private List<OracleHint> hints = new ArrayList<OracleHint>();
private List<SQLHint> hints = new ArrayList<SQLHint>(1);
public List<OracleHint> getHints() {
public List<SQLHint> getHints() {
return hints;
}
public void setHints(List<OracleHint> hints) {
public void setHints(List<SQLHint> hints) {
this.hints = hints;
}
@@ -20,7 +20,6 @@ import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -32,7 +31,6 @@ public class OracleSelectJoin extends SQLJoinTableSource implements OracleSelect
private final List<SQLExpr> using = new ArrayList<SQLExpr>();
protected OracleSelectPivotBase pivot;
protected FlashbackQueryClause flashback;
private List<OracleHint> hints = new ArrayList<OracleHint>();
public OracleSelectJoin(String alias){
super(alias);
@@ -42,14 +40,6 @@ public class OracleSelectJoin extends SQLJoinTableSource implements OracleSelect
}
public List<OracleHint> getHints() {
return hints;
}
public void setHints(List<OracleHint> hints) {
this.hints = hints;
}
public FlashbackQueryClause getFlashback() {
return flashback;
}
@@ -18,10 +18,10 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -30,7 +30,7 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
private static final long serialVersionUID = 1L;
private final List<OracleHint> hints = new ArrayList<OracleHint>(1);
private final List<SQLHint> hints = new ArrayList<SQLHint>(1);
private OracleSelectHierachicalQueryClause hierachicalQueryClause;
private ModelClause modelClause;
@@ -55,7 +55,7 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
this.hierachicalQueryClause = hierachicalQueryClause;
}
public List<OracleHint> getHints() {
public List<SQLHint> getHints() {
return this.hints;
}
@@ -15,12 +15,8 @@
*/
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -33,18 +29,7 @@ public class OracleSelectSubqueryTableSource extends SQLSubqueryTableSource impl
protected FlashbackQueryClause flashback;
private List<OracleHint> hints = new ArrayList<OracleHint>();
public OracleSelectSubqueryTableSource(){
}
public List<OracleHint> getHints() {
return hints;
}
public void setHints(List<OracleHint> hints) {
this.hints = hints;
}
public FlashbackQueryClause getFlashback() {
@@ -82,7 +67,7 @@ public class OracleSelectSubqueryTableSource extends SQLSubqueryTableSource impl
protected void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, this.hints);
acceptChild(visitor, this.getHints());
acceptChild(visitor, this.select);
acceptChild(visitor, this.pivot);
acceptChild(visitor, this.flashback);
@@ -15,11 +15,7 @@
*/
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
@@ -37,20 +33,11 @@ public class OracleSelectTableReference extends SQLExprTableSource implements Or
protected SampleClause sampleClause;
protected FlashbackQueryClause flashback;
private List<OracleHint> hints = new ArrayList<OracleHint>();
public OracleSelectTableReference(){
}
public List<OracleHint> getHints() {
return hints;
}
public void setHints(List<OracleHint> hints) {
this.hints = hints;
}
public FlashbackQueryClause getFlashback() {
return flashback;
}
@@ -15,10 +15,7 @@
*/
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import java.util.List;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
public interface OracleSelectTableSource extends SQLTableSource {
@@ -30,6 +27,4 @@ public interface OracleSelectTableSource extends SQLTableSource {
FlashbackQueryClause getFlashback();
void setFlashback(FlashbackQueryClause flashback);
List<OracleHint> getHints();
}
@@ -19,22 +19,22 @@ 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.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class OracleUpdateStatement extends SQLUpdateStatement implements OracleStatement {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
private final List<OracleHint> hints = new ArrayList<OracleHint>(1);
private boolean only = false;
private String alias;
private SQLExpr where;
private final List<SQLHint> hints = new ArrayList<SQLHint>(1);
private boolean only = false;
private String alias;
private SQLExpr where;
private List<SQLExpr> returning = new ArrayList<SQLExpr>();
private List<SQLExpr> returningInto = new ArrayList<SQLExpr>();
private List<SQLExpr> returning = new ArrayList<SQLExpr>();
private List<SQLExpr> returningInto = new ArrayList<SQLExpr>();
public OracleUpdateStatement(){
@@ -103,7 +103,7 @@ public class OracleUpdateStatement extends SQLUpdateStatement implements OracleS
this.only = only;
}
public List<OracleHint> getHints() {
public List<SQLHint> getHints() {
return this.hints;
}
}
@@ -21,6 +21,7 @@ import java.util.List;
import com.alibaba.druid.sql.ast.SQLDataType;
import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
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.SQLOrderingSpecification;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
@@ -747,7 +748,7 @@ public class OracleExprParser extends SQLExprParser {
return super.relationalRest(expr);
}
public void parseHints(List<OracleHint> hints) {
public void parseHints(List<SQLHint> hints) {
if (lexer.token() == Token.HINT) {
hints.add(new OracleHint(lexer.stringVal()));
lexer.nextToken();
@@ -286,6 +286,9 @@ public class OracleSelectParser extends SQLSelectParser {
if (lexer.token() == (Token.ALL)) {
union.setOperator(SQLUnionOperator.UNION_ALL);
lexer.nextToken();
} else if (lexer.token() == (Token.DISTINCT)) {
union.setOperator(SQLUnionOperator.DISTINCT);
lexer.nextToken();
}
SQLSelectQuery right = query();
@@ -20,6 +20,7 @@ import java.util.List;
import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
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.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
@@ -39,7 +40,6 @@ import com.alibaba.druid.sql.ast.statement.SQLSetStatement;
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.OracleHint;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
@@ -115,7 +115,7 @@ public class OracleStatementParser extends SQLStatementParser {
return (OracleExprParser) exprParser;
}
public void parseHints(List<OracleHint> hints) {
public void parseHints(List<SQLHint> hints) {
this.getExprParser().parseHints(hints);
}
@@ -128,7 +128,7 @@ public class OracleStatementParser extends SQLStatementParser {
OracleInsertStatement stmt = (OracleInsertStatement) insertStatement;
this.getExprParser().parseHints(stmt.getHints());
} else {
List<OracleHint> hints = new ArrayList<OracleHint>();
List<SQLHint> hints = new ArrayList<SQLHint>(1);
this.getExprParser().parseHints(hints);
}
}
@@ -1243,7 +1243,7 @@ public class OracleStatementParser extends SQLStatementParser {
accept(Token.INSERT);
List<OracleHint> hints = new ArrayList<OracleHint>();
List<SQLHint> hints = new ArrayList<SQLHint>();
parseHints(hints);
@@ -19,6 +19,7 @@ import java.util.List;
import com.alibaba.druid.sql.ast.SQLDataType;
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.SQLObject;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
@@ -200,7 +201,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
}
private void printHints(List<OracleHint> hints) {
private void printHints(List<SQLHint> hints) {
if (hints.size() > 0) {
print("/*+ ");
printAndAccept(hints, ", ");
@@ -52,11 +52,11 @@ public class SQLSelectParser extends SQLParser {
return select;
}
protected SQLUnionQuery createSQLUnionQuery() {
return new SQLUnionQuery();
}
public SQLUnionQuery unionRest(SQLUnionQuery union) {
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = this.createExprParser().parseOrderBy();
@@ -76,8 +76,10 @@ public class SQLSelectParser extends SQLParser {
if (lexer.token() == Token.ALL) {
union.setOperator(SQLUnionOperator.UNION_ALL);
lexer.nextToken();
} else if (lexer.token() == Token.DISTINCT) {
union.setOperator(SQLUnionOperator.DISTINCT);
lexer.nextToken();
}
SQLSelectQuery right = this.query();
union.setRight(right);
@@ -240,18 +242,23 @@ public class SQLSelectParser extends SQLParser {
}
private void parseTableSourceQueryTableExpr(SQLExprTableSource tableReference) throws ParserException {
if (lexer.token() == Token.LITERAL_ALIAS || lexer.token() == Token.IDENTIFIED || lexer.token() == Token.LITERAL_CHARS) {
if (lexer.token() == Token.LITERAL_ALIAS || lexer.token() == Token.IDENTIFIED
|| lexer.token() == Token.LITERAL_CHARS) {
tableReference.setExpr(this.createExprParser().name());
return;
}
tableReference.setExpr(expr());
}
protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) throws ParserException {
if ((tableSource.getAlias() == null) || (tableSource.getAlias().length() == 0)) {
if (lexer.token() != Token.LEFT && lexer.token() != Token.RIGHT && lexer.token() != Token.FULL) {
tableSource.setAlias(as());
String alias = as();
if (alias != null) {
tableSource.setAlias(alias);
return parseTableSourceRest(tableSource);
}
}
}
@@ -289,6 +296,9 @@ public class SQLSelectParser extends SQLParser {
} else if (lexer.token() == Token.COMMA) {
lexer.nextToken();
joinType = SQLJoinTableSource.JoinType.COMMA;
} else if (identifierEquals("STRAIGHT_JOIN")) {
lexer.nextToken();
joinType = SQLJoinTableSource.JoinType.STRAIGHT_JOIN;
}
if (joinType != null) {
@@ -797,7 +797,26 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter {
println();
print(x.getOperator().name);
println();
x.getRight().accept(this);
boolean needParen = false;
if (x.getOrderBy() != null) {
needParen = true;
}
if (needParen) {
print('(');
x.getRight().accept(this);
print(')');
} else {
x.getRight().accept(this);
}
if (x.getOrderBy() != null) {
println();
x.getOrderBy().accept(this);
}
return false;
}