forked from phoedos/pmd
Merge branch 'pr-1493'
This commit is contained in:
@ -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
|
||||
|
@ -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()); }
|
||||
)
|
||||
]
|
||||
)*
|
||||
)
|
||||
{
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
Reference in New Issue
Block a user