Compare commits

...

8 Commits

Author SHA1 Message Date
Ling Hengqian f40a7b140e
Merge ecd282c46c into 2e6bb735fb 2025-07-18 16:50:04 +08:00
林枸 2e6bb735fb Add method clone miss param. 2025-07-18 16:27:05 +08:00
林枸 a179bb9750 Modify parser of multiline comment with depth. 2025-07-18 16:22:22 +08:00
Gladys-111 7629916024
Fix multiline problem (#6485)
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (11, ubuntu-latest) (push) Has been cancelled Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (17, ubuntu-latest) (push) Has been cancelled Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (21, ubuntu-latest) (push) Has been cancelled Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (8, ubuntu-latest) (push) Has been cancelled Details
2025-07-17 09:38:13 +08:00
林枸 0444f4f532 FiSupport group by alias parser and eqeq default parser.
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (11, ubuntu-latest) (push) Waiting to run Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (17, ubuntu-latest) (push) Waiting to run Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (21, ubuntu-latest) (push) Waiting to run Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (8, ubuntu-latest) (push) Waiting to run Details
2025-07-16 17:53:41 +08:00
林枸 ac484261c0 Fix multiline comment parse issue.
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (11, ubuntu-latest) (push) Has been cancelled Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (17, ubuntu-latest) (push) Has been cancelled Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (21, ubuntu-latest) (push) Has been cancelled Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (8, ubuntu-latest) (push) Has been cancelled Details
2025-07-15 11:13:48 +08:00
wenshao 31177b91f6 sonartype central
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (11, ubuntu-latest) (push) Waiting to run Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (17, ubuntu-latest) (push) Waiting to run Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (21, ubuntu-latest) (push) Waiting to run Details
Java CI / Test JDK ${{ matrix.java }}, ${{ matrix.os }} (8, ubuntu-latest) (push) Waiting to run Details
2025-07-12 08:45:16 +08:00
linghengqian ecd282c46c Configuring `DefaultAdvisorAutoProxyCreator` when proxying via cglib 2024-09-17 13:32:53 +08:00
21 changed files with 304 additions and 28 deletions

View File

@ -4,7 +4,7 @@
<parent>
<groupId>com.alibaba</groupId>
<artifactId>druid-parent</artifactId>
<version>1.2.25</version>
<version>1.2.26-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>druid</artifactId>

View File

@ -91,6 +91,7 @@ public enum SQLBinaryOperator {
RegExp("REGEXP", 110),
NotRegExp("NOT REGEXP", 110),
Equality("=", 110),
EqEq("==", 110),
BitwiseNot("!", 130),
Concat("||", 140),

View File

@ -42,26 +42,31 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable,
protected transient SQLDataType resolvedReturnDataType;
public SQLMethodInvokeExpr() {
this.removeBrackets = false;
}
public SQLMethodInvokeExpr(String methodName) {
this.methodName = methodName;
this.removeBrackets = false;
}
public SQLMethodInvokeExpr(SQLIdentifierExpr methodName) {
this.methodName = methodName.name;
this.methodNameHashCode64 = methodName.hashCode64;
this.setSource(methodName.getSourceLine(), methodName.getSourceColumn());
this.removeBrackets = false;
}
public SQLMethodInvokeExpr(String methodName, long methodNameHashCode64) {
this.methodName = methodName;
this.methodNameHashCode64 = methodNameHashCode64;
this.removeBrackets = false;
}
public SQLMethodInvokeExpr(String methodName, SQLExpr owner) {
this.methodName = methodName;
setOwner(owner);
this.removeBrackets = false;
}
public SQLMethodInvokeExpr(String methodName, SQLExpr owner, SQLExpr... params) {
@ -70,6 +75,7 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable,
for (SQLExpr param : params) {
this.addArgument(param);
}
this.removeBrackets = false;
}
public SQLMethodInvokeExpr(String methodName, SQLExpr owner, List<SQLExpr> params) {
@ -78,6 +84,7 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable,
for (SQLExpr param : params) {
this.addArgument(param);
}
this.removeBrackets = false;
}
public long methodNameHashCode64() {
@ -386,6 +393,7 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable,
x.putAttribute(key, value);
}
}
x.setRemoveBrackets(removeBrackets);
}
@Override

View File

@ -39,6 +39,7 @@ public class CKLexer extends Lexer {
map.put("FINAL", Token.FINAL);
map.put("TTL", Token.TTL);
map.put("CODEC", Token.CODEC);
map.remove("ANY");
return new Keywords(map);
}

View File

@ -5,11 +5,18 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause;
import com.alibaba.druid.sql.dialect.clickhouse.ast.CKSelectQueryBlock;
import com.alibaba.druid.sql.parser.*;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.SQLExprParser;
import com.alibaba.druid.sql.parser.SQLSelectListCache;
import com.alibaba.druid.sql.parser.SQLSelectParser;
import com.alibaba.druid.sql.parser.Token;
import com.alibaba.druid.util.FnvHash;
import java.util.List;
public class CKSelectParser
extends SQLSelectParser {
public CKSelectParser(Lexer lexer) {
@ -85,12 +92,29 @@ public class CKSelectParser
@Override
public void parseFrom(SQLSelectQueryBlock queryBlock) {
super.parseFrom(queryBlock);
if (lexer.token() == Token.FINAL) {
lexer.nextToken();
((CKSelectQueryBlock) queryBlock).setFinal(true);
List<String> comments = null;
if (lexer.hasComment() && lexer.isKeepComments()) {
comments = lexer.readAndResetComments();
}
if (lexer.nextIf(Token.FROM)) {
SQLTableSource from = parseTableSource();
if (comments != null) {
from.addBeforeComment(comments);
}
queryBlock.setFrom(from);
} else {
((CKSelectQueryBlock) queryBlock).setFinal(false);
if (comments != null) {
queryBlock.addAfterComment(comments);
}
}
if (lexer.nextIf(Token.FINAL)) {
if (queryBlock instanceof CKSelectQueryBlock) {
((CKSelectQueryBlock) queryBlock).setFinal(true);
}
}
}

View File

@ -8,7 +8,9 @@ import com.alibaba.druid.sql.dialect.clickhouse.ast.CKCreateTableStatement;
import com.alibaba.druid.sql.dialect.clickhouse.ast.CKSelectQueryBlock;
import com.alibaba.druid.sql.dialect.clickhouse.ast.ClickhouseColumnCodec;
import com.alibaba.druid.sql.dialect.clickhouse.ast.ClickhouseColumnTTL;
import com.alibaba.druid.sql.parser.CharTypes;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.sql.visitor.VisitorFeature;
import com.alibaba.druid.util.StringUtils;
import java.util.List;
@ -230,6 +232,55 @@ public class CKOutputVisitor extends SQLASTOutputVisitor implements CKASTVisitor
return false;
}
@Override
public void printComment(String comment) {
if (comment == null) {
return;
}
if (isEnabled(VisitorFeature.OutputSkipMultilineComment) && comment.startsWith("/*")) {
return;
}
if (isEnabled(VisitorFeature.OutputSkipSingleLineComment)
&& (comment.startsWith("-") || comment.startsWith("#"))) {
return;
}
if (comment.startsWith("--")
&& comment.length() > 2
&& comment.charAt(2) != ' '
&& comment.charAt(2) != '-') {
print0("-- ");
print0(comment.substring(2));
} else if (comment.startsWith("#")
&& comment.length() > 1
&& comment.charAt(1) != ' '
&& comment.charAt(1) != '#') {
print0("# ");
print0(comment.substring(1));
} else if (comment.startsWith("/*")) {
println();
print0(comment);
} else if (comment.startsWith("--")) {
print0(comment);
}
char first = '\0';
for (int i = 0; i < comment.length(); i++) {
char c = comment.charAt(i);
if (CharTypes.isWhitespace(c)) {
continue;
}
first = c;
break;
}
if (first == '-' || first == '#') {
endLineComment = true;
}
}
@Override
protected void printAfterFetch(SQLSelectQueryBlock queryBlock) {
if (queryBlock instanceof CKSelectQueryBlock) {
@ -274,6 +325,19 @@ public class CKOutputVisitor extends SQLASTOutputVisitor implements CKASTVisitor
@Override
protected void printFrom(SQLSelectQueryBlock x) {
SQLTableSource from = x.getFrom();
if (from == null) {
return;
}
List<String> beforeComments = from.getBeforeCommentsDirect();
if (beforeComments != null) {
for (String comment : beforeComments) {
println();
print0(comment);
}
}
super.printFrom(x);
if (x instanceof CKSelectQueryBlock && ((CKSelectQueryBlock) x).isFinal()) {
print0(ucase ? " FINAL" : " final");

View File

@ -3,7 +3,14 @@ package com.alibaba.druid.sql.dialect.hologres.visitor;
import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.ast.SQLPartitionBy;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.dialect.clickhouse.ast.CKSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor;
import com.alibaba.druid.sql.parser.CharTypes;
import com.alibaba.druid.sql.visitor.VisitorFeature;
import java.util.List;
public class HologresOutputVisitor extends PGOutputVisitor {
public HologresOutputVisitor(StringBuilder appender, boolean parameterized) {
@ -27,4 +34,74 @@ public class HologresOutputVisitor extends PGOutputVisitor {
print0(ucase ? "PARTITION BY " : "partition by ");
partitionBy.accept(this);
}
@Override
protected void printFrom(SQLSelectQueryBlock x) {
SQLTableSource from = x.getFrom();
if (from == null) {
return;
}
List<String> beforeComments = from.getBeforeCommentsDirect();
if (beforeComments != null) {
for (String comment : beforeComments) {
println();
print0(comment);
}
}
super.printFrom(x);
if (x instanceof CKSelectQueryBlock && ((CKSelectQueryBlock) x).isFinal()) {
print0(ucase ? " FINAL" : " final");
}
}
@Override
public void printComment(String comment) {
if (comment == null) {
return;
}
if (isEnabled(VisitorFeature.OutputSkipMultilineComment) && comment.startsWith("/*")) {
return;
}
if (isEnabled(VisitorFeature.OutputSkipSingleLineComment)
&& (comment.startsWith("-") || comment.startsWith("#"))) {
return;
}
if (comment.startsWith("--")
&& comment.length() > 2
&& comment.charAt(2) != ' '
&& comment.charAt(2) != '-') {
print0("-- ");
print0(comment.substring(2));
} else if (comment.startsWith("#")
&& comment.length() > 1
&& comment.charAt(1) != ' '
&& comment.charAt(1) != '#') {
print0("# ");
print0(comment.substring(1));
} else if (comment.startsWith("/*")) {
println();
print0(comment);
} else if (comment.startsWith("--")) {
print0(comment);
}
char first = '\0';
for (int i = 0; i < comment.length(); i++) {
char c = comment.charAt(i);
if (CharTypes.isWhitespace(c)) {
continue;
}
first = c;
break;
}
if (first == '-' || first == '#') {
endLineComment = true;
}
}
}

View File

@ -2520,17 +2520,25 @@ public class Lexer {
if (ch == '/' && charAt(pos + 1) == '*') {
scanChar();
scanChar();
if (ch == '!' || ch == '+') {
scanChar();
++depth;
}
++depth;
}
if (ch == '*' && charAt(pos + 1) == '/') {
scanChar();
scanChar();
if (0 == --depth) {
break;
int curPos = pos;
boolean terminated = true;
// If '*/' has leading '--' in the same line, just skip it. For example '-- xxxx */'.
while (curPos > 0 && charAt(curPos) != '\n') {
if (charAt(curPos) == '-' && (curPos + 1) < text.length() && charAt(curPos + 1) == '-') {
terminated = false;
}
curPos--;
}
if (terminated) {
scanChar();
scanChar();
if (0 == --depth) {
break;
}
}
}

View File

@ -3657,7 +3657,8 @@ public class SQLExprParser extends SQLParser {
}
protected SQLExpr relationalRestEqeq(SQLExpr expr) {
return expr;
lexer.nextToken();
return new SQLBinaryOpExpr(expr, SQLBinaryOperator.EqEq, expr());
}
protected SQLExpr relationalRestTilde(SQLExpr expr) {

View File

@ -1100,6 +1100,10 @@ public class SQLSelectParser extends SQLParser {
} else {
item = this.exprParser.expr();
}
if (lexer.nextIf(Token.AS)) {
item = new SQLAliasedExpr(item, lexer.stringVal);
lexer.nextToken();
}
if (dialectFeatureEnabled(GroupByItemOrder)) {
if (lexer.token == Token.DESC) {

View File

@ -105,7 +105,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
protected transient int lines;
private TimeZone timeZone;
private boolean endLineComment;
protected boolean endLineComment;
protected SQLDialect dialect;

View File

@ -1,3 +1,24 @@
select
/*
/*
xxx
*/
*/ a from test
--------------------
SELECT a
FROM test
------------------------------------------------------------------------------------------------------------------------
select if(a=='G', b, c) from test
--------------------
SELECT if(a == 'G', b, c)
FROM test
------------------------------------------------------------------------------------------------------------------------
select a, b, count(1) from test group by a as c, b as d
--------------------
SELECT a, b, count(1)
FROM test
GROUP BY a AS c, b AS d
------------------------------------------------------------------------------------------------------------------------
select c from b where c=1 ${if(len(a)=0,'and 1=1',"and a>0")} ${if(len(a)=0,'and 1=1',"and a>0")}
--------------------
SELECT c

View File

@ -0,0 +1,33 @@
/*
this is comment 1
this is comment 2
*/
select 1
--------------------
/*
this is comment 1
this is comment 2
*/
SELECT 1
------------------------------------------------------------------------------------------------------------------------
/* this is comment 1 */
select 1
--------------------
/* this is comment 1 */
SELECT 1
------------------------------------------------------------------------------------------------------------------------
select a /* xxxx
xxx
xxxx*/ from test
--------------------
SELECT a
/* xxxx
xxx
xxxx*/
FROM test
------------------------------------------------------------------------------------------------------------------------
select a /* xxxxxxxx*/ from test
--------------------
SELECT a
/* xxxxxxxx*/
FROM test

View File

@ -1,3 +1,33 @@
select a from test
-- origin
-- ${if(gFinPeriod="季度","/*","")}
-- origin end
-- new
/*
-- new end
where 1=1
-- origin
-- ${if(gFinPeriod="季度","","*/")}
-- origin end
-- new
*/
--new end
--------------------
SELECT a
FROM test -- origin
-- ${if(gFinPeriod="季度","/*","")}
-- origin end
-- new
/*
-- new end
where 1=1
-- origin
-- ${if(gFinPeriod="季度","","*/")}
-- origin end
-- new
*/
-- new end
------------------------------------------------------------------------------------------------------------------------
SELECT sum(ret_amount) AS '应收金额'
FROM test.test
GROUP BY a ORDER BY '应收金额' DESC;

View File

@ -34,7 +34,7 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.25</version>
<version>1.2.26-SNAPSHOT</version>
</dependency>
<!-- Spring and Spring Boot dependencies -->
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>com.alibaba</groupId>
<artifactId>druid-parent</artifactId>
<version>1.2.25</version>
<version>1.2.26-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>druid-spring-boot-3-starter</artifactId>

View File

@ -21,6 +21,7 @@ import org.aopalliance.aop.Advice;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.aop.support.RegexpMethodPointcutAdvisor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
@ -40,6 +41,7 @@ public class DruidSpringAopConfiguration {
}
@Bean
@ConditionalOnMissingClass("org.aspectj.weaver.Advice")
@ConditionalOnProperty(name = "spring.aop.auto", havingValue = "false")
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();

View File

@ -5,7 +5,7 @@
<parent>
<groupId>com.alibaba</groupId>
<artifactId>druid-parent</artifactId>
<version>1.2.25</version>
<version>1.2.26-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>druid-spring-boot-starter</artifactId>

View File

@ -21,6 +21,7 @@ import org.aopalliance.aop.Advice;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.aop.support.RegexpMethodPointcutAdvisor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
@ -40,6 +41,7 @@ public class DruidSpringAopConfiguration {
}
@Bean
@ConditionalOnMissingClass("org.aspectj.weaver.Advice")
@ConditionalOnProperty(name = "spring.aop.auto", havingValue = "false")
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();

View File

@ -4,7 +4,7 @@
<parent>
<groupId>com.alibaba</groupId>
<artifactId>druid-parent</artifactId>
<version>1.2.25</version>
<version>1.2.26-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.alibaba</groupId>

14
pom.xml
View File

@ -6,7 +6,7 @@
<groupId>com.alibaba</groupId>
<artifactId>druid-parent</artifactId>
<version>1.2.25</version>
<version>1.2.26-SNAPSHOT</version>
<name>${project.artifactId}</name>
<description>A JDBC datasource implementation.</description>
<packaging>pom</packaging>
@ -81,12 +81,12 @@
<distributionManagement>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
<id>central</id>
<url>https://central.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<id>central</id>
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
@ -470,8 +470,8 @@
</execution>
</executions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<serverId>central</serverId>
<nexusUrl>https://central.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
<!--
If you are deploying to Maven Central,