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 15940d728b..f6e2056f4d 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 @@ -280,19 +280,18 @@ public class PGSQLStatementParser extends SQLStatementParser { public boolean parseStatementListDialect(List statementList) { switch (lexer.token()) { - case START: { - lexer.nextToken(); - acceptIdentifier("TRANSACTION"); - PGStartTransactionStatement stmt = new PGStartTransactionStatement(); - statementList.add(stmt); - lexer.nextToken(); - return true; - } - case WITH: - statementList.add(parseWith()); - return true; - default: - break; + case BEGIN: + case START: { + PGStartTransactionStatement stmt = parseBegin(); + statementList.add(stmt); + return true; + } + + case WITH: + statementList.add(parseWith()); + return true; + default: + break; } if (lexer.identifierEquals(FnvHash.Constants.CONNECT)) { @@ -304,6 +303,18 @@ public class PGSQLStatementParser extends SQLStatementParser { return false; } + protected PGStartTransactionStatement parseBegin() { + PGStartTransactionStatement stmt = new PGStartTransactionStatement(); + if (lexer.token() == Token.START) { + lexer.nextToken(); + acceptIdentifier("TRANSACTION"); + } else { + accept(Token.BEGIN); + } + + return stmt; + } + public SQLStatement parseConnectTo() { acceptIdentifier("CONNECT"); accept(Token.TO); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGBeginTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGBeginTest.java index 4a96f0b0ab..2151f6c8b2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGBeginTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGBeginTest.java @@ -16,13 +16,24 @@ 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.sql.dialect.postgresql.ast.stmt.PGStartTransactionStatement; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; public class PGBeginTest extends PGTest { public void testBegin() throws Exception { String sql = "start transaction;"; - String expected = "START TRANSACTION"; + String expected = "START TRANSACTION;"; testParseSql(sql, expected, expected, PGStartTransactionStatement.class); } + public void testBegin_1() throws Exception { + String sql = "begin"; + List stmtList = SQLUtils.parseStatements(sql, JdbcConstants.POSTGRESQL); + assertEquals(1, stmtList.size()); + } + }