From 4ed063711e7413373bfeaf7d28ff04996e1255d6 Mon Sep 17 00:00:00 2001 From: huangtiande Date: Thu, 5 Feb 2015 18:40:59 +0800 Subject: [PATCH 1/5] =?UTF-8?q?pg=20delete=E8=AF=AD=E5=8F=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=88=AB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgresql/parser/PGSQLStatementParser.java | 8 ++++++++ .../druid/bvt/sql/postgresql/PGDeleteTest.java | 13 +++++++++++++ 2 files changed, 21 insertions(+) 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 69207d1621..584bf910a1 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 @@ -151,6 +151,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(); 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 5e13e8c7b4..7724869667 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")); + } } From 0b9b02cd9995b38fbf1e13fc68a9851fc80b2bc7 Mon Sep 17 00:00:00 2001 From: huangtiande Date: Fri, 6 Feb 2015 10:17:53 +0800 Subject: [PATCH 2/5] =?UTF-8?q?insert=E8=AF=AD=E5=8F=A5=E5=A2=9E=E5=8A=A0d?= =?UTF-8?q?efault=20values=E6=94=AF=E6=8C=81=20example:=20insert=20into=20?= =?UTF-8?q?test01=20DEFAULT=20VALUES?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgresql/ast/stmt/PGInsertStatement.java | 11 ++++++++++- .../postgresql/parser/PGSQLStatementParser.java | 6 ++++++ .../druid/bvt/sql/postgresql/PGInsertTest0.java | 13 ++++++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) 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 1659ac9185..0e40cad3fe 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/PGSQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java index 584bf910a1..30558e5269 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 @@ -100,6 +100,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(); 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 b01fd61117..09fb3dc72b 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")); + } } From fd73ffb6af4e9130ffdea79ec5a4995491232809 Mon Sep 17 00:00:00 2001 From: huangtiande Date: Fri, 13 Feb 2015 10:12:44 +0800 Subject: [PATCH 3/5] =?UTF-8?q?fix=20escape=20bug=20=E8=AE=A9sql=E4=BF=9D?= =?UTF-8?q?=E6=8C=81=E5=8E=9F=E6=A0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java | 2 ++ 1 file changed, 2 insertions(+) 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 8f3fc4f5ad..2e8e8c7331 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 @@ -92,6 +92,7 @@ public class PGLexer extends Lexer { hasSpecial = true; } + putChar('\\'); switch (ch) { case '\0': putChar('\0'); @@ -137,6 +138,7 @@ public class PGLexer extends Lexer { arraycopy(mark + 1, buf, 0, bufPos); hasSpecial = true; putChar('\''); + putChar('\''); continue; } } From b4c855ab0a4293407f3e2a7c61b08207613cf784 Mon Sep 17 00:00:00 2001 From: huangtiande Date: Fri, 13 Feb 2015 10:20:49 +0800 Subject: [PATCH 4/5] fix table alias bug --- .../druid/sql/dialect/postgresql/parser/PGSelectParser.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 d3abbba30d..9f6bfb20d3 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 @@ -250,11 +250,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); From 7d1b290c435647134be4f1d87ea62437755272b8 Mon Sep 17 00:00:00 2001 From: huangtiande Date: Thu, 6 Aug 2015 16:07:53 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20with=20as=20=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E5=88=97=E8=A7=A3=E6=9E=90bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgresql/parser/PGSQLStatementParser.java | 10 +++++++++- .../bvt/sql/postgresql/PGSelectTest21.java | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) 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); + } }