Skip to content

Commit

Permalink
Merge pull request #3783 from oowekyala:issue3746-plsql-tokens
Browse files Browse the repository at this point in the history
[plsql] Fix #3746 - Parsing exception with operators containing spaces #3783
  • Loading branch information
adangel committed Feb 19, 2022
2 parents 84b026d + 9d349db commit a6e5584
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 28 deletions.
2 changes: 2 additions & 0 deletions docs/pages/release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ This is a {{ site.pmd.release_type }} release.
* [#3374](https://github.com/pmd/pmd/issues/3374): \[java] UseStringBufferForStringAppends: Wrong example in documentation
* misc
* [#3759](https://github.com/pmd/pmd/issues/3759): \[lang-test] Upgrade dokka maven plugin to 1.4.32
* plsql
* [#3746](https://github.com/pmd/pmd/issues/3746): \[plsql] Parsing exception "Less than or equal to/Greater than or equal to" operators in DML statements

### API Changes

Expand Down
91 changes: 63 additions & 28 deletions pmd-plsql/etc/grammar/PldocAST.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,34 @@ TOKEN_MGR_DECLS : {
List<ParsingExclusion> exclusions = new ArrayList<ParsingExclusion>();
}

// add names to SINGLE CHARACTER tokens
// multiple character operators are sequences of tokens.
TOKEN: {
< LPAREN: "(" >
| < RPAREN: ")" >
| < LBRACE: "{" >
| < RBRACE: "}" >
| < LBRACKET: "[" >
| < RBRACKET: "]" >
| < SEMICOLON: ";" >
| < COMMA: "," >
| < DOT: "." >
| < AROBASE: "@" >
| < ASSIGN: "=" >
| < LT: "<" >
| < BANG: "!" >
| < TILDE: "~" >
| < HOOK: "?" >
| < COLON: ":" >
| < PLUSSIGN: "+" >
| < MINUSSIGN: "-" >
| < STAR: "*" >
| < SLASH: "/" >
| < BIT_AND: "&" >
| < BIT_OR: "|" >
| < XOR: "^" >
| < REM: "%" >
}

/**
* 2006-05-22 - Matthias Hendler - Added parsing of triggers and global functions/procedures
Expand Down Expand Up @@ -1603,18 +1631,26 @@ ASTInCondition InCondition() :
{ return jjtThis; }
}

ASTComparisonCondition ComparisonCondition() :
private String ComparisonOp() #void :
{}
{
(
// SimpleComparisonCondition
LOOKAHEAD(3) (SqlExpression() ( "=" | "!=" | "^=" | "<>" | ">" | "<" | ">=" | "<=" ) { jjtThis.setOperator(token.getImage()); } SqlExpression() )
| LOOKAHEAD(3) ( "(" SqlExpression() ("," SqlExpression())* ")" ( "=" | "!=" | "^=" | "<>" ) { jjtThis.setOperator(token.getImage()); } "(" ( LOOKAHEAD(3) ExpressionList() | LOOKAHEAD(3) Subquery() ) ")" )
"=" {return "=";}
| "!" "=" {return "!=";}
| "^" "=" {return "^=";}
| "<" ( "=" {return "<=";} | ">" {return "<>";} )? {return "<";}
| ">" ( "=" {return ">=";} )? {return ">";}
}

// GroupComparisonCondition
| LOOKAHEAD(3) (SqlExpression() ( "=" | "!=" | "^=" | "<>" | ">" | "<" | ">=" | "<=" ) { jjtThis.setOperator(token.getImage()); } ( <ANY> | <SOME> | <ALL> ) "(" ( LOOKAHEAD(3) ExpressionListSingle() | LOOKAHEAD(3) Subquery() ) ")" )
| LOOKAHEAD(3) ( "(" SqlExpression() ("," SqlExpression())* ")" ( "=" | "!=" | "^=" | "<>" ) { jjtThis.setOperator(token.getImage()); } ( <ANY> | <SOME> | <ALL> ) "(" ( LOOKAHEAD(3) ExpressionListMultiple() ("," ExpressionListMultiple())* | LOOKAHEAD(3) Subquery() ) ")" )
)
ASTComparisonCondition ComparisonCondition() :
{String op;}
{
(LOOKAHEAD(3) SqlExpression() | ExpressionListMultiple() )
op=ComparisonOp() { jjtThis.setOperator(op); }
( <ANY> | <SOME> | <ALL> )?
(LOOKAHEAD(3) "(" Subquery() ")"
|LOOKAHEAD(3) "(" ExpressionListSingle() ")"
|LOOKAHEAD(3) "(" ExpressionListMultiple() ("," ExpressionListMultiple())* ")"
|LOOKAHEAD(3) SqlExpression())
{ return jjtThis; }
}

Expand Down Expand Up @@ -3179,17 +3215,17 @@ ASTEqualityExpression EqualityExpression() #EqualityExpression(>1) :
{
//RelationalExpression() ( ( "=" | "!=" | "<>" | <IS>) RelationalExpression() )*
(

simpleNode=RelationalExpression()
{sb.append(simpleNode.getImage());}
(
simpleNode = RelationalExpression()
) {sb.append(simpleNode.getImage());}
(
( ("=" ) {sb.append(" = ");}
| ("!" "=" ) {sb.append(" != ");}
( "=" {sb.append(" = ");}
| "!" "=" {sb.append(" != ");}
// Now unde RelationalExpression | ("<" ">" ) {sb.append(" <> ");}
| (<IS>) {sb.append(" IS ");})
(
simpleNode = RelationalExpression()
) {sb.append(simpleNode.getImage());}
| <IS> {sb.append(" IS ");}
)
simpleNode=RelationalExpression()
{sb.append(simpleNode.getImage());}
)*
)
{
Expand All @@ -3209,17 +3245,16 @@ ASTRelationalExpression RelationalExpression() #RelationalExpression(>1) :
(
(

(
("<>" { sb.append(" <> "); } )
| ("<=" { sb.append(" <= "); } )
| (">=" { sb.append(" >= "); } )
| ("!=" { sb.append(" != "); } )
| ("~=" { sb.append(" ~= "); } )
| ("^=" { sb.append(" ^= "); } )
| ("<" { sb.append(" < "); } )
| (">" { sb.append(" > "); } )
( LOOKAHEAD(2) "<" ">" { sb.append(" <> "); }
|LOOKAHEAD(2) "<" "=" { sb.append(" <= "); }
|LOOKAHEAD(2) ">" "=" { sb.append(" >= "); }
// then lookahead(1) is enough
| "<" { sb.append(" < "); }
| ">" { sb.append(" > "); }
| "!" "=" { sb.append(" != "); }
| "~" "=" { sb.append(" ~= "); }
| "^" "=" { sb.append(" ^= "); }
)

{ sb.append(" "); }
| [(<NOT>) { sb.append(" NOT "); }]
(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,4 @@ public Map<Integer, String> getSuppressMap() {
return new HashMap<>(); // FIXME
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,12 @@ public void testCaseIssue1454() {
plsql.parseResource("CaseIssue1454.pls");
}

@Test
public void testRelationalOperators() {
// https://github.com/pmd/pmd/issues/3746
plsql.parseResource("RelationalOperators.pls");
}

@Test
public void testExecuteImmediateIssue3106() {
plsql.parseResource("ExecuteImmediateIssue3106.pls");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
CREATE OR REPLACE PROCEDURE EXAMPLE_PROCEDURE IS
--
l_total_objects NUMBER(10);
--
BEGIN
--
SELECT COUNT(1)
INTO l_total_objects
FROM USER_OBJECTS
WHERE namespace < = 1
OR namespace > = 0
OR namespace >
= 0
;
--
DBMS_OUTPUT.Put_Line('Total number of objects: ' || l_total_objects);
--
END EXAMPLE_PROCEDURE;

0 comments on commit a6e5584

Please sign in to comment.