diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGArrayExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLArrayExpr.java similarity index 61% rename from src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGArrayExpr.java rename to src/main/java/com/alibaba/druid/sql/ast/expr/SQLArrayExpr.java index 65783b444c..4e7b218219 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGArrayExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLArrayExpr.java @@ -1,27 +1,13 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.postgresql.ast.expr; +package com.alibaba.druid.sql.ast.expr; import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class PGArrayExpr extends PGExprImpl { +public class SQLArrayExpr extends SQLExprImpl { private SQLExpr expr; @@ -44,7 +30,7 @@ public void setValues(List values) { } @Override - public void accept0(PGASTVisitor visitor) { + protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, expr); acceptChild(visitor, values); @@ -66,7 +52,7 @@ public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; - PGArrayExpr other = (PGArrayExpr) obj; + SQLArrayExpr other = (SQLArrayExpr) obj; if (expr == null) { if (other.expr != null) return false; } else if (!expr.equals(other.expr)) return false; @@ -76,4 +62,6 @@ public boolean equals(Object obj) { return true; } + + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java index c090e7c57f..fcb5c170ad 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.dialect.odps.parser; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; @@ -118,6 +119,16 @@ public SQLExpr primaryRest(SQLExpr expr) { expr = dotRest(expr); return expr; } + + if (lexer.token() == Token.LBRACKET) { + SQLArrayExpr array = new SQLArrayExpr(); + array.setExpr(expr); + lexer.nextToken(); + this.exprList(array.getValues(), array); + accept(Token.RBRACKET); + return primaryRest(array); + } + return super.primaryRest(expr); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java index de6b67faac..d2e02501c6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java @@ -17,9 +17,27 @@ import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.expr.*; +import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; +import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; +import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.PGOrderBy; -import com.alibaba.druid.sql.dialect.postgresql.ast.expr.*; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGDateField; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGExtractExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGInetExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGIntervalExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGLineSegmentsExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPointExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPolygonExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGTypeCastExpr; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.Token; @@ -77,7 +95,7 @@ public PGOrderBy parseOrderBy() { public SQLExpr primary() { if (lexer.token() == Token.ARRAY) { - PGArrayExpr array = new PGArrayExpr(); + SQLArrayExpr array = new SQLArrayExpr(); array.setExpr(new SQLIdentifierExpr(lexer.stringVal())); lexer.nextToken(); accept(Token.LBRACKET); @@ -129,7 +147,7 @@ public SQLExpr primaryRest(SQLExpr expr) { } if (lexer.token() == Token.LBRACKET) { - PGArrayExpr array = new PGArrayExpr(); + SQLArrayExpr array = new SQLArrayExpr(); array.setExpr(expr); lexer.nextToken(); this.exprList(array.getValues(), array); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java index 3bf2ccf5e3..af14f251ee 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java @@ -17,7 +17,6 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; -import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGArrayExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr; @@ -102,10 +101,6 @@ public interface PGASTVisitor extends SQLASTVisitor { boolean visit(PGValuesQuery x); - void endVisit(PGArrayExpr x); - - boolean visit(PGArrayExpr x); - void endVisit(PGExtractExpr x); boolean visit(PGExtractExpr x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java index b39513e486..6633b9048d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java @@ -17,7 +17,6 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; -import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGArrayExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr; @@ -201,16 +200,6 @@ public boolean visit(PGValuesQuery x) { return true; } - @Override - public void endVisit(PGArrayExpr x) { - - } - - @Override - public boolean visit(PGArrayExpr x) { - return true; - } - @Override public void endVisit(PGExtractExpr x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index 4d14a02acf..223b4a8594 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -21,7 +21,6 @@ import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; -import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGArrayExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr; @@ -527,20 +526,6 @@ public boolean visit(PGValuesQuery x) { return false; } - @Override - public void endVisit(PGArrayExpr x) { - - } - - @Override - public boolean visit(PGArrayExpr x) { - x.getExpr().accept(this); - print("["); - printAndAccept(x.getValues(), ", "); - print("]"); - return false; - } - @Override public void endVisit(PGExtractExpr x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java index 3e534f61b0..b5da89c442 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java @@ -23,7 +23,6 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; -import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGArrayExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr; @@ -311,16 +310,6 @@ public boolean visit(PGValuesQuery x) { return true; } - @Override - public void endVisit(PGArrayExpr x) { - - } - - @Override - public boolean visit(PGArrayExpr x) { - return true; - } - @Override public void endVisit(PGExtractExpr x) { diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index f555b041b9..ea966bfd11 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -38,6 +38,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLAllExpr; import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; +import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; @@ -2357,4 +2358,12 @@ public boolean visit(SQLAlterTableTouch x) { return false; } + @Override + public boolean visit(SQLArrayExpr x) { + x.getExpr().accept(this); + print("["); + printAndAccept(x.getValues(), ", "); + print("]"); + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index 44f9613daf..bcca890f2c 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLAllExpr; import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; +import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; @@ -619,4 +620,8 @@ public interface SQLASTVisitor { boolean visit(SQLAlterTableTouch x); + void endVisit(SQLArrayExpr x); + + boolean visit(SQLArrayExpr x); + } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index ed662fabf3..98a9fd802a 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLAllExpr; import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; +import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; @@ -1225,4 +1226,14 @@ public boolean visit(SQLAlterTableTouch x) { return true; } + @Override + public void endVisit(SQLArrayExpr x) { + + } + + @Override + public boolean visit(SQLArrayExpr x) { + return true; + } + } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest27.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest27.java new file mode 100644 index 0000000000..b121e2d2d6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest27.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsFormatCommentTest27 extends TestCase { + public void test_drop_function() throws Exception { + String sql = "select split(val, ',')[1] from dual"; + Assert.assertEquals("SELECT SPLIT(val, ',')[1]" + + "\nFROM dual", SQLUtils.formatOdps(sql)); + } +}