From 90862cc9935790af0cd96deeaf98c86fe1c1c42c Mon Sep 17 00:00:00 2001 From: sergey Date: Sat, 12 Nov 2016 22:00:29 +0300 Subject: [PATCH] Added correct parse of IS [NOT] NULL fixed crash of parsing following code (from unittest): IF V_BUF IS NULL THEN null; end if; --- pmd-plsql/etc/grammar/PldocAST.jjt | 29 ++++++++++++++++++- .../lang/plsql/rule/AbstractPLSQLRule.java | 5 ++++ .../pmd/lang/plsql/PLSQLParserTest.java | 5 ++++ .../sourceforge/pmd/lang/plsql/ast/IsNull.pls | 16 ++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/IsNull.pls diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index 470147434e..30344cd706 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -38,6 +38,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * Andreas Dangel 11/2016 */ + /** + * Added ASTIsNullCondition node + * + * Sergey Yanzin 11/2016 + */ + // options { DEBUG_PARSER = false ; @@ -1972,12 +1978,33 @@ ASTUnaryExpressionNotPlusMinus UnaryExpressionNotPlusMinus() : () {sb.append(" NOT "); } (simpleNode = UnaryExpression(false) ) { sb.append(simpleNode.getImage()); } | - (simpleNode = IsOfTypeCondition() ) {sb.append(simpleNode.getImage()); } + (simpleNode = IsNullCondition() ) {sb.append(simpleNode.getImage()); } ) { jjtThis.setImage(sb.toString()); return jjtThis; } } +ASTIsNullCondition IsNullCondition() : //yanzin +{ PLSQLNode simpleNode = null; PLSQLNode name = null; StringBuilder sb = new StringBuilder(); } +{ + ( + LOOKAHEAD( ( |)) + ( + (name = Name()) {sb.append(name.getImage());} {sb.append(" IS");} [ {sb.append(" NOT");}] {sb.append(" NULL");} + ) + | + ( + simpleNode = IsOfTypeCondition() + ) + { + sb.append(simpleNode.getImage()); + } + ) + { + jjtThis.setImage(sb.toString()); + return jjtThis; + } +} ASTIsOfTypeCondition IsOfTypeCondition() : { PLSQLNode simpleNode = null; PLSQLNode name = null; StringBuilder sb = new StringBuilder(); } diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java index 2260a93e41..bb93284665 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java @@ -789,6 +789,11 @@ public abstract class AbstractPLSQLRule extends AbstractRule implements PLSQLPar return visit((PLSQLNode) node, data); } + @Override + public Object visit(ASTIsNullCondition node, Object data) { + return visit((PLSQLNode) node, data); + } + /* * Treat all Executable Code */ diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/PLSQLParserTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/PLSQLParserTest.java index df6e983ce1..4bcbccf88a 100644 --- a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/PLSQLParserTest.java +++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/PLSQLParserTest.java @@ -60,4 +60,9 @@ public class PLSQLParserTest extends AbstractPLSQLParserTst { public void testBug1520Using() throws Exception { parsePLSQL(IOUtils.toString(PLSQLParserTest.class.getResourceAsStream("ast/Using.pls"))); } + + @Test + public void testIsNull() throws Exception { + parsePLSQL(IOUtils.toString(PLSQLParserTest.class.getResourceAsStream("ast/IsNull.pls"))); + } } diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/IsNull.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/IsNull.pls new file mode 100644 index 0000000000..836356c2db --- /dev/null +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/IsNull.pls @@ -0,0 +1,16 @@ +PROCEDURE IsNull ( + dummy IN number +) +is + V_BUF varchar(1); +BEGIN + +IF V_BUF IS NULL THEN + null; +end if; + +IF V_BUF IS NOT NULL THEN + null; +end if; + +end; \ No newline at end of file