diff --git a/core/pom.xml b/core/pom.xml index 88bba9bcb1..f79c842501 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ com.alibaba druid-parent - 1.2.25-SNAPSHOT + 1.2.28-SNAPSHOT ../pom.xml druid diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java b/core/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java index ba7563c348..f15adb699f 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java @@ -170,6 +170,12 @@ public void addArgument(SQLExpr arg) { this.arguments.add(arg); } + public void addArguments(List args) { + for (SQLExpr arg : args) { + addArgument(arg); + } + } + public SQLExpr getOwner() { return this.owner; } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/bigquery/parser/BigQueryExprParser.java b/core/src/main/java/com/alibaba/druid/sql/dialect/bigquery/parser/BigQueryExprParser.java index ea8536d4b2..33cdcfd400 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/bigquery/parser/BigQueryExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/bigquery/parser/BigQueryExprParser.java @@ -31,6 +31,8 @@ public class BigQueryExprParser extends SQLExprParser { "FIRST_VALUE", "GROUPING", "LAST_VALUE", + "LAG", + "LEAD", "LOGICAL_AND", "LOGICAL_OR", "MAX", diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java b/core/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java index 1458bf94bb..f5fa2311ae 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java @@ -363,6 +363,24 @@ public SQLExpr primaryRest(SQLExpr expr) { castExpr.setExpr(expr); castExpr.setDataType(dataType); + // If parseDataType consumed a COLLATE clause (e.g., ::text COLLATE "zh-Hans-x-icu"), + // extract it and wrap the cast in a COLLATE binary expression + if (dataType instanceof com.alibaba.druid.sql.ast.statement.SQLCharacterDataType) { + com.alibaba.druid.sql.ast.statement.SQLCharacterDataType charType = + (com.alibaba.druid.sql.ast.statement.SQLCharacterDataType) dataType; + String collate = charType.getCollate(); + if (collate != null) { + charType.setCollate(null); + SQLBinaryOpExpr collateExpr = new SQLBinaryOpExpr( + castExpr, + SQLBinaryOperator.COLLATE, + new SQLIdentifierExpr(collate), + dbType + ); + return primaryRest(collateExpr); + } + } + return primaryRest(castExpr); } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java b/core/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java index 7a61a02fb7..47c3c50cf4 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java @@ -1027,6 +1027,13 @@ public PGAnalyzeStatement parseAnalyzeTable() { Lexer.SavePoint mark = lexer.mark(); String strVal = lexer.stringVal(); for (; ; ) { + if (Token.SEMI.equals(lexer.token())) { + stmt.setAfterSemi(true); + return stmt; + } + if (Token.EOF == lexer.token()) { + return stmt; + } if (strVal.equalsIgnoreCase("VERBOSE")) { stmt.setVerbose(true); lexer.nextToken(); diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java index f68f12f167..a4063a042a 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java @@ -371,23 +371,25 @@ public boolean visit(SQLSelect x) { print0(ucase ? "FOR BROWSE" : "for browse"); } - if (x.getForXmlOptionsSize() > 0) { + if (x.getForXmlOptionsSize() > 0 || x.getXmlPath() != null) { println(); print0(ucase ? "FOR XML " : "for xml "); + + boolean first = true; + if (x.getXmlPath() != null) { + x.getXmlPath().accept(this); + first = false; + } + for (int i = 0; i < x.getForXmlOptions().size(); ++i) { - if (i != 0) { + if (!first) { print0(", "); - print0(x.getForXmlOptions().get(i)); } + print0(x.getForXmlOptions().get(i)); + first = false; } } - if (x.getXmlPath() != null) { - println(); - print0(ucase ? "FOR XML " : "for xml "); - x.getXmlPath().accept(this); - } - if (x.getOffset() != null) { println(); print0(ucase ? "OFFSET " : "offset "); diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/Keywords.java b/core/src/main/java/com/alibaba/druid/sql/parser/Keywords.java index a4aad6c520..d47306ac79 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/Keywords.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/Keywords.java @@ -176,6 +176,7 @@ public class Keywords { sqlitemap.put("MERGE", Token.MERGE); sqlitemap.put("MATCHED", Token.MATCHED); sqlitemap.put("USING", Token.USING); + sqlitemap.put("IDENTITY", Token.IDENTITY); DM_KEYWORDS = new Keywords(sqlitemap); } } diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 4845e11c6f..07713ad574 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1984,7 +1984,7 @@ protected SQLExpr methodRest(SQLExpr expr, boolean acceptLPAREN) { if (lexer.token == Token.OVER) { if (aggregateExpr == null) { aggregateExpr = new SQLAggregateExpr(methodName); - aggregateExpr.getArguments().addAll(methodInvokeExpr.getArguments()); + aggregateExpr.addArguments(methodInvokeExpr.getArguments()); } over(aggregateExpr); } @@ -4878,6 +4878,21 @@ public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) { SQLColumnCheck check = parseColumnCheck(); column.addConstraint(check); return parseColumnRest(column); + case IDENTITY: { + lexer.nextToken(); + SQLColumnDefinition.Identity identity = new SQLColumnDefinition.Identity(); + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + SQLIntegerExpr seed = (SQLIntegerExpr) this.primary(); + accept(Token.COMMA); + SQLIntegerExpr increment = (SQLIntegerExpr) this.primary(); + accept(Token.RPAREN); + identity.setSeed((Integer) seed.getNumber()); + identity.setIncrement((Integer) increment.getNumber()); + } + column.setIdentity(identity); + return parseColumnRest(column); + } case IDENTIFIER: long hash = lexer.hashLCase(); if (hash == FnvHash.Constants.AUTO_INCREMENT) { diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java index b889aa94b8..14e4d13e76 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java @@ -1237,6 +1237,13 @@ public SQLTableSource parseTableSource(boolean forFrom) { this.exprParser.names(values.getColumns(), values); accept(Token.RPAREN); } + } else if (tableSource instanceof SQLUnionQueryTableSource) { + SQLUnionQueryTableSource union = (SQLUnionQueryTableSource) tableSource; + if (lexer.token == Token.LPAREN) { + lexer.nextToken(); + this.exprParser.names(union.getColumns(), union); + accept(Token.RPAREN); + } } } @@ -1820,6 +1827,7 @@ public SQLTableSource parseTableSourceRest(SQLTableSource tableSource) { SQLTableSource unnestTableSource = parseUnnestTableSource(); if (unnestTableSource != null) { if (lexer.identifierEquals(FnvHash.Constants.CROSS) + || lexer.token == Token.CROSS || lexer.token == Token.LEFT || lexer.token == Token.RIGHT || lexer.token == Token.COMMA diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/bigquery/AggregateTest.java b/core/src/test/java/com/alibaba/druid/bvt/sql/bigquery/AggregateTest.java new file mode 100644 index 0000000000..2613dbefbb --- /dev/null +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/bigquery/AggregateTest.java @@ -0,0 +1,30 @@ +package com.alibaba.druid.bvt.sql.bigquery; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import org.junit.Test; + +import static org.junit.Assert.assertSame; + +public class AggregateTest { + @Test + public void test_agg() { + String sql = "SELECT lag(date(d,'Asia/Jakarta')) over(partition by id order by n) FROM t1"; + SQLSelectStatement stmt = (SQLSelectStatement) SQLUtils.parseSingleStatement(sql, DbType.bigquery); + SQLSelectQueryBlock queryBlock = stmt.getSelect().getQueryBlock(); + SQLAggregateExpr expr = (SQLAggregateExpr) queryBlock.getSelectList().get(0).getExpr(); + assertSame(expr, expr.getArgument(0).getParent()); + } + + @Test + public void test_agg_1() { + String sql = "SELECT xx(date(d,'Asia/Jakarta')) over(partition by id order by n) FROM t1"; + SQLSelectStatement stmt = (SQLSelectStatement) SQLUtils.parseSingleStatement(sql, DbType.bigquery); + SQLSelectQueryBlock queryBlock = stmt.getSelect().getQueryBlock(); + SQLAggregateExpr expr = (SQLAggregateExpr) queryBlock.getSelectList().get(0).getExpr(); + assertSame(expr, expr.getArgument(0).getParent()); + } +} diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/dm/DM_IdentityTest.java b/core/src/test/java/com/alibaba/druid/bvt/sql/dm/DM_IdentityTest.java new file mode 100644 index 0000000000..01e33b2ebd --- /dev/null +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/dm/DM_IdentityTest.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.dm; + +import java.util.List; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @see Issue来源 + */ +public class DM_IdentityTest { + + @Test + public void test_identity() { + String sql = "CREATE TABLE TEST.TEST_CREATE (\n" + + " id INT IDENTITY(1,1),\n" + + " name VARCHAR(64) NOT NULL,\n" + + " PRIMARY KEY (id)\n" + + ")"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.dm); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + } + + @Test + public void test_identity_with_not_null() { + String sql = "CREATE TABLE t (id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, val VARCHAR(100))"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.dm); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + } +} diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/postgresql/issues/Issue6572.java b/core/src/test/java/com/alibaba/druid/bvt/sql/postgresql/issues/Issue6572.java new file mode 100644 index 0000000000..848b126ab7 --- /dev/null +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/postgresql/issues/Issue6572.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql.postgresql.issues; + +import java.util.List; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @see Issue来源 + */ +public class Issue6572 { + + @Test + public void test_union_column_alias() { + String sql = "select * from (select 1 union all select 2) AS serise_table(time)"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + String output = stmtList.get(0).toString(); + // Verify column alias is preserved + assert output.contains("serise_table"); + } + + @Test + public void test_union_multiple_column_aliases() { + String sql = "select * from (select 1, 'a' union all select 2, 'b') AS t(id, name)"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + } +} diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/postgresql/issues/Issue6573.java b/core/src/test/java/com/alibaba/druid/bvt/sql/postgresql/issues/Issue6573.java new file mode 100644 index 0000000000..9375a545ac --- /dev/null +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/postgresql/issues/Issue6573.java @@ -0,0 +1,53 @@ +package com.alibaba.druid.bvt.sql.postgresql.issues; + +import java.util.List; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; + +import org.junit.Test; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; + +/** + * @see Issue来源 + */ +public class Issue6573 { + + @Test + public void test_order_by_collate() { + String sql = "SELECT * FROM t ORDER BY col COLLATE \"zh-Hans-x-icu\" DESC"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + String output = stmtList.get(0).toString(); + System.out.println("OUTPUT1: " + output.replace("\n", " | ")); + assertTrue("COLLATE clause should be preserved, got: " + output, output.contains("COLLATE")); + } + + @Test + public void test_order_by_cast_collate() { + // From the original issue - cast with COLLATE + String sql = "SELECT * FROM t ORDER BY col::text COLLATE \"zh-Hans-x-icu\" DESC LIMIT 10"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + String output = stmtList.get(0).toString(); + System.out.println("OUTPUT3: " + output.replace("\n", " | ")); + assertTrue("COLLATE clause should be preserved in cast expr, got: " + output, output.contains("COLLATE")); + } + + @Test + public void test_order_by_collate_simple() { + String sql = "SELECT * FROM t ORDER BY col COLLATE \"C\" DESC"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + String output = stmtList.get(0).toString(); + System.out.println("OUTPUT2: " + output.replace("\n", " | ")); + assertTrue("COLLATE clause should be preserved, got: " + output, output.contains("COLLATE")); + } +} diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/postgresql/issues/Issue6595.java b/core/src/test/java/com/alibaba/druid/bvt/sql/postgresql/issues/Issue6595.java new file mode 100644 index 0000000000..1e82182aef --- /dev/null +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/postgresql/issues/Issue6595.java @@ -0,0 +1,58 @@ +package com.alibaba.druid.bvt.sql.postgresql.issues; + +import java.util.List; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @see Issue来源 + */ +public class Issue6595 { + + @Test + public void test_analyze_skip_locked() { + String sql = "ANALYZE SKIP_LOCKED"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + } + + @Test + public void test_analyze_verbose() { + String sql = "ANALYZE VERBOSE"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + } + + @Test + public void test_analyze_verbose_skip_locked() { + String sql = "ANALYZE VERBOSE SKIP_LOCKED"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + } + + @Test + public void test_analyze_verbose_table() { + String sql = "ANALYZE VERBOSE my_table"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + } + + @Test + public void test_analyze_bare() { + String sql = "ANALYZE"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.postgresql); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + } +} diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/issues/Issue6564.java b/core/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/issues/Issue6564.java new file mode 100644 index 0000000000..03a5774dfa --- /dev/null +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/issues/Issue6564.java @@ -0,0 +1,56 @@ +package com.alibaba.druid.bvt.sql.sqlserver.issues; + +import java.util.List; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @see Issue来源 + */ +public class Issue6564 { + + @Test + public void test_for_xml_path_type() { + String sql = "SELECT ',' + Name FROM Employees FOR XML PATH(''), TYPE"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.sqlserver); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + String output = stmtList.get(0).toString(); + assertTrue("Output should contain FOR XML", output.toUpperCase().contains("FOR XML")); + assertTrue("Output should contain PATH('')", output.contains("PATH('')")); + assertTrue("Output should contain TYPE", output.toUpperCase().contains("TYPE")); + // FOR XML should appear only once + int idx1 = output.toUpperCase().indexOf("FOR XML"); + int idx2 = output.toUpperCase().indexOf("FOR XML", idx1 + 1); + assertEquals("FOR XML should appear only once", -1, idx2); + } + + @Test + public void test_for_xml_auto() { + String sql = "SELECT * FROM t FOR XML AUTO"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.sqlserver); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + String output = stmtList.get(0).toString(); + assertTrue("Output should contain FOR XML AUTO", output.toUpperCase().contains("FOR XML AUTO")); + } + + @Test + public void test_for_xml_path_elements() { + String sql = "SELECT * FROM t FOR XML PATH('root'), ELEMENTS"; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, DbType.sqlserver); + List stmtList = parser.parseStatementList(); + assertEquals(1, stmtList.size()); + String output = stmtList.get(0).toString(); + assertTrue("Output should contain PATH('root')", output.contains("PATH('root')")); + assertTrue("Output should contain ELEMENTS", output.toUpperCase().contains("ELEMENTS")); + } +} diff --git a/core/src/test/resources/bvt/parser/sqlserver/0.txt b/core/src/test/resources/bvt/parser/sqlserver/0.txt index 308c2e14a7..9c418d96cc 100644 --- a/core/src/test/resources/bvt/parser/sqlserver/0.txt +++ b/core/src/test/resources/bvt/parser/sqlserver/0.txt @@ -269,7 +269,7 @@ FROM Person.Person p JOIN Person.PersonPhone pph ON p.BusinessEntityID = pph.BusinessEntityID WHERE LastName LIKE 'G%' ORDER BY LastName, FirstName -FOR XML , TYPE, XMLSCHEMA, ELEMENTS XSINIL +FOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL ------------------------------------------------------------------------------------------------------------------------ SELECT First_Name + ' ' + Last Name FROM Employees ORDER BY First_Name OFFSET 10 ROWS -------------------- diff --git a/druid-demo-petclinic/pom.xml b/druid-demo-petclinic/pom.xml index 525d9f1e5a..efb3569930 100644 --- a/druid-demo-petclinic/pom.xml +++ b/druid-demo-petclinic/pom.xml @@ -34,7 +34,7 @@ com.alibaba druid-spring-boot-starter - 1.2.25-SNAPSHOT + 1.2.28-SNAPSHOT diff --git a/druid-spring-boot-3-starter/pom.xml b/druid-spring-boot-3-starter/pom.xml index ece5b7b91a..26a6c02979 100644 --- a/druid-spring-boot-3-starter/pom.xml +++ b/druid-spring-boot-3-starter/pom.xml @@ -5,7 +5,7 @@ com.alibaba druid-parent - 1.2.25-SNAPSHOT + 1.2.28-SNAPSHOT ../pom.xml druid-spring-boot-3-starter diff --git a/druid-spring-boot-starter/pom.xml b/druid-spring-boot-starter/pom.xml index 0699247fdb..0259238061 100644 --- a/druid-spring-boot-starter/pom.xml +++ b/druid-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ com.alibaba druid-parent - 1.2.25-SNAPSHOT + 1.2.28-SNAPSHOT ../pom.xml druid-spring-boot-starter diff --git a/druid-wrapper/pom.xml b/druid-wrapper/pom.xml index 52cf8bb089..c9397d7270 100755 --- a/druid-wrapper/pom.xml +++ b/druid-wrapper/pom.xml @@ -4,7 +4,7 @@ com.alibaba druid-parent - 1.2.25-SNAPSHOT + 1.2.28-SNAPSHOT ../pom.xml com.alibaba diff --git a/pom.xml b/pom.xml index eb7139d2dd..e43d0a56be 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.alibaba druid-parent - 1.2.25-SNAPSHOT + 1.2.28-SNAPSHOT ${project.artifactId} A JDBC datasource implementation. pom