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 30558e5269..8cc0a0fd0c 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 @@ -21,6 +21,7 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; @@ -238,7 +239,14 @@ public class PGSQLStatementParser extends SQLStatementParser { private PGWithQuery withQuery() { PGWithQuery withQuery = new PGWithQuery(); - withQuery.setName(this.exprParser.expr()); + + if (lexer.token() == Token.LITERAL_ALIAS) { + withQuery.setName(new SQLIdentifierExpr("\"" + lexer.stringVal() + + "\"")); + } else { + withQuery.setName(new SQLIdentifierExpr(lexer.stringVal())); + } + lexer.nextToken(); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest21.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest21.java index d9286b3d90..eb9f4705c2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest21.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest21.java @@ -21,6 +21,7 @@ import org.junit.Assert; import com.alibaba.druid.sql.PGTest; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement; import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; @@ -48,4 +49,20 @@ public class PGSelectTest21 extends PGTest { Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(1, visitor.getTables().size()); } + + public void test_1() throws Exception { + String sql = "with a(a1,b1) as (select * from b) select * from a"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + assertTrue(statemen instanceof PGSelectStatement); + assertTrue(((PGSelectStatement)statemen).getWith().getWithQuery().size()==1); + StringBuffer sb = new StringBuffer(); + ((PGSelectStatement)statemen).getWith().getWithQuery().get(0).getName().output(sb); + assertTrue("a".equals(sb.toString())); + assertTrue(((PGSelectStatement)statemen).getWith().getWithQuery().get(0).getColumns().size()==2); + } }