|
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. Do this using |
| 390 | + * optional chains, because several things down the tree can be null e.g. the |
| 391 | + * 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