Compare commits

...

3 Commits

Author SHA1 Message Date
qian0817 f7d658bc24
Merge f4e7606bd2 into ac484261c0 2025-07-15 20:59:39 +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
qian0817 f4e7606bd2 feature: support has comma before grouping sets. 2025-04-15 16:08:37 +08:00
8 changed files with 144 additions and 14 deletions

View File

@ -34,6 +34,7 @@ public class SQLSelectGroupByClause extends SQLObjectImpl implements SQLReplacea
private boolean distinct;
private boolean paren;
private boolean groupingSetsHaveComma;
public SQLSelectGroupByClause() {
}
@ -80,6 +81,14 @@ public class SQLSelectGroupByClause extends SQLObjectImpl implements SQLReplacea
this.withCube = withCube;
}
public boolean isGroupingSetsHaveComma() {
return groupingSetsHaveComma;
}
public void setGroupingSetsHaveComma(boolean groupingSetsHaveComma) {
this.groupingSetsHaveComma = groupingSetsHaveComma;
}
public SQLExpr getHaving() {
return this.having;
}

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

@ -4,6 +4,8 @@ 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.dialect.postgresql.visitor.PGOutputVisitor;
import com.alibaba.druid.sql.parser.CharTypes;
import com.alibaba.druid.sql.visitor.VisitorFeature;
public class HologresOutputVisitor extends PGOutputVisitor {
public HologresOutputVisitor(StringBuilder appender, boolean parameterized) {
@ -27,4 +29,53 @@ public class HologresOutputVisitor extends PGOutputVisitor {
print0(ucase ? "PARTITION BY " : "partition by ");
partitionBy.accept(this);
}
@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

@ -2527,10 +2527,21 @@ public class Lexer {
}
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

@ -923,6 +923,7 @@ public class SQLSelectParser extends SQLParser {
groupBy.setWithCube(true);
}
boolean hasComma = false;
for (; ; ) {
List<String> comments = null;
if (lexer.hasComment()) {
@ -932,6 +933,9 @@ public class SQLSelectParser extends SQLParser {
if (comments != null) {
item.addBeforeComment(comments);
}
if (item instanceof SQLGroupingSetExpr && hasComma) {
groupBy.setGroupingSetsHaveComma(true);
}
item.setParent(groupBy);
groupBy.addItem(item);
@ -947,8 +951,10 @@ public class SQLSelectParser extends SQLParser {
&& lexer.line == line + 1) {
item.addAfterComment(lexer.readAndResetComments());
}
hasComma = true;
continue;
} else if (lexer.identifierEquals(FnvHash.Constants.GROUPING)) {
hasComma = false;
continue;
} else {
break;

View File

@ -51,13 +51,7 @@ import java.sql.Blob;
import java.sql.Clob;
import java.sql.NClob;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.ZonedDateTime;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAmount;
import java.util.*;
@ -105,7 +99,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
protected transient int lines;
private TimeZone timeZone;
private boolean endLineComment;
protected boolean endLineComment;
protected SQLDialect dialect;
@ -2582,7 +2576,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
if (i != 0) {
if (groupItemSingleLine) {
if (item instanceof SQLGroupingSetExpr) {
if (!item.hasBeforeComment()) {
if (x.isGroupingSetsHaveComma()) {
println(',');
} else if (!item.hasBeforeComment()) {
println();
}
} else {
@ -2590,7 +2586,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
}
} else {
if (item instanceof SQLGroupingSetExpr) {
println();
if (x.isGroupingSetsHaveComma()) {
println(',');
} else {
println();
}
} else {
print(", ");
}

View File

@ -17,4 +17,26 @@ public class GroupingSetsTest extends TestCase {
+ "\nFROM items_sold"
+ "\nGROUP BY GROUPING SETS ((brand), (size), ());", result);
}
public void test_groupingSetsHasComma() throws Exception {
String sql = "SELECT brand, size, sum(sales) FROM items_sold GROUP BY brand, size, GROUPING SETS ((brand), (size), ());";
String result = SQLUtils.format(sql, (DbType) null);
Assert.assertEquals("SELECT brand, size, sum(sales)\n" +
"FROM items_sold\n" +
"GROUP BY brand, size,\n" +
"\tGROUPING SETS ((brand), (size), ());", result);
}
public void test_groupingSetsNoComma() throws Exception {
String sql = "SELECT brand, size, sum(sales) FROM items_sold GROUP BY brand, size GROUPING SETS ((brand), (size), ());";
String result = SQLUtils.format(sql, (DbType) null);
Assert.assertEquals("SELECT brand, size, sum(sales)\n" +
"FROM items_sold\n" +
"GROUP BY brand, size\n" +
"\tGROUPING SETS ((brand), (size), ());", result);
}
}

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;