diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index eefc432aaf..2373e32f6e 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -27,6 +27,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** + * Added support for DELETE Statements + * + * Andreas Dangel 09/2018 + *==================================================================== * Added support for OrderBy and RowLimiting clauses for SELECT statements * Removed FROM from the RelationalExpression * Support QueryPartitionClause @@ -215,6 +219,7 @@ ASTInput Input() : {} | LOOKAHEAD(6) DDLCommand() //Ignore any other DDL Event | LOOKAHEAD(2) SqlPlusCommand() | LOOKAHEAD(2) UpdateStatement() + | LOOKAHEAD(2) DeleteStatement() |(|||||||||||) SqlStatement(null,";") [";"] | LOOKAHEAD(3) ContinueStatement() ";" // CONTINUE keyword was added in 11G, so Oracle compilation supports CONTINUE as a variable name | CaseStatement() ";" @@ -1852,6 +1858,15 @@ ASTUpdateSetClause UpdateSetClause() : { return jjtThis; } } +ASTDeleteStatement DeleteStatement() : +{} +{ + [ ] + ( TableReference() | "(" TableReference() ")" ) + [ WhereClause() ] + { return jjtThis; } +} + /** Scope rule: the loop index only exists within the Loop */ ASTForStatement ForStatement() : {} diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java index cf3a71995e..5f4447fd88 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java @@ -936,4 +936,9 @@ public class PLSQLParserVisitorAdapter implements PLSQLParserVisitor { public Object visit(ASTUpdateSetClause node, Object data) { return visit((PLSQLNode) node, data); } + + @Override + public Object visit(ASTDeleteStatement node, Object data) { + return visit((PLSQLNode) node, data); + } } 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 c528b7df87..3271e19c7b 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 @@ -1030,6 +1030,11 @@ public abstract class AbstractPLSQLRule extends AbstractRule implements PLSQLPar return visit((PLSQLNode) node, data); } + @Override + public Object visit(ASTDeleteStatement 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/ast/DeleteStatementTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/DeleteStatementTest.java new file mode 100644 index 0000000000..70e87bd70b --- /dev/null +++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/DeleteStatementTest.java @@ -0,0 +1,27 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.plsql.ast; + +import java.util.List; + +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Test; + +import net.sourceforge.pmd.lang.plsql.AbstractPLSQLParserTst; + +public class DeleteStatementTest extends AbstractPLSQLParserTst { + + @Test + public void parseDeleteStatementExample() throws Exception { + String code = IOUtils.toString(this.getClass().getResourceAsStream("DeleteStatementExample.pls")); + ASTInput input = parsePLSQL(code); + List deleteStatements = input.findDescendantsOfType(ASTDeleteStatement.class); + Assert.assertEquals(3, deleteStatements.size()); + + Assert.assertEquals("product_descriptions", deleteStatements.get(0).jjtGetChild(0) + .getFirstChildOfType(ASTTableName.class).getImage()); + } +} diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/DeleteStatementExample.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/DeleteStatementExample.pls new file mode 100644 index 0000000000..ee865a8ea3 --- /dev/null +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/DeleteStatementExample.pls @@ -0,0 +1,21 @@ +-- +-- Deleting Rows: Examples +-- https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/DELETE.html#GUID-156845A5-B626-412B-9F95-8869B988ABD7 +-- + +DECLARE +BEGIN + + DELETE FROM product_descriptions + WHERE language_id = 'AR'; + + DELETE FROM employees + WHERE job_id = 'SA_REP' + AND commission_pct < .2; + + DELETE FROM (SELECT * FROM employees) + WHERE job_id = 'SA_REP' + AND commission_pct < .2; + +END; +/