Skip to content

Commit 1bb5c3d

Browse files
committed
fixes #766
1 parent 0002cb7 commit 1bb5c3d

File tree

4 files changed

+62
-25
lines changed

4 files changed

+62
-25
lines changed

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

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99
*/
1010
package net.sf.jsqlparser.expression;
1111

12-
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13-
import net.sf.jsqlparser.statement.select.OrderByElement;
14-
1512
import java.util.List;
1613
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
14+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
15+
import net.sf.jsqlparser.statement.select.OrderByElement;
1716

1817
public class AnalyticExpression extends ASTNodeAccessImpl implements Expression {
1918

@@ -29,6 +28,32 @@ public class AnalyticExpression extends ASTNodeAccessImpl implements Expression
2928
private boolean distinct = false;
3029
private boolean ignoreNulls = false;
3130

31+
public AnalyticExpression() {
32+
}
33+
34+
public AnalyticExpression(Function function) {
35+
name = function.getName();
36+
allColumns = function.isAllColumns();
37+
distinct = function.isDistinct();
38+
39+
ExpressionList list = function.getParameters();
40+
if (list != null) {
41+
if (list.getExpressions().size() > 3) {
42+
throw new IllegalArgumentException("function object not valid to initialize analytic expression");
43+
}
44+
45+
expression = list.getExpressions().get(0);
46+
if (list.getExpressions().size() > 1) {
47+
offset = list.getExpressions().get(1);
48+
}
49+
if (list.getExpressions().size() > 2) {
50+
defaultValue = list.getExpressions().get(2);
51+
}
52+
}
53+
ignoreNulls = function.isIgnoreNulls();
54+
keep = function.getKeep();
55+
}
56+
3257
@Override
3358
public void accept(ExpressionVisitor expressionVisitor) {
3459
expressionVisitor.visit(this);

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class Function extends ASTNodeAccessImpl implements Expression {
2424
private Expression attribute;
2525
private String attributeName;
2626
private KeepExpression keep = null;
27+
private boolean ignoreNulls = false;
2728

2829
@Override
2930
public void accept(ExpressionVisitor expressionVisitor) {
@@ -46,6 +47,20 @@ public void setAllColumns(boolean b) {
4647
allColumns = b;
4748
}
4849

50+
public boolean isIgnoreNulls() {
51+
return ignoreNulls;
52+
}
53+
54+
/**
55+
* This is at the moment only necessary for AnalyticExpression initialization and not for normal
56+
* functions. Therefore there is no deparsing for it for normal functions.
57+
*
58+
* @param ignoreNulls
59+
*/
60+
public void setIgnoreNulls(boolean ignoreNulls) {
61+
this.ignoreNulls = ignoreNulls;
62+
}
63+
4964
/**
5065
* true if the function is "distinct"
5166
*

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

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2700,8 +2700,6 @@ Expression PrimaryExpression() #PrimaryExpression:
27002700

27012701
| LOOKAHEAD(2) retval=NumericBind()
27022702

2703-
| LOOKAHEAD(AnalyticExpression()) retval=AnalyticExpression()
2704-
27052703
| LOOKAHEAD(3) retval=ExtractExpression()
27062704

27072705
| retval=MySQLGroupConcat()
@@ -2710,7 +2708,7 @@ Expression PrimaryExpression() #PrimaryExpression:
27102708

27112709
| LOOKAHEAD(FunctionWithCondParams()) retval = FunctionWithCondParams()
27122710

2713-
| LOOKAHEAD(Function()) retval=Function()
2711+
| LOOKAHEAD(Function()) retval=Function() [ LOOKAHEAD(2) retval = AnalyticExpression((Function)retval) ]
27142712

27152713
| LOOKAHEAD(2) retval = IntervalExpression() { dateExpressionAllowed = false; }
27162714

@@ -2893,29 +2891,29 @@ KeepExpression KeepExpression() : {
28932891
}
28942892
}
28952893

2896-
AnalyticExpression AnalyticExpression() :
2894+
AnalyticExpression AnalyticExpression(Function function) :
28972895
{
2898-
AnalyticExpression retval = new AnalyticExpression();
2896+
AnalyticExpression retval = new AnalyticExpression(function);
28992897
ExpressionList expressionList = null;
29002898
List<OrderByElement> olist = null;
29012899
Token token = null;
29022900
Expression expr = null;
29032901
Expression offset = null;
29042902
Expression defaultValue = null;
29052903
WindowElement windowElement = null;
2906-
KeepExpression keep = null;
2907-
boolean distinct = false;
2908-
boolean ignoreNulls = false;
2904+
//KeepExpression keep = null;
2905+
//boolean distinct = false;
2906+
//boolean ignoreNulls = false;
29092907
}
29102908
{
2911-
token=<S_IDENTIFIER> { retval.setName(token.image); }
2909+
/* token=<S_IDENTIFIER> { retval.setName(token.image); }
29122910
"(" [
29132911
[ <K_DISTINCT> {distinct = true;} ]
29142912
(expr=SimpleExpression() ["," offset=SimpleExpression() ["," defaultValue=SimpleExpression() ]] | "*" { retval.setAllColumns(true); } )
29152913
[ <K_IGNORE> <K_NULLS> {ignoreNulls = true;}]
2916-
] ")"
2914+
] ")" */
29172915

2918-
[ keep=KeepExpression() ]
2916+
/* [ keep=KeepExpression() ] */
29192917

29202918
(<K_OVER> {retval.setType(AnalyticType.OVER);}
29212919
| <K_WITHIN> <K_GROUP> {retval.setType(AnalyticType.WITHIN_GROUP);} )
@@ -2925,12 +2923,12 @@ AnalyticExpression AnalyticExpression() :
29252923
[olist=OrderByElements() [windowElement = WindowElement() ] ]
29262924

29272925
{
2928-
retval.setDistinct(distinct);
2929-
retval.setIgnoreNulls(ignoreNulls);
2930-
retval.setExpression(expr);
2931-
retval.setOffset(offset);
2932-
retval.setDefaultValue(defaultValue);
2933-
retval.setKeep(keep);
2926+
//retval.setDistinct(distinct);
2927+
//retval.setIgnoreNulls(ignoreNulls);
2928+
//retval.setExpression(expr);
2929+
//retval.setOffset(offset);
2930+
//retval.setDefaultValue(defaultValue);
2931+
//retval.setKeep(keep);
29342932
retval.setPartitionExpressionList(expressionList);
29352933
retval.setOrderByElements(olist);
29362934
retval.setWindowElement(windowElement);
@@ -3189,6 +3187,7 @@ Function InternalFunction(Function retval) :
31893187
Token tk1 = null;
31903188
Token tk2 = null;
31913189
Expression expr1 = null;
3190+
boolean ignoreNulls = false;
31923191
}
31933192
{
31943193
funcName=RelObjectNameExt()
@@ -3203,11 +3202,10 @@ Function InternalFunction(Function retval) :
32033202
LOOKAHEAD(NamedExpressionListExprFirst()) namedExpressionList = NamedExpressionListExprFirst()
32043203
|
32053204
LOOKAHEAD(3) expressionList=SimpleExpressionList()
3206-
//|
3207-
//LOOKAHEAD(ConditionExpressionList()) expressionList=ConditionExpressionList()
32083205
|
32093206
expr = SubSelect() { expr.setUseBrackets(false); expressionList = new ExpressionList(expr); }
32103207
)]
3208+
[ <K_IGNORE> <K_NULLS> {retval.setIgnoreNulls(true); }]
32113209
")"
32123210

32133211
[ "." (

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,17 @@
1111

1212
import net.sf.jsqlparser.JSQLParserException;
1313
import net.sf.jsqlparser.test.TestUtils;
14-
import org.junit.Ignore;
1514
import org.junit.Test;
1615

1716
/**
1817
*
1918
* @author tw
2019
*/
2120
public class NestedBracketsPerformanceTest {
21+
2222
@Test
23-
@Ignore
2423
public void testIssue766() throws JSQLParserException {
25-
TestUtils.assertSqlCanBeParsedAndDeparsed("SELECT concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat('1','2'),'3'),'4'),'5'),'6'),'7'),'8'),'9'),'10'),'11'),'12'),'13'),'14'),'15'),'16'),'17'),'18'),'19'),'20'),'21'),col1 FROM tbl t1");
24+
TestUtils.assertSqlCanBeParsedAndDeparsed("SELECT concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat('1','2'),'3'),'4'),'5'),'6'),'7'),'8'),'9'),'10'),'11'),'12'),'13'),'14'),'15'),'16'),'17'),'18'),'19'),'20'),'21'),col1 FROM tbl t1", true);
2625
}
2726

2827
@Test

0 commit comments

Comments
 (0)