diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java index 67063a4370..e9848e2b14 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java @@ -42,7 +42,7 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements Serializable { public SQLMethodInvokeExpr(String methodName, SQLExpr owner){ this.methodName = methodName; - this.owner = owner; + setOwner(owner); } public String getMethodName() { @@ -58,6 +58,9 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements Serializable { } public void setOwner(SQLExpr owner) { + if (owner != null) { + owner.setParent(this); + } this.owner = owner; } 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 f9676cff31..ad4abceac8 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 @@ -430,7 +430,7 @@ public class MySqlExprParser extends SQLExprParser { SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr(ident); if (lexer.token() != Token.RPAREN) { - exprList(methodInvokeExpr.getParameters()); + exprList(methodInvokeExpr.getParameters(), methodInvokeExpr); } if (identifierEquals("USING")) { @@ -454,11 +454,11 @@ public class MySqlExprParser extends SQLExprParser { accept(Token.IN); SQLExpr str = this.expr(); accept(Token.RPAREN); - + SQLMethodInvokeExpr locate = new SQLMethodInvokeExpr("LOCATE"); locate.getParameters().add(subStr); locate.getParameters().add(str); - + expr = locate; return primaryRest(expr); } @@ -536,7 +536,7 @@ public class MySqlExprParser extends SQLExprParser { SQLExpr expr = this.expr(); ((MySqlSQLColumnDefinition) column).setOnUpdate(expr); } - + if (identifierEquals("AUTO_INCREMENT")) { lexer.nextToken(); if (column instanceof MySqlSQLColumnDefinition) { @@ -552,13 +552,13 @@ public class MySqlExprParser extends SQLExprParser { if (identifierEquals("PARTITION")) { throw new ParserException("syntax error " + lexer.token() + " " + lexer.stringVal()); } - + if (identifierEquals("COMMENT")) { lexer.nextToken(); column.setComment(lexer.stringVal()); accept(Token.LITERAL_CHARS); } - + if (identifierEquals("STORAGE")) { lexer.nextToken(); SQLExpr expr = expr(); @@ -566,15 +566,15 @@ public class MySqlExprParser extends SQLExprParser { ((MySqlSQLColumnDefinition) column).setStorage(expr); } } - + super.parseColumnRest(column); return column; } - + protected SQLDataType parseDataTypeRest(SQLDataType dataType) { super.parseDataTypeRest(dataType); - + if (identifierEquals("UNSIGNED")) { lexer.nextToken(); dataType.getAttributes().put("unsigned", true); @@ -718,9 +718,9 @@ public class MySqlExprParser extends SQLExprParser { public MySqlUnique parseUnique() { accept(Token.UNIQUE); - + if (lexer.token() == Token.KEY) { - lexer.nextToken(); + lexer.nextToken(); } MySqlUnique unique = new MySqlUnique(); @@ -730,12 +730,12 @@ public class MySqlExprParser extends SQLExprParser { unique.setIndexType(lexer.stringVal()); lexer.nextToken(); } - + if (lexer.token() != Token.LPAREN) { - SQLName name = name(); - unique.setName(name); + SQLName name = name(); + unique.setName(name); } - + accept(Token.LPAREN); for (;;) { unique.getColumns().add(this.expr()); @@ -749,21 +749,21 @@ public class MySqlExprParser extends SQLExprParser { return unique; } - + public MySqlForeignKey parseForeignKey() { accept(Token.FOREIGN); accept(Token.KEY); - + MySqlForeignKey fk = new MySqlForeignKey(); - + accept(Token.LPAREN); this.names(fk.getReferencingColumns()); accept(Token.RPAREN); - + accept(Token.REFERENCES); - + fk.setReferencedTableName(this.name()); - + accept(Token.LPAREN); this.names(fk.getReferencedColumns()); 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 46790d1c67..d78e405e37 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -578,7 +578,7 @@ public class SQLExprParser extends SQLParser { methodInvokeExpr.getParameters().add(new SQLIdentifierExpr("+")); lexer.nextToken(); } else { - exprList(methodInvokeExpr.getParameters()); + exprList(methodInvokeExpr.getParameters(), methodInvokeExpr); } accept(Token.RPAREN); } @@ -612,7 +612,7 @@ public class SQLExprParser extends SQLParser { exprCol.add(name()); } } - + public final void exprList(Collection exprCol) { exprList(exprCol, null); } @@ -1264,7 +1264,7 @@ public class SQLExprParser extends SQLParser { column.getConstaints().add(new SQLColumnPrimaryKey()); return parseColumnRest(column); } - + if (lexer.token == Token.CHECK) { lexer.nextToken(); SQLExpr expr = this.expr();