diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGShowStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGShowStatement.java new file mode 100644 index 0000000000..e69510ff7a --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGShowStatement.java @@ -0,0 +1,31 @@ +package com.alibaba.druid.sql.dialect.postgresql.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class PGShowStatement extends SQLStatementImpl implements PGSQLStatement { + + private SQLExpr expr; + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + this.expr = expr; + } + + protected void accept0(SQLASTVisitor visitor) { + accept0((PGASTVisitor) visitor); + } + + @Override + public void accept0(PGASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.expr); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java index ff1377df20..22c2cff5a8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java @@ -55,6 +55,7 @@ public class PGLexer extends Lexer { map.put("ROW", Token.ROW); map.put("ROWS", Token.ROWS); map.put("SHARE", Token.SHARE); + map.put("SHOW", Token.SHOW); map.put("USING", Token.USING); map.put("WINDOW", Token.WINDOW); 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 3dae6d5a00..73bc2ef383 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 @@ -33,6 +33,7 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGShowStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGUpdateStatement; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; @@ -334,4 +335,11 @@ public class PGSQLStatementParser extends SQLStatementParser { } return alterColumn; } + + public SQLStatement parseShow() { + accept(Token.SHOW); + PGShowStatement stmt = new PGShowStatement(); + stmt.setExpr(this.exprParser.expr()); + return stmt; + } } 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 a8b705376c..3bf2ccf5e3 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,12 +17,25 @@ package com.alibaba.druid.sql.dialect.postgresql.visitor; 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.*; +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; +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.PGParameter; +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.dialect.postgresql.ast.stmt.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGFunctionTableSource; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGShowStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGUpdateStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGValuesQuery; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -132,5 +145,9 @@ public interface PGASTVisitor extends SQLASTVisitor { void endVisit(PGIntervalExpr x); boolean visit(PGIntervalExpr x); + + void endVisit(PGShowStatement x); + + boolean visit(PGShowStatement 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 3dcc0263f8..b39513e486 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,19 @@ package com.alibaba.druid.sql.dialect.postgresql.visitor; 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.*; +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; +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.PGParameter; +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.dialect.postgresql.ast.stmt.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGFunctionTableSource; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement; @@ -27,6 +39,7 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.ForC import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.PGLimit; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.WindowClause; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGShowStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGUpdateStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGValuesQuery; import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; @@ -297,5 +310,15 @@ public class PGASTVisitorAdapter extends SQLASTVisitorAdapter implements PGASTVi public boolean visit(PGIntervalExpr x) { return true; } + + @Override + public void endVisit(PGShowStatement x) { + + } + + @Override + public boolean visit(PGShowStatement 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 a61e03a938..d8ee5334ae 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,19 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; 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.*; +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; +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.PGParameter; +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.dialect.postgresql.ast.stmt.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGFunctionTableSource; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement; @@ -31,6 +43,7 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.ForC import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.PGLimit; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.WindowClause; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGShowStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGUpdateStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGValuesQuery; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; @@ -657,4 +670,16 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor return false; } + + @Override + public void endVisit(PGShowStatement x) { + + } + + @Override + public boolean visit(PGShowStatement x) { + print("SHOW "); + x.getExpr().accept(this); + return false; + } } 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 081625e84d..3e534f61b0 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,19 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; 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.*; +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; +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.PGParameter; +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.dialect.postgresql.ast.stmt.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGFunctionTableSource; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement; @@ -33,6 +45,7 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.ForC import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.PGLimit; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.WindowClause; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGShowStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGUpdateStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGValuesQuery; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; @@ -407,4 +420,14 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit public boolean visit(PGPointExpr x) { return true; } + + @Override + public void endVisit(PGShowStatement x) { + + } + + @Override + public boolean visit(PGShowStatement x) { + return false; + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGShowTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGShowTest.java new file mode 100644 index 0000000000..03e465de70 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGShowTest.java @@ -0,0 +1,54 @@ +/* + * 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.bvt.sql.postgresql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class PGShowTest extends PGTest { + + public void test_0() throws Exception { + String sql = "SHOW max_identifier_length"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("reviews"))); + + //Assert.assertTrue(visitor.getTables().get(new TableStat.Name("reviews")).getAlterCount() == 1); + + //Assert.assertTrue(visitor.getColumns().size() == 1); + } + + +}