From 6672fc5cd92949dab714dfc69a25a34db51c8ff3 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 4 Feb 2018 11:32:38 +0800 Subject: [PATCH] improved pg sql parser. for issue #2309 --- .../ast/stmt/PGConnectToStatement.java | 45 +++++++++++++++++++ .../postgresql/visitor/PGASTVisitor.java | 4 +- .../visitor/PGASTVisitorAdapter.java | 10 +++++ .../postgresql/visitor/PGOutputVisitor.java | 12 +++++ .../visitor/PGSchemaStatVisitor.java | 10 +++++ .../bvt/sql/postgresql/PGConnectTo_0.java | 33 ++++++++++++++ 6 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGConnectToStatement.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGConnectTo_0.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGConnectToStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGConnectToStatement.java new file mode 100644 index 0000000000..2e61b2255b --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGConnectToStatement.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.sql.dialect.postgresql.ast.stmt; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import com.alibaba.druid.util.JdbcConstants; + +public class PGConnectToStatement extends SQLStatementImpl implements PGSQLStatement { + private SQLName target; + + public PGConnectToStatement() { + super(JdbcConstants.POSTGRESQL); + } + + protected void accept0(SQLASTVisitor visitor) { + this.accept0((PGASTVisitor) visitor); + } + + public void output(StringBuffer buf) { + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(buf, dbType); + this.accept(visitor); + } + + @Override + public void accept0(PGASTVisitor v) { + if (v.visit(this)) { + acceptChild(v, target); + } + v.endVisit(this); + } + + public SQLName getTarget() { + return target; + } + + public void setTarget(SQLName x) { + if (x != null) { + x.setParent(this); + } + this.target = x; + } +} 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 d6adfbb197..1efae9c32f 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 @@ -106,7 +106,9 @@ public interface PGASTVisitor extends SQLASTVisitor { boolean visit(PGShowStatement x); void endVisit(PGStartTransactionStatement x); - boolean visit(PGStartTransactionStatement x); + void endVisit(PGConnectToStatement x); + boolean visit(PGConnectToStatement 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 d04e12d50c..e5dc5fd7e7 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 @@ -257,4 +257,14 @@ public class PGASTVisitorAdapter extends SQLASTVisitorAdapter implements PGASTVi return true; } + @Override + public void endVisit(PGConnectToStatement x) { + + } + + @Override + public boolean visit(PGConnectToStatement x) { + return true; + } + } 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 72eb3084bc..b98a436544 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 @@ -651,6 +651,18 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor return false; } + @Override + public void endVisit(PGConnectToStatement x) { + + } + + @Override + public boolean visit(PGConnectToStatement x) { + print0(ucase ? "CONNECT TO " : "connect to "); + x.getTarget().accept(this); + return false; + } + @Override public boolean visit(SQLSetStatement x) { print0(ucase ? "SET " : "set "); 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 240a1a4b4b..74fe07e7f5 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 @@ -339,4 +339,14 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit return false; } + @Override + public void endVisit(PGConnectToStatement x) { + + } + + @Override + public boolean visit(PGConnectToStatement x) { + return false; + } + } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGConnectTo_0.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGConnectTo_0.java new file mode 100644 index 0000000000..a6ddfb04ea --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGConnectTo_0.java @@ -0,0 +1,33 @@ +/* + * Copyright 1999-2017 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.bvt.sql.postgresql; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class PGConnectTo_0 extends PGTest { + public void testConnectTo() throws Exception { + List stmtList = SQLUtils.parseStatements("CONNECT to db_2", JdbcConstants.POSTGRESQL); + assertEquals(1, stmtList.size()); + + SQLStatement stmt = stmtList.get(0); + assertEquals("CONNECT TO db_2", stmt.toString()); + } +}