improved pg sql parser. for issue #2309

This commit is contained in:
wenshao
2018-02-04 11:32:38 +08:00
parent 0f10b84a83
commit 6672fc5cd9
6 changed files with 113 additions and 1 deletions
@@ -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;
}
}
@@ -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);
}
@@ -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;
}
}
@@ -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 ");
@@ -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;
}
}
@@ -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<SQLStatement> 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());
}
}