From 4df624ae4baf2c0ac4ce6933cdb02e3e90afa3aa Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 1 Jun 2014 11:36:26 +0800 Subject: [PATCH] bug fixed for exprList --- .../com/alibaba/druid/sql/ast/SQLOrderBy.java | 1 + .../druid/sql/ast/expr/SQLAggregateExpr.java | 15 ++++++++++- .../ast/statement/SQLSelectOrderByItem.java | 24 +++++++++++++++++ .../mysql/parser/MySqlCreateTableParser.java | 4 +-- .../dialect/mysql/parser/MySqlExprParser.java | 2 +- .../mysql/parser/MySqlStatementParser.java | 10 +++---- .../oracle/ast/stmt/OracleOrderByItem.java | 26 ------------------- .../oracle/parser/OracleExprParser.java | 8 +++--- .../oracle/parser/OracleSelectParser.java | 20 +++++++------- .../oracle/parser/OracleStatementParser.java | 6 ++--- .../parser/PGSQLStatementParser.java | 4 +-- .../parser/SQLServerStatementParser.java | 2 +- .../druid/sql/parser/SQLExprParser.java | 9 ++++--- .../druid/sql/parser/SQLSelectParser.java | 2 +- .../druid/sql/parser/SQLStatementParser.java | 10 +++---- 15 files changed, 78 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java b/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java index be5c893e27..a453b1187a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java @@ -74,4 +74,5 @@ public class SQLOrderBy extends SQLObjectImpl { return true; } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java index 89c1fd6a0f..bf7fa1e2a7 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java @@ -21,6 +21,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOver; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -31,9 +32,9 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable { protected Option option; protected final List arguments = new ArrayList(); protected SQLOver over; + protected SQLOrderBy withinGroup; public SQLAggregateExpr(String methodName){ - this.methodName = methodName; } @@ -50,6 +51,18 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable { this.methodName = methodName; } + public SQLOrderBy getWithinGroup() { + return withinGroup; + } + + public void setWithinGroup(SQLOrderBy withinGroup) { + if (withinGroup != null) { + withinGroup.setParent(this); + } + + this.withinGroup = withinGroup; + } + public Option getOption() { return this.option; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java index 622bc800ce..723594d1e3 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java @@ -25,6 +25,7 @@ public class SQLSelectOrderByItem extends SQLObjectImpl { protected SQLExpr expr; protected String collate; protected SQLOrderingSpecification type; + protected NullsOrderType nullsOrderType; public SQLSelectOrderByItem(){ @@ -60,6 +61,14 @@ public class SQLSelectOrderByItem extends SQLObjectImpl { public void setType(SQLOrderingSpecification type) { this.type = type; } + + public NullsOrderType getNullsOrderType() { + return this.nullsOrderType; + } + + public void setNullsOrderType(NullsOrderType nullsOrderType) { + this.nullsOrderType = nullsOrderType; + } protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { @@ -95,4 +104,19 @@ public class SQLSelectOrderByItem extends SQLObjectImpl { return true; } + public static enum NullsOrderType { + NullsFirst, NullsLast; + + public String toFormalString() { + if (NullsFirst.equals(this)) { + return "NULLS FIRST"; + } + + if (NullsLast.equals(this)) { + return "NULLS LAST"; + } + + throw new IllegalArgumentException(); + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index ed5147a5d8..716b21142f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -493,7 +493,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { MySqlPartitioningDef.InValues values = new MySqlPartitioningDef.InValues(); accept(Token.LPAREN); - this.exprParser.exprList(values.getItems()); + this.exprParser.exprList(values.getItems(), values); accept(Token.RPAREN); partitionDef.setValues(values); } else { @@ -503,7 +503,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { MySqlPartitioningDef.LessThanValues values = new MySqlPartitioningDef.LessThanValues(); accept(Token.LPAREN); - this.exprParser.exprList(values.getItems()); + this.exprParser.exprList(values.getItems(), values); accept(Token.RPAREN); partitionDef.setValues(values); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index e2b7dd26c5..bd0ddc6434 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -394,7 +394,7 @@ public class MySqlExprParser extends SQLExprParser { if (lexer.token() == Token.RPAREN) { lexer.nextToken(); } else { - exprList(matchAgainstExpr.getColumns()); + exprList(matchAgainstExpr.getColumns(), matchAgainstExpr); accept(Token.RPAREN); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 0e3a1244bd..be0dc0a2f0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -1582,7 +1582,7 @@ public class MySqlStatementParser extends SQLStatementParser { SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr(); stmt.setQuery(queryExpr); } else { - this.exprParser.exprList(stmt.getColumns()); + this.exprParser.exprList(stmt.getColumns(), stmt); } accept(Token.RPAREN); } @@ -1807,7 +1807,7 @@ public class MySqlStatementParser extends SQLStatementParser { if (identifierEquals("USING")) { lexer.nextToken(); - exprParser.exprList(stmt.getParameters()); + exprParser.exprList(stmt.getParameters(), stmt); } return stmt; @@ -1861,7 +1861,7 @@ public class MySqlStatementParser extends SQLStatementParser { select.setParent(insertStatement); insertStatement.setQuery(select); } else { - this.exprParser.exprList(insertStatement.getColumns()); + this.exprParser.exprList(insertStatement.getColumns(), insertStatement); columnSize = insertStatement.getColumns().size(); } accept(Token.RPAREN); @@ -1912,7 +1912,7 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.KEY); accept(Token.UPDATE); - exprParser.exprList(insertStatement.getDuplicateKeyUpdate()); + exprParser.exprList(insertStatement.getDuplicateKeyUpdate(), insertStatement); } return insertStatement; @@ -2520,7 +2520,7 @@ public class MySqlStatementParser extends SQLStatementParser { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); SQLListExpr list = new SQLListExpr(); - this.exprParser.exprList(list.getItems()); + this.exprParser.exprList(list.getItems(), list); accept(Token.RPAREN); item.setColumn(list); } else { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleOrderByItem.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleOrderByItem.java index 82e03d043a..a00d47ea6a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleOrderByItem.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleOrderByItem.java @@ -22,20 +22,10 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class OracleOrderByItem extends SQLSelectOrderByItem { - private NullsOrderType nullsOrderType; - public OracleOrderByItem(){ } - public NullsOrderType getNullsOrderType() { - return this.nullsOrderType; - } - - public void setNullsOrderType(NullsOrderType nullsOrderType) { - this.nullsOrderType = nullsOrderType; - } - protected void accept0(SQLASTVisitor visitor) { if (visitor instanceof OracleASTVisitor) { accept0((OracleASTVisitor) visitor); @@ -66,20 +56,4 @@ public class OracleOrderByItem extends SQLSelectOrderByItem { } } - public static enum NullsOrderType { - NullsFirst, NullsLast; - - public String toFormalString() { - if (NullsFirst.equals(this)) { - return "NULLS FIRST"; - } - - if (NullsLast.equals(this)) { - return "NULLS LAST"; - } - - throw new IllegalArgumentException(); - } - } - } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index d4ce172654..fb5cc2946d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -760,7 +760,7 @@ public class OracleExprParser extends SQLExprParser { } else { aggregateExpr = new OracleAggregateExpr(methodName); } - exprList(aggregateExpr.getArguments()); + exprList(aggregateExpr.getArguments(), aggregateExpr); if (lexer.stringVal().equalsIgnoreCase("IGNORE")) { lexer.nextToken(); @@ -782,10 +782,10 @@ public class OracleExprParser extends SQLExprParser { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); - exprList(over.getPartitionBy()); + exprList(over.getPartitionBy(), over); accept(Token.RPAREN); } else { - exprList(over.getPartitionBy()); + exprList(over.getPartitionBy(), over); } } @@ -1024,7 +1024,7 @@ public class OracleExprParser extends SQLExprParser { OraclePrimaryKey primaryKey = new OraclePrimaryKey(); accept(Token.LPAREN); - exprList(primaryKey.getColumns()); + exprList(primaryKey.getColumns(), primaryKey); accept(Token.RPAREN); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 541a7ace25..95c12850bc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -96,7 +96,7 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == Token.OF) { lexer.nextToken(); - this.exprParser.exprList(forUpdate.getOf()); + this.exprParser.exprList(forUpdate.getOf(), forUpdate); } if (lexer.token() == Token.NOWAIT) { @@ -207,7 +207,7 @@ public class OracleSelectParser extends SQLSelectParser { if (identifierEquals("CYCLE")) { lexer.nextToken(); CycleClause cycleClause = new CycleClause(); - exprParser.exprList(cycleClause.getAliases()); + exprParser.exprList(cycleClause.getAliases(), cycleClause); accept(Token.SET); cycleClause.setMark(exprParser.expr()); accept(Token.TO); @@ -510,7 +510,7 @@ public class OracleSelectParser extends SQLSelectParser { cellAssignment.setMeasureColumn(expr()); accept(Token.LBRACKET); - this.exprParser.exprList(cellAssignment.getConditions()); + this.exprParser.exprList(cellAssignment.getConditions(), cellAssignment); accept(Token.RBRACKET); return cellAssignment; @@ -524,10 +524,10 @@ public class OracleSelectParser extends SQLSelectParser { accept(Token.BY); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - exprParser.exprList(queryPartitionClause.getExprList()); + exprParser.exprList(queryPartitionClause.getExprList(), queryPartitionClause); accept(Token.RPAREN); } else { - exprParser.exprList(queryPartitionClause.getExprList()); + exprParser.exprList(queryPartitionClause.getExprList(), queryPartitionClause); } modelColumnClause.setQueryPartitionClause(queryPartitionClause); } @@ -573,7 +573,7 @@ public class OracleSelectParser extends SQLSelectParser { lexer.nextToken(); acceptIdentifier("SETS"); accept(Token.LPAREN); - exprParser.exprList(groupingSet.getParameters()); + exprParser.exprList(groupingSet.getParameters(), groupingSet); accept(Token.RPAREN); groupBy.addItem(groupingSet); } else { @@ -610,7 +610,7 @@ public class OracleSelectParser extends SQLSelectParser { lexer.nextToken(); acceptIdentifier("SETS"); accept(Token.LPAREN); - exprParser.exprList(groupingSet.getParameters()); + exprParser.exprList(groupingSet.getParameters(), groupingSet); accept(Token.RPAREN); groupBy.addItem(groupingSet); } else { @@ -760,7 +760,7 @@ public class OracleSelectParser extends SQLSelectParser { } accept(Token.LPAREN); - this.exprParser.exprList(sample.getPercent()); + this.exprParser.exprList(sample.getPercent(), sample); accept(Token.RPAREN); if (identifierEquals("SEED")) { @@ -959,7 +959,7 @@ public class OracleSelectParser extends SQLSelectParser { } else if (lexer.token() == Token.USING) { lexer.nextToken(); accept(Token.LPAREN); - this.exprParser.exprList(join.getUsing()); + this.exprParser.exprList(join.getUsing(), join); accept(Token.RPAREN); } @@ -1060,7 +1060,7 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); - this.exprParser.exprList(unPivot.getItems()); + this.exprParser.exprList(unPivot.getItems(), unPivot); accept(Token.RPAREN); } else { unPivot.getItems().add(this.exprParser.expr()); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index b245b5d8f7..4ea1acdfba 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -965,7 +965,7 @@ public class OracleStatementParser extends SQLStatementParser { if (identifierEquals("AT")) { lexer.nextToken(); accept(Token.LPAREN); - this.exprParser.exprList(item.getAt()); + this.exprParser.exprList(item.getAt(), item); accept(Token.RPAREN); } else { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); @@ -1206,12 +1206,12 @@ public class OracleStatementParser extends SQLStatementParser { if (lexer.token() == Token.LPAREN) { accept(Token.LPAREN); - exprParser.exprList(insertClause.getColumns()); + exprParser.exprList(insertClause.getColumns(), insertClause); accept(Token.RPAREN); } accept(Token.VALUES); accept(Token.LPAREN); - exprParser.exprList(insertClause.getValues()); + exprParser.exprList(insertClause.getValues(), insertClause); accept(Token.RPAREN); if (lexer.token() == Token.WHERE) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java index 124df2bdf8..523874cdc3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java @@ -100,7 +100,7 @@ public class PGSQLStatementParser extends SQLStatementParser { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); - this.exprParser.exprList(stmt.getColumns()); + this.exprParser.exprList(stmt.getColumns(), stmt); accept(Token.RPAREN); } @@ -110,7 +110,7 @@ public class PGSQLStatementParser extends SQLStatementParser { for (;;) { accept(Token.LPAREN); SQLInsertStatement.ValuesClause valuesCaluse = new SQLInsertStatement.ValuesClause(); - this.exprParser.exprList(valuesCaluse.getValues()); + this.exprParser.exprList(valuesCaluse.getValues(), valuesCaluse); stmt.addValueCause(valuesCaluse); accept(Token.RPAREN); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java index cfef12a6c1..f85241aaca 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java @@ -109,7 +109,7 @@ public class SQLServerStatementParser extends SQLStatementParser { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); - this.exprParser.exprList(insertStatement.getColumns()); + this.exprParser.exprList(insertStatement.getColumns(), insertStatement); accept(Token.RPAREN); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index c60beafe11..a77b70be60 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -714,6 +714,7 @@ public class SQLExprParser extends SQLParser { } } + @Deprecated public final void exprList(Collection exprCol) { exprList(exprCol, null); } @@ -878,10 +879,10 @@ public class SQLExprParser extends SQLParser { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); - exprList(over.getPartitionBy()); + exprList(over.getPartitionBy(), over); accept(Token.RPAREN); } else { - exprList(over.getPartitionBy()); + exprList(over.getPartitionBy(), over); } } @@ -1539,7 +1540,7 @@ public class SQLExprParser extends SQLParser { SQLPrimaryKeyImpl pk = new SQLPrimaryKeyImpl(); accept(Token.LPAREN); - exprList(pk.getColumns()); + exprList(pk.getColumns(), pk); accept(Token.RPAREN); return pk; @@ -1550,7 +1551,7 @@ public class SQLExprParser extends SQLParser { SQLUnique unique = new SQLUnique(); accept(Token.LPAREN); - exprList(unique.getColumns()); + exprList(unique.getColumns(), unique); accept(Token.RPAREN); return unique; diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java index 8a18609ecb..8f874563e7 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java @@ -418,7 +418,7 @@ public class SQLSelectParser extends SQLParser { lexer.nextToken(); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - this.exprParser.exprList(join.getUsing()); + this.exprParser.exprList(join.getUsing(), join); accept(Token.RPAREN); } else { join.getUsing().add(this.expr()); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index f3d0bd70b9..8d2df6cb1c 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -1060,7 +1060,7 @@ public class SQLStatementParser extends SQLParser { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); - this.exprParser.exprList(insertStatement.getColumns()); + this.exprParser.exprList(insertStatement.getColumns(), insertStatement); accept(Token.RPAREN); } @@ -1068,7 +1068,7 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); accept(Token.LPAREN); SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(); - this.exprParser.exprList(values.getValues()); + this.exprParser.exprList(values.getValues(), values); insertStatement.setValues(values); accept(Token.RPAREN); } else if (acceptSubQuery && (lexer.token() == Token.SELECT || lexer.token() == Token.LPAREN)) { @@ -1133,7 +1133,7 @@ public class SQLStatementParser extends SQLParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - exprParser.exprList(stmt.getParameters()); + exprParser.exprList(stmt.getParameters(), stmt); accept(Token.RPAREN); } @@ -1390,7 +1390,7 @@ public class SQLStatementParser extends SQLParser { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); SQLListExpr list = new SQLListExpr(); - this.exprParser.exprList(list.getItems()); + this.exprParser.exprList(list.getItems(), list); accept(Token.RPAREN); item.setColumn(list); } else { @@ -1464,7 +1464,7 @@ public class SQLStatementParser extends SQLParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - this.exprParser.exprList(createView.getColumns()); + this.exprParser.exprList(createView.getColumns(), createView); accept(Token.RPAREN); }