Merge branch 'pr-1493'

This commit is contained in:
Clément Fournier
2018-12-04 12:29:27 +01:00
4 changed files with 92 additions and 43 deletions

View File

@ -49,6 +49,8 @@ This means, you can use CPD to find duplicated code in your Kotlin projects.
* java-design
* [#1151](https://github.com/pmd/pmd/issues/1151): \[java] ImmutableField false positive with multiple constructors
* [#1483](https://github.com/pmd/pmd/issues/1483): \[java] Cyclo metric should count conditions of for statements correctly
* plsql
* [#1454](https://github.com/pmd/pmd/issues/1454): \[plsql] ParseException for IF/CASE statement with >=, <=, !=
### API Changes

View File

@ -2494,57 +2494,68 @@ ASTEqualityExpression EqualityExpression() #EqualityExpression(>1) :
}
}
/**
* Relational operators: https://docs.oracle.com/en/database/oracle/oracle-database/18/lnpls/plsql-language-fundamentals.html#GUID-2EB964C8-9B36-4009-A45F-B340F44EE2A2
*/
ASTRelationalExpression RelationalExpression() #RelationalExpression(>1) :
{ PLSQLNode simpleNode = null; StringBuilder sb = new StringBuilder() ; }
{
(
//AdditiveExpression() ( ( "<" | ">" | "<=" | ">=" | [<NOT>] (<IN> | <BETWEEN> | <LIKE>) ) AdditiveExpression() )*
(simpleNode = AdditiveExpression() ) { sb.append(simpleNode.getImage()); }
(
(
( simpleNode = AdditiveExpression() ) { sb.append(simpleNode.getImage()); }
(
(
(
(
(("<" ) { sb.append("<"); }
[">" { sb.append(">"); } ] // <>
)
| (">" ) { sb.append(">"); }
)
[ ("=" ) { sb.append("="); } ]
("<>" { sb.append(" <> "); } )
| ("<=" { sb.append(" <= "); } )
| (">=" { sb.append(" >= "); } )
| ("!=" { sb.append(" != "); } )
| ("~=" { sb.append(" ~= "); } )
| ("^=" { sb.append(" ^= "); } )
| ("<" { sb.append(" < "); } )
| (">" { sb.append(" > "); } )
)
{ sb.append(" "); }
| [(<NOT>) { sb.append(" NOT "); }]
((<IN>) { sb.append(" IN "); }
| (<BETWEEN> ) { sb.append(" BETWEEN "); }
| (<LIKE> ) { sb.append(" LIKE "); }
| (
(
(<MEMBER>) { sb.append(" MEMBER "); }
|
(<SUBMULTISET>) { sb.append(" SUBMULTISET "); }
)
[ <OF> { sb.append(" OF "); } ]
)
)
// MULTISET Operators
| (
<MULTISET> { sb.append (" MULTISET " );}
( <EXCEPT> { sb.append (" EXCEPT " );}
| <INTERSECT> { sb.append (" INTERSECT " );}
| <UNION> { sb.append (" UNION " ); }
)
[ <DISTINCT> { sb.append (" DISTINCT " );}
| <ALL> { sb.append (" ALL " );}
]
)
)
(AdditiveExpression() ) { sb.append(simpleNode.getImage()); }
[
<ESCAPE> { sb.append(" ESCAPE ");}
( <CHARACTER_LITERAL>{ sb.append(" "); sb.append(token.toString()); }
| simpleNode = StringLiteral() { sb.append(" "); sb.append(simpleNode.getImage()); }
)
]
| [(<NOT>) { sb.append(" NOT "); }]
(
(<IN>) { sb.append(" IN "); }
| (<BETWEEN> ) { sb.append(" BETWEEN "); }
| (<LIKE> ) { sb.append(" LIKE "); }
|
(
(
(<MEMBER>) { sb.append(" MEMBER "); }
|
(<SUBMULTISET>) { sb.append(" SUBMULTISET "); }
)
[ <OF> { sb.append(" OF "); } ]
)
)
// MULTISET Operators
|
(
<MULTISET> { sb.append (" MULTISET " );}
(
<EXCEPT> { sb.append (" EXCEPT " );}
| <INTERSECT> { sb.append (" INTERSECT " );}
| <UNION> { sb.append (" UNION " ); }
)
[
<DISTINCT> { sb.append (" DISTINCT " );}
| <ALL> { sb.append (" ALL " );}
]
)
)
( AdditiveExpression() ) { sb.append(simpleNode.getImage()); }
[
<ESCAPE> { sb.append(" ESCAPE ");}
(
<CHARACTER_LITERAL>{ sb.append(" "); sb.append(token.toString()); }
| simpleNode = StringLiteral() { sb.append(" "); sb.append(simpleNode.getImage()); }
)
]
)*
)
{

View File

@ -69,4 +69,9 @@ public class PLSQLParserTest extends AbstractPLSQLParserTst {
public void testCodingStyleExample() throws Exception {
parsePLSQL(IOUtils.toString(PLSQLParserTest.class.getResourceAsStream("ast/CodingStyleExample.pls"), StandardCharsets.UTF_8));
}
@Test
public void testCaseIssue1454() throws Exception {
parsePLSQL(IOUtils.toString(PLSQLParserTest.class.getResourceAsStream("ast/CaseIssue1454.pls"), StandardCharsets.UTF_8));
}
}

View File

@ -0,0 +1,31 @@
create or replace procedure PMD_TEST_CASE( a IN NUMBER) AS
begin
CASE WHEN a >= 100 THEN -- Test the same with <=,!=,<> all cases fail both with IF and CASE statements
dbms_output.put_line('Number is greater than equal to 100');
WHEN a <= 100 THEN
dbms_output.put_line('Number is less than equal to 100');
WHEN a < 100 THEN
dbms_output.put_line('Number is less than 100');
WHEN a > 100 THEN
dbms_output.put_line('Number is greater than 100');
WHEN a = 42 THEN
dbms_output.put_line('Number is equal to 42');
WHEN a != 42 THEN
dbms_output.put_line('Number is not 42');
WHEN a ~= 42 THEN
dbms_output.put_line('Number is not 42');
WHEN a ^= 42 THEN
dbms_output.put_line('Number is not 42');
WHEN a <> 42 THEN
dbms_output.put_line('Number is not 42');
ELSE
dbms_output.put_line('Number is less than 100');
END CASE;
exception
when others then
dbms_output.put_line('ERROR: ' || sqlerrm);
end PMD_TEST_CASE;