diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java index eb0cd7f01d..4954f2e25b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java @@ -29,6 +29,7 @@ public class PGInsertStatement extends SQLInsertStatement implements PGSQLStatem private PGWithClause with; private List valuesList = new ArrayList(); private SQLExpr returning; + private boolean defaultValues = false; public SQLExpr getReturning() { return returning; @@ -70,7 +71,15 @@ public class PGInsertStatement extends SQLInsertStatement implements PGSQLStatem valuesList.add(valueClause); } - protected void accept0(SQLASTVisitor visitor) { + public boolean isDefaultValues() { + return defaultValues; + } + + public void setDefaultValues(boolean defaultValues) { + this.defaultValues = defaultValues; + } + + protected void accept0(SQLASTVisitor visitor) { accept0((PGASTVisitor) visitor); } 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 eef1593c78..78e42b9c39 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 @@ -94,6 +94,7 @@ public class PGLexer extends Lexer { hasSpecial = true; } + putChar('\\'); switch (ch) { case '\0': putChar('\0'); @@ -139,6 +140,7 @@ public class PGLexer extends Lexer { arraycopy(mark + 1, buf, 0, bufPos); hasSpecial = true; putChar('\''); + putChar('\''); continue; } } 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 a57bc96805..5854fa78ca 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; @@ -101,6 +102,12 @@ public class PGSQLStatementParser extends SQLStatementParser { } } + + if (lexer.token() == Token.DEFAULT) { + lexer.nextToken(); + accept(Token.VALUES); + stmt.setDefaultValues(true); + } if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); @@ -152,6 +159,14 @@ public class PGSQLStatementParser extends SQLStatementParser { SQLName tableName = exprParser.name(); deleteStatement.setTableName(tableName); + + if (lexer.token() == Token.AS) { + accept(Token.AS); + } + if (lexer.token() == Token.IDENTIFIER) { + deleteStatement.setAlias(lexer.stringVal()); + lexer.nextToken(); + } if (lexer.token() == Token.USING) { lexer.nextToken(); @@ -225,7 +240,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/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java index ad7bb47bf8..4b24d808a8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSelectParser.java @@ -259,11 +259,10 @@ public class PGSelectParser extends SQLSelectParser { protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) { if (lexer.token() == Token.AS && tableSource instanceof SQLExprTableSource) { - String alias = this.as(); - if (lexer.token() == Token.LPAREN) { SQLExprTableSource exprTableSource = (SQLExprTableSource) tableSource; + String alias = this.as(); PGFunctionTableSource functionTableSource = new PGFunctionTableSource(exprTableSource.getExpr()); functionTableSource.setAlias(alias); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest.java index 1b993236fd..d2f778aeb2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest.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.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; import com.alibaba.druid.stat.TableStat; @@ -50,5 +51,17 @@ public class PGDeleteTest extends PGTest { //Assert.assertTrue(visitor.getFields().size() == 0); } + public void test_1() { + String sql = "delete from test01 as a where a.id = 2"; + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + assertTrue(statementList.size() == 1); + assertTrue(statemen instanceof PGDeleteStatement); + PGDeleteStatement delete = (PGDeleteStatement) statemen; + assertTrue(delete.getAlias().equalsIgnoreCase("a")); + assertTrue(delete.getTableName().getSimpleName().equals("test01")); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGInsertTest0.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGInsertTest0.java index dd232ec670..67cc1bdfd1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGInsertTest0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGInsertTest0.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.PGInsertStatement; import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; import com.alibaba.druid.stat.TableStat; @@ -51,5 +52,15 @@ public class PGInsertTest0 extends PGTest { // Assert.assertTrue(visitor.getFields().contains(new TableStat.Column("films", "producer_id"))); } - + public void test_1() { + String sql = "insert into test01 DEFAULT VALUES"; + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + assertTrue(statemen instanceof PGInsertStatement); + PGInsertStatement insert = (PGInsertStatement) statemen; + assertTrue(insert.getTableName().getSimpleName() + .equalsIgnoreCase("test01")); + } } 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 dae9eca573..2daf437402 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); + } }