Fix multi-line comment issue

This commit is contained in:
寒七 2025-07-16 16:40:15 +08:00
parent 06ac9b18bb
commit abb6c48437
3 changed files with 116 additions and 8 deletions

View File

@ -2,14 +2,13 @@ package com.alibaba.druid.sql.dialect.clickhouse.parser;
import com.alibaba.druid.sql.ast.SQLExpr;
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.SQLWithSubqueryClause;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.clickhouse.ast.CKSelectQueryBlock;
import com.alibaba.druid.sql.parser.*;
import com.alibaba.druid.util.FnvHash;
import java.util.List;
public class CKSelectParser
extends SQLSelectParser {
public CKSelectParser(Lexer lexer) {
@ -85,12 +84,31 @@ public class CKSelectParser
@Override
public void parseFrom(SQLSelectQueryBlock queryBlock) {
super.parseFrom(queryBlock);
List<String> comments = null;
if (lexer.hasComment() && lexer.isKeepComments()) {
comments = lexer.readAndResetComments();
}
if (lexer.token() == Token.FROM) {
lexer.nextToken();
SQLTableSource from = parseTableSource();
if (comments != null) {
from.addBeforeComment(comments);
}
queryBlock.setFrom(from);
} else {
if (comments != null) {
queryBlock.addAfterComment(comments);
}
}
if (lexer.token() == Token.FINAL) {
lexer.nextToken();
((CKSelectQueryBlock) queryBlock).setFinal(true);
} else {
((CKSelectQueryBlock) queryBlock).setFinal(false);
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,10 +3,15 @@ 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) {
super(appender, DbType.hologres, parameterized);
@ -30,6 +35,27 @@ public class HologresOutputVisitor extends PGOutputVisitor {
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) {