From 28b67091f0c02639f777a493308871887d257d74 Mon Sep 17 00:00:00 2001 From: Piotr Szymanski Date: Wed, 14 Aug 2019 11:51:12 +0200 Subject: [PATCH] fix for trim function with record type variable --- pmd-plsql/etc/grammar/PldocAST.jjt | 13 ++++------ .../plsql/ast/TrimWithRecordTypeTest.java | 24 +++++++++++++++++++ .../pmd/lang/plsql/ast/TrimWithRecordType.pls | 11 +++++++++ 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/TrimWithRecordTypeTest.java create mode 100644 pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/TrimWithRecordType.pls diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index 6f3477722a..00e042094c 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -2937,21 +2937,18 @@ ASTTrimExpression TrimExpression() : { PLSQLNode simpleNode = null; StringBuilder sb = new StringBuilder() ; } { ( - "(" { sb.append("(");} - [ LOOKAHEAD(2) - [ ( | | ) { sb.append(" "); sb.append(token.toString()); } ] - [ simpleNode = StringExpression() { sb.append(" "); sb.append(simpleNode.getImage()); } ] - ( ) { sb.append(" ").append(token.image); } - ] + "(" { sb.append("(");} + [ ( | | ) { sb.append(" "); sb.append(token.toString()); } ] + [ LOOKAHEAD(StringExpression() ) simpleNode = StringExpression() { sb.append(" "); sb.append(simpleNode.getImage()); } ] + [ { sb.append(" ").append(token.image); } ] simpleNode = StringExpression() { sb.append(" "); sb.append(simpleNode.getImage()); } - ")" { sb.append(")");} + ")" { sb.append(")");} ) { jjtThis.setImage(sb.toString()); return jjtThis; } } - /* TREAT ( Expression AS datatype) CAST ( Expression AS datatype) diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/TrimWithRecordTypeTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/TrimWithRecordTypeTest.java new file mode 100644 index 0000000000..8f92db5209 --- /dev/null +++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/TrimWithRecordTypeTest.java @@ -0,0 +1,24 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.plsql.ast; + +import java.nio.charset.StandardCharsets; + +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Test; + +import net.sourceforge.pmd.lang.plsql.AbstractPLSQLParserTst; + +public class TrimWithRecordTypeTest extends AbstractPLSQLParserTst { + + @Test + public void parseTrimWithRecordType() throws Exception { + String code = IOUtils.toString(this.getClass().getResourceAsStream("TrimWithRecordType.pls"), + StandardCharsets.UTF_8); + ASTInput input = parsePLSQL(code); + Assert.assertNotNull(input); + } +} diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/TrimWithRecordType.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/TrimWithRecordType.pls new file mode 100644 index 0000000000..501354c4b8 --- /dev/null +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/TrimWithRecordType.pls @@ -0,0 +1,11 @@ +CREATE OR REPLACE PACKAGE BODY trim_test_package IS + + PROCEDURE trim_test_procedure IS + BEGIN + IF TRIM(var_package.wer.wer) = 'TEST' THEN + NULL; + END IF; + END; + +END trim_test_package; +/