mysql parser bug fixed

This commit is contained in:
温少
2012-05-17 14:47:54 +08:00
37 changed files with 767 additions and 156 deletions
@@ -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);
}
}
@@ -38,6 +38,8 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr.Search
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSQLColumnDefinition;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLExprParser;
@@ -580,4 +582,28 @@ public class MySqlExprParser extends SQLExprParser {
}
return super.nameRest(name);
}
public Limit parseLimit() {
if (lexer.token() == Token.LIMIT) {
lexer.nextToken();
MySqlSelectQueryBlock.Limit limit = new MySqlSelectQueryBlock.Limit();
SQLExpr temp = this.expr();
if (lexer.token() == (Token.COMMA)) {
limit.setOffset(temp);
lexer.nextToken();
limit.setRowCount(this.expr());
} else if (identifierEquals("OFFSET")) {
limit.setRowCount(temp);
lexer.nextToken();
limit.setOffset(this.expr());
} else {
limit.setRowCount(temp);
}
return limit;
}
return null;
}
}
@@ -22,9 +22,14 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
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.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;
@@ -177,24 +182,7 @@ public class MySqlSelectParser extends SQLSelectParser {
queryBlock.setOrderBy(this.createExprParser().parseOrderBy());
if (lexer.token() == Token.LIMIT) {
lexer.nextToken();
MySqlSelectQueryBlock.Limit limit = new MySqlSelectQueryBlock.Limit();
SQLExpr temp = this.createExprParser().expr();
if (lexer.token() == (Token.COMMA)) {
limit.setOffset(temp);
lexer.nextToken();
limit.setRowCount(createExprParser().expr());
} else if (identifierEquals("OFFSET")) {
limit.setRowCount(temp);
lexer.nextToken();
limit.setOffset(createExprParser().expr());
} else {
limit.setRowCount(temp);
}
queryBlock.setLimit(limit);
queryBlock.setLimit(parseLimit());
}
if (identifierEquals("PROCEDURE")) {
@@ -263,13 +251,64 @@ 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;
mysqlUnionQuery.setLimit(parseLimit());
}
return super.unionRest(union);
}
public Limit parseLimit() {
return this.createExprParser().parseLimit();
}
}
@@ -59,7 +59,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStateme
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplicateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlResetStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRollbackStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement;
@@ -1930,28 +1929,8 @@ public class MySqlStatementParser extends SQLStatementParser {
}
}
private Limit parseLimit() {
if (lexer.token() == Token.LIMIT) {
lexer.nextToken();
MySqlSelectQueryBlock.Limit limit = new MySqlSelectQueryBlock.Limit();
SQLExpr temp = this.exprParser.expr();
if (lexer.token() == (Token.COMMA)) {
limit.setOffset(temp);
lexer.nextToken();
limit.setRowCount(exprParser.expr());
} else if (identifierEquals("OFFSET")) {
limit.setRowCount(temp);
lexer.nextToken();
limit.setOffset(exprParser.expr());
} else {
limit.setRowCount(temp);
}
return limit;
}
return null;
public Limit parseLimit() {
return ((MySqlExprParser) this.exprParser).parseLimit();
}
public SQLStatement parseAlter() {
@@ -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;
@@ -161,6 +164,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
if (x.isHignPriority()) {
print("HIGH_PRIORITY ");
}
if (x.isStraightJoin()) {
print("STRAIGHT_JOIN ");
}
if (x.isSmallResult()) {
print("SQL_SMALL_RESULT ");
@@ -1350,7 +1357,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 +1366,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 +2228,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 +2247,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlCreateIndexStatement x) {
}
@Override
@@ -2253,7 +2260,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlRenameTableStatement.Item x) {
}
@Override
@@ -2265,7 +2272,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlRenameTableStatement x) {
}
@Override
@@ -2274,9 +2281,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 +2293,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, ", ");