Skip to content

Commit 2ebaaf0

Browse files
committed
replaced column list in expression list for partition by of analytic expressions
1 parent 55e68bf commit 2ebaaf0

File tree

3 files changed

+35
-18
lines changed

3 files changed

+35
-18
lines changed

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

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import net.sf.jsqlparser.statement.select.OrderByElement;
2626

2727
import java.util.List;
28+
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
29+
import net.sf.jsqlparser.statement.select.PlainSelect;
2830

2931
/**
3032
* Analytic function. The name of the function is variable but the parameters
@@ -36,7 +38,8 @@
3638
*/
3739
public class AnalyticExpression implements Expression {
3840

39-
private List<Column> partitionByColumns;
41+
//private List<Column> partitionByColumns;
42+
private ExpressionList partitionExpressionList;
4043
private List<OrderByElement> orderByElements;
4144
private String name;
4245
private Expression expression;
@@ -58,13 +61,23 @@ public void setOrderByElements(List<OrderByElement> orderByElements) {
5861
this.orderByElements = orderByElements;
5962
}
6063

61-
public List<Column> getPartitionByColumns() {
62-
return partitionByColumns;
63-
}
64+
// public List<Column> getPartitionByColumns() {
65+
// return partitionByColumns;
66+
// }
67+
//
68+
// public void setPartitionByColumns(List<Column> partitionByColumns) {
69+
// this.partitionByColumns = partitionByColumns;
70+
// }
6471

65-
public void setPartitionByColumns(List<Column> partitionByColumns) {
66-
this.partitionByColumns = partitionByColumns;
67-
}
72+
public ExpressionList getPartitionExpressionList() {
73+
return partitionExpressionList;
74+
}
75+
76+
public void setPartitionExpressionList(ExpressionList partitionExpressionList) {
77+
this.partitionExpressionList = partitionExpressionList;
78+
}
79+
80+
6881

6982
public String getName() {
7083
return name;
@@ -141,14 +154,9 @@ public void setAllColumns(boolean allColumns) {
141154
}
142155

143156
private void toStringPartitionBy(StringBuilder b) {
144-
if (partitionByColumns != null && !partitionByColumns.isEmpty()) {
157+
if (partitionExpressionList != null && !partitionExpressionList.getExpressions().isEmpty()) {
145158
b.append("PARTITION BY ");
146-
for (int i = 0; i < partitionByColumns.size(); i++) {
147-
if (i > 0) {
148-
b.append(", ");
149-
}
150-
b.append(partitionByColumns.get(i).toString());
151-
}
159+
b.append(PlainSelect.getStringList(partitionExpressionList.getExpressions(), true, false));
152160
b.append(" ");
153161
}
154162
}

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,10 +1743,9 @@ IntervalExpression IntervalExpression() : {
17431743
AnalyticExpression AnalyticExpression() :
17441744
{
17451745
AnalyticExpression retval = new AnalyticExpression();
1746-
List<Column> plist = new ArrayList<Column>();
1746+
ExpressionList expressionList = null;
17471747
List<OrderByElement> olist = null;
17481748
Token token = null;
1749-
Column column = null;
17501749
Expression expr = null;
17511750
Expression offset = null;
17521751
Expression defaultValue = null;
@@ -1755,14 +1754,14 @@ AnalyticExpression AnalyticExpression() :
17551754
{
17561755
token=<S_IDENTIFIER> { retval.setName(token.image); }
17571756
"(" [ expr=SimpleExpression() ["," offset=SimpleExpression() ["," defaultValue=SimpleExpression() ]] | "*" { retval.setAllColumns(true); } ] ")" <K_OVER> "("
1758-
[<K_PARTITION> <K_BY> column=Column() {plist.add(column);} ("," column=Column() {plist.add(column);} )* ]
1757+
[<K_PARTITION> <K_BY> expressionList=SimpleExpressionList() ]
17591758
[olist=OrderByElements() [windowElement = WindowElement() ] ]
17601759

17611760
{
17621761
retval.setExpression(expr);
17631762
retval.setOffset(offset);
17641763
retval.setDefaultValue(defaultValue);
1765-
retval.setPartitionByColumns(plist);
1764+
retval.setPartitionExpressionList(expressionList);
17661765
retval.setOrderByElements(olist);
17671766
retval.setWindowElement(windowElement);
17681767
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,16 @@ public void testAnalyticFunction18() throws JSQLParserException {
10371037
String statement = "SELECT AVG(sal) OVER (PARTITION BY deptno ORDER BY sal RANGE CURRENT ROW) AS avg_of_current_sal FROM emp";
10381038
assertSqlCanBeParsedAndDeparsed(statement);
10391039
}
1040+
1041+
public void testAnalyticFunctionProblem1() throws JSQLParserException {
1042+
String statement = "SELECT last_value(s.revenue_hold) OVER (PARTITION BY s.id_d_insertion_order, s.id_d_product_ad_attr, trunc(s.date_id, 'mm') ORDER BY s.date_id) AS col FROM s";
1043+
assertSqlCanBeParsedAndDeparsed(statement);
1044+
}
1045+
1046+
public void testAnalyticFunctionProblem1b() throws JSQLParserException {
1047+
String statement = "SELECT last_value(s.revenue_hold) OVER (PARTITION BY s.id_d_insertion_order, s.id_d_product_ad_attr, trunc(s.date_id, 'mm') ORDER BY s.date_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS col FROM s";
1048+
assertSqlCanBeParsedAndDeparsed(statement);
1049+
}
10401050

10411051
public void testOracleJoin() throws JSQLParserException {
10421052
String stmt = "SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a = tabelle2.b(+)";

0 commit comments

Comments
 (0)