@@ -209,6 +209,8 @@ tokens
209
209
210
210
protected void resolve(AST node) throws SemanticException { }
211
211
212
+ protected void resolve(AST node, AST predicateNode) throws SemanticException { }
213
+
212
214
protected void resolveSelectExpression(AST dotNode) throws SemanticException { }
213
215
214
216
protected void processFunction(AST functionCall,boolean inSelect) throws SemanticException { }
@@ -335,7 +337,7 @@ assignment
335
337
336
338
// For now, just use expr. Revisit after ejb3 solidifies this.
337
339
newValue
338
- : expr | query
340
+ : expr [ null ] | query
339
341
;
340
342
341
343
// The query / subquery rule. Pops the current ' from node' context
@@ -380,7 +382,7 @@ nullPrecedence
380
382
381
383
orderExpr
382
384
: { isOrderExpressionResultVariableRef( _t ) }? resultVariableRef
383
- | expr
385
+ | expr [ null ]
384
386
;
385
387
386
388
resultVariableRef!
@@ -392,7 +394,7 @@ resultVariableRef!
392
394
;
393
395
394
396
groupClause
395
- : #(GROUP { handleClauseStart( GROUP ); } (expr)+ ( #(HAVING logicalExpr) )? ) {
397
+ : #(GROUP { handleClauseStart( GROUP ); } (expr [ null ] )+ ( #(HAVING logicalExpr) )? ) {
396
398
handleClauseEnd();
397
399
}
398
400
;
@@ -429,7 +431,7 @@ selectExpr
429
431
| count
430
432
| collectionFunction // elements() or indices()
431
433
| constant
432
- | arithmeticExpr
434
+ | arithmeticExpr [ null ]
433
435
| logicalExpr
434
436
| parameter
435
437
| query
@@ -448,7 +450,7 @@ constructor
448
450
;
449
451
450
452
aggregateExpr
451
- : expr //p:propertyRef { resolve(#p); }
453
+ : expr [ null ] //p:propertyRef { resolve(#p); }
452
454
| collectionFunction
453
455
;
454
456
@@ -572,36 +574,37 @@ logicalExpr
572
574
;
573
575
574
576
// TODO: Add any other comparison operators here.
577
+ // We pass through the comparisonExpr AST to the expressions so that joins can be avoided for EQ/IN/NULLNESS
575
578
comparisonExpr
576
579
:
577
- ( #(EQ exprOrSubquery exprOrSubquery)
578
- | #(NE exprOrSubquery exprOrSubquery)
579
- | #(LT exprOrSubquery exprOrSubquery)
580
- | #(GT exprOrSubquery exprOrSubquery)
581
- | #(LE exprOrSubquery exprOrSubquery)
582
- | #(GE exprOrSubquery exprOrSubquery)
583
- | #(LIKE exprOrSubquery expr ( #(ESCAPE expr) )? )
584
- | #(NOT_LIKE exprOrSubquery expr ( #(ESCAPE expr) )? )
585
- | #(BETWEEN exprOrSubquery exprOrSubquery exprOrSubquery)
586
- | #(NOT_BETWEEN exprOrSubquery exprOrSubquery exprOrSubquery)
587
- | #(IN exprOrSubquery inRhs )
588
- | #(NOT_IN exprOrSubquery inRhs )
589
- | #(IS_NULL exprOrSubquery)
590
- | #(IS_NOT_NULL exprOrSubquery)
591
- // | #(IS_TRUE expr)
592
- // | #(IS_FALSE expr)
593
- | #(EXISTS ( expr | collectionFunctionOrSubselect ) )
580
+ ( #(EQ exprOrSubquery [ currentAST.root ] exprOrSubquery [ currentAST.root ] )
581
+ | #(NE exprOrSubquery [ currentAST.root ] exprOrSubquery [ currentAST.root ] )
582
+ | #(LT exprOrSubquery [ null ] exprOrSubquery [ null ] )
583
+ | #(GT exprOrSubquery [ null ] exprOrSubquery [ null ] )
584
+ | #(LE exprOrSubquery [ null ] exprOrSubquery [ null ] )
585
+ | #(GE exprOrSubquery [ null ] exprOrSubquery [ null ] )
586
+ | #(LIKE exprOrSubquery [ null ] expr [ null ] ( #(ESCAPE expr [ null ] ) )? )
587
+ | #(NOT_LIKE exprOrSubquery [ null ] expr [ null ] ( #(ESCAPE expr [ null ] ) )? )
588
+ | #(BETWEEN exprOrSubquery [ null ] exprOrSubquery [ null ] exprOrSubquery [ null ] )
589
+ | #(NOT_BETWEEN exprOrSubquery [ null ] exprOrSubquery [ null ] exprOrSubquery [ null ] )
590
+ | #(IN exprOrSubquery [ currentAST.root ] inRhs [ currentAST.root ] )
591
+ | #(NOT_IN exprOrSubquery [ currentAST.root ] inRhs [ currentAST.root ] )
592
+ | #(IS_NULL exprOrSubquery [ currentAST.root ] )
593
+ | #(IS_NOT_NULL exprOrSubquery [ currentAST.root ] )
594
+ // | #(IS_TRUE expr [ null ] )
595
+ // | #(IS_FALSE expr [ null ] )
596
+ | #(EXISTS ( expr [ null ] | collectionFunctionOrSubselect ) )
594
597
) {
595
598
prepareLogicOperator( #comparisonExpr );
596
599
}
597
600
;
598
601
599
- inRhs
600
- : #(IN_LIST ( collectionFunctionOrSubselect | ( (expr)* ) ) )
602
+ inRhs [ AST predicateNode ]
603
+ : #(IN_LIST ( collectionFunctionOrSubselect | ( (expr [ predicateNode ] )* ) ) )
601
604
;
602
605
603
- exprOrSubquery
604
- : expr
606
+ exprOrSubquery [ AST predicateNode ]
607
+ : expr [ predicateNode ]
605
608
| query
606
609
| #(ANY collectionFunctionOrSubselect)
607
610
| #(ALL collectionFunctionOrSubselect)
@@ -613,55 +616,55 @@ collectionFunctionOrSubselect
613
616
| query
614
617
;
615
618
616
- expr
617
- : ae:addrExpr [ true ] { resolve(#ae); } // Resolve the top level ' address expression'
618
- | #( VECTOR_EXPR (expr)* )
619
+ expr [ AST predicateNode ]
620
+ : ae:addrExpr [ true ] { resolve(#ae, predicateNode ); } // Resolve the top level ' address expression'
621
+ | #( VECTOR_EXPR (expr [ predicateNode ] )* )
619
622
| constant
620
- | arithmeticExpr
623
+ | arithmeticExpr [ predicateNode ]
621
624
| functionCall // Function call, not in the SELECT clause.
622
625
| parameter
623
626
| count // Count, not in the SELECT clause.
624
627
;
625
628
626
- arithmeticExpr
627
- : #(PLUS exprOrSubquery exprOrSubquery) { prepareArithmeticOperator( #arithmeticExpr ); }
628
- | #(MINUS exprOrSubquery exprOrSubquery) { prepareArithmeticOperator( #arithmeticExpr ); }
629
- | #(DIV exprOrSubquery exprOrSubquery) { prepareArithmeticOperator( #arithmeticExpr ); }
630
- | #(MOD exprOrSubquery exprOrSubquery) { prepareArithmeticOperator( #arithmeticExpr ); }
631
- | #(STAR exprOrSubquery exprOrSubquery) { prepareArithmeticOperator( #arithmeticExpr ); }
632
- // | #(CONCAT expr (expr)+ ) { prepareArithmeticOperator( #arithmeticExpr ); }
633
- | #(UNARY_MINUS expr) { prepareArithmeticOperator( #arithmeticExpr ); }
634
- | caseExpr
629
+ arithmeticExpr [ AST predicateNode ]
630
+ : #(PLUS exprOrSubquery [ null ] exprOrSubquery [ null ] ) { prepareArithmeticOperator( #arithmeticExpr ); }
631
+ | #(MINUS exprOrSubquery [ null ] exprOrSubquery [ null ] ) { prepareArithmeticOperator( #arithmeticExpr ); }
632
+ | #(DIV exprOrSubquery [ null ] exprOrSubquery [ null ] ) { prepareArithmeticOperator( #arithmeticExpr ); }
633
+ | #(MOD exprOrSubquery [ null ] exprOrSubquery [ null ] ) { prepareArithmeticOperator( #arithmeticExpr ); }
634
+ | #(STAR exprOrSubquery [ null ] exprOrSubquery [ null ] ) { prepareArithmeticOperator( #arithmeticExpr ); }
635
+ // | #(CONCAT expr [ null ] (expr [ null ] )+ ) { prepareArithmeticOperator( #arithmeticExpr ); }
636
+ | #(UNARY_MINUS expr [ null ] ) { prepareArithmeticOperator( #arithmeticExpr ); }
637
+ | caseExpr [ predicateNode ]
635
638
;
636
639
637
- caseExpr
638
- : simpleCaseExpression
639
- | searchedCaseExpression
640
+ caseExpr [ AST predicateNode ]
641
+ : simpleCaseExpression [ predicateNode ]
642
+ | searchedCaseExpression [ predicateNode ]
640
643
;
641
644
642
- expressionOrSubQuery
643
- : expr
645
+ expressionOrSubQuery [ AST predicateNode ]
646
+ : expr [ predicateNode ]
644
647
| query
645
648
;
646
649
647
- simpleCaseExpression
648
- : #(CASE2 {inCase=true;} expressionOrSubQuery (simpleCaseWhenClause)+ (elseClause)?) {inCase=false;}
650
+ simpleCaseExpression [ AST predicateNode ]
651
+ : #(CASE2 {inCase=true;} expressionOrSubQuery [ currentAST.root ] (simpleCaseWhenClause [ currentAST.root, predicateNode ] )+ (elseClause [ predicateNode ] )?) {inCase=false;}
649
652
;
650
653
651
- simpleCaseWhenClause
652
- : #(WHEN expressionOrSubQuery expressionOrSubQuery)
654
+ simpleCaseWhenClause [ AST predicateNode, AST superPredicateNode ]
655
+ : #(WHEN expressionOrSubQuery [ predicateNode ] expressionOrSubQuery [ superPredicateNode ] )
653
656
;
654
657
655
- elseClause
656
- : #(ELSE expressionOrSubQuery)
658
+ elseClause [ AST predicateNode ]
659
+ : #(ELSE expressionOrSubQuery [ predicateNode ] )
657
660
;
658
661
659
- searchedCaseExpression
660
- : #(CASE {inCase = true;} (searchedCaseWhenClause)+ (elseClause)?) {inCase = false;}
662
+ searchedCaseExpression [ AST predicateNode ]
663
+ : #(CASE {inCase = true;} (searchedCaseWhenClause [ predicateNode ] )+ (elseClause [ predicateNode ] )?) {inCase = false;}
661
664
;
662
665
663
- searchedCaseWhenClause
664
- : #(WHEN logicalExpr expressionOrSubQuery)
666
+ searchedCaseWhenClause [ AST predicateNode ]
667
+ : #(WHEN logicalExpr expressionOrSubQuery [ predicateNode ] )
665
668
;
666
669
667
670
@@ -675,11 +678,11 @@ collectionFunction
675
678
;
676
679
677
680
functionCall
678
- : # (METHOD_CALL {inFunctionCall=true;} pathAsIdent ( #(EXPR_LIST (exprOrSubquery)* ) )? ) {
681
+ : # (METHOD_CALL {inFunctionCall=true;} pathAsIdent ( #(EXPR_LIST (exprOrSubquery [ null ] )* ) )? ) {
679
682
processFunction( # functionCall, inSelect );
680
683
inFunctionCall= false ;
681
684
}
682
- | # (CAST {inFunctionCall=true;} exprOrSubquery pathAsIdent) {
685
+ | # (CAST {inFunctionCall=true;} exprOrSubquery [ null ] pathAsIdent) {
683
686
processCastFunction( # functionCall, inSelect );
684
687
inFunctionCall= false ;
685
688
}
@@ -715,7 +718,7 @@ addrExpr! [ boolean root ]
715
718
# addrExpr = #(#d, #lhs, #rhs);
716
719
# addrExpr = lookupProperty(#addrExpr,root,false);
717
720
}
718
- | # (i:INDEX_OP lhs2:addrExprLhs rhs2:expr) {
721
+ | # (i:INDEX_OP lhs2:addrExprLhs rhs2:expr [ null ] ) {
719
722
# addrExpr = #(#i, #lhs2, #rhs2);
720
723
processIndex(# addrExpr);
721
724
}
@@ -794,7 +797,7 @@ mapComponentReference
794
797
;
795
798
796
799
mapPropertyExpression
797
- : e: expr {
800
+ : e: expr [ null ] {
798
801
validateMapPropertyExpression( # e );
799
802
}
800
803
;
0 commit comments