Skip to content

Commit 8a96555

Browse files
committed
fixes #865
1 parent 2222945 commit 8a96555

File tree

5 files changed

+39
-8
lines changed

5 files changed

+39
-8
lines changed

src/main/java/net/sf/jsqlparser/expression/AnalyticExpression.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,14 @@ public ExpressionList getPartitionExpressionList() {
8888
}
8989

9090
public void setPartitionExpressionList(ExpressionList partitionExpressionList) {
91-
partitionBy.setPartitionExpressionList(partitionExpressionList);
91+
setPartitionExpressionList(partitionExpressionList, false);
92+
}
93+
public void setPartitionExpressionList(ExpressionList partitionExpressionList, boolean brackets) {
94+
partitionBy.setPartitionExpressionList(partitionExpressionList, brackets);
95+
}
96+
97+
public boolean isPartitionByBrackets() {
98+
return partitionBy.isBrackets();
9299
}
93100

94101
public String getName() {

src/main/java/net/sf/jsqlparser/expression/PartitionByClause.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,31 @@
1414

1515
public class PartitionByClause {
1616
ExpressionList partitionExpressionList;
17+
boolean brackets = false;
1718

1819
public ExpressionList getPartitionExpressionList() {
1920
return partitionExpressionList;
2021
}
21-
22+
2223
public void setPartitionExpressionList(ExpressionList partitionExpressionList) {
24+
setPartitionExpressionList(partitionExpressionList, false);
25+
}
26+
27+
public void setPartitionExpressionList(ExpressionList partitionExpressionList, boolean brackets) {
2328
this.partitionExpressionList = partitionExpressionList;
29+
this.brackets = brackets;
2430
}
2531

2632
void toStringPartitionBy(StringBuilder b) {
2733
if (partitionExpressionList != null && !partitionExpressionList.getExpressions().isEmpty()) {
2834
b.append("PARTITION BY ");
2935
b.append(PlainSelect.
30-
getStringList(partitionExpressionList.getExpressions(), true, false));
36+
getStringList(partitionExpressionList.getExpressions(), true, brackets));
3137
b.append(" ");
3238
}
3339
}
40+
41+
public boolean isBrackets() {
42+
return brackets;
43+
}
3444
}

src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ public void visit(FullTextSearch fullTextSearch) {
216216
columnsListCommaSeperated += ",";
217217
}
218218
}
219-
buffer.append("MATCH (" + columnsListCommaSeperated + ") AGAINST (" + fullTextSearch.getAgainstValue() +
220-
(fullTextSearch.getSearchModifier() != null ? " " + fullTextSearch.getSearchModifier() : "") + ")");
219+
buffer.append("MATCH (" + columnsListCommaSeperated + ") AGAINST (" + fullTextSearch.getAgainstValue()
220+
+ (fullTextSearch.getSearchModifier() != null ? " " + fullTextSearch.getSearchModifier() : "") + ")");
221221
}
222222

223223
@Override
@@ -654,13 +654,19 @@ public void visit(AnalyticExpression aexpr) {
654654

655655
if (partitionExpressionList != null && !partitionExpressionList.getExpressions().isEmpty()) {
656656
buffer.append("PARTITION BY ");
657+
if (aexpr.isPartitionByBrackets()) {
658+
buffer.append("(");
659+
}
657660
List<Expression> expressions = partitionExpressionList.getExpressions();
658661
for (int i = 0; i < expressions.size(); i++) {
659662
if (i > 0) {
660663
buffer.append(", ");
661664
}
662665
expressions.get(i).accept(this);
663666
}
667+
if (aexpr.isPartitionByBrackets()) {
668+
buffer.append(")");
669+
}
664670
buffer.append(" ");
665671
}
666672
if (orderByElements != null && !orderByElements.isEmpty()) {

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3114,18 +3114,20 @@ AnalyticExpression AnalyticExpression(Function function) :
31143114
WindowElement windowElement = null;
31153115
//KeepExpression keep = null;
31163116
//boolean distinct = false;
3117-
//boolean ignoreNulls = false;
3117+
boolean partitionByBrackets = false;
31183118
}
31193119
{
31203120
(<K_OVER> {retval.setType(AnalyticType.OVER);}
31213121
| <K_WITHIN> <K_GROUP> {retval.setType(AnalyticType.WITHIN_GROUP);} )
31223122

31233123
"("
3124-
[<K_PARTITION> <K_BY> expressionList=SimpleExpressionList() ]
3124+
[<K_PARTITION> <K_BY>
3125+
(LOOKAHEAD(3) expressionList=SimpleExpressionList() | "(" {partitionByBrackets = true;} expressionList=SimpleExpressionList() ")" )
3126+
]
31253127
[olist=OrderByElements() [windowElement = WindowElement() ] ]
31263128

31273129
{
3128-
retval.setPartitionExpressionList(expressionList);
3130+
retval.setPartitionExpressionList(expressionList, partitionByBrackets);
31293131
retval.setOrderByElements(olist);
31303132
retval.setWindowElement(windowElement);
31313133
}

src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3871,4 +3871,10 @@ public void testStartKeyword() throws JSQLParserException {
38713871
public void testSizeKeywordIssue867() throws JSQLParserException {
38723872
assertSqlCanBeParsedAndDeparsed("SELECT size FROM mytable");
38733873
}
3874+
3875+
@Test
3876+
public void testPartitionByWithBracketsIssue865() throws JSQLParserException {
3877+
assertSqlCanBeParsedAndDeparsed("SELECT subject_id, student_id, sum(mark) OVER (PARTITION BY subject_id, student_id ) FROM marks");
3878+
assertSqlCanBeParsedAndDeparsed("SELECT subject_id, student_id, sum(mark) OVER (PARTITION BY (subject_id, student_id) ) FROM marks");
3879+
}
38743880
}

0 commit comments

Comments
 (0)