mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
mysql parser bug fixed
This commit is contained in:
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+107
-11
@@ -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;
|
||||
|
||||
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -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
-4
@@ -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;
|
||||
}
|
||||
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+1
-16
@@ -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);
|
||||
|
||||
-13
@@ -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;
|
||||
}
|
||||
|
||||
-5
@@ -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();
|
||||
}
|
||||
|
||||
+9
-9
@@ -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();
|
||||
|
||||
+4
-4
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user