|
64 | 64 | import net.sf.jsqlparser.statement.select.UnPivot;
|
65 | 65 | import net.sf.jsqlparser.statement.select.WithItem;
|
66 | 66 |
|
| 67 | +import java.util.Optional; |
| 68 | + |
67 | 69 | @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.UncommentedEmptyMethodBody"})
|
68 | 70 | public class ExpressionVisitorAdapter
|
69 | 71 | implements ExpressionVisitor, PivotVisitor, SelectItemVisitor {
|
@@ -382,11 +384,19 @@ public void visit(AnalyticExpression expr) {
|
382 | 384 | element.getExpression().accept(this);
|
383 | 385 | }
|
384 | 386 | }
|
385 |
| - |
386 | 387 | if (expr.getWindowElement() != null) {
|
387 |
| - expr.getWindowElement().getRange().getStart().getExpression().accept(this); |
388 |
| - expr.getWindowElement().getRange().getEnd().getExpression().accept(this); |
389 |
| - expr.getWindowElement().getOffset().getExpression().accept(this); |
| 388 | + /* |
| 389 | + Visit expressions from the range and offset of the window element. |
| 390 | + Do this using optional chains, because several things down the tree |
| 391 | + can be null e.g. the expression. So, null-safe versions of e.g.: |
| 392 | + expr.getWindowElement().getOffset().getExpression().accept(this); |
| 393 | + */ |
| 394 | + Optional.ofNullable(expr.getWindowElement().getRange()).map(WindowRange::getStart) |
| 395 | + .map(WindowOffset::getExpression).ifPresent(e -> e.accept(this)); |
| 396 | + Optional.ofNullable(expr.getWindowElement().getRange()).map(WindowRange::getEnd) |
| 397 | + .map(WindowOffset::getExpression).ifPresent(e -> e.accept(this)); |
| 398 | + Optional.ofNullable(expr.getWindowElement().getOffset()) |
| 399 | + .map(WindowOffset::getExpression).ifPresent(e -> e.accept(this)); |
390 | 400 | }
|
391 | 401 | }
|
392 | 402 |
|
|
0 commit comments