From 7b172acc7cdcda91c5c94b80bdc6839a9729dd7d Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 11 Jul 2024 10:15:58 +0200 Subject: [PATCH] [plsql] SQL_MACRO - fixups from #5087 --- pmd-plsql/etc/grammar/PLSQL.jjt | 11 +- .../pmd/lang/plsql/ast/ASTSqlMacroClause.java | 5 +- .../lang/plsql/ast/ASTSqlMacroClauseTest.java | 31 ----- .../pmd/lang/plsql/ast/PlsqlTreeDumpTest.java | 5 + .../pmd/lang/plsql/ast/SqlMacroClause.pls | 2 +- .../pmd/lang/plsql/ast/SqlMacroClause.txt | 109 ++++++++++++++++++ 6 files changed, 125 insertions(+), 38 deletions(-) delete mode 100644 pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/ASTSqlMacroClauseTest.java create mode 100644 pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlMacroClause.txt diff --git a/pmd-plsql/etc/grammar/PLSQL.jjt b/pmd-plsql/etc/grammar/PLSQL.jjt index 0298a75009..7f5a1e5c9c 100644 --- a/pmd-plsql/etc/grammar/PLSQL.jjt +++ b/pmd-plsql/etc/grammar/PLSQL.jjt @@ -747,7 +747,7 @@ ASTMethodDeclarator MethodDeclarator() : } } // There is no RETURN for a WRAPPED object - [ Datatype() [ SqlMacroClause() ] ] + [ Datatype() [ LOOKAHEAD({isKeyword("SQL_MACRO")}) SqlMacroClause() ] ] ) | @@ -5171,7 +5171,6 @@ TOKEN [IGNORE_CASE]: | | | - | | | | @@ -5185,7 +5184,6 @@ TOKEN [IGNORE_CASE]: | | | - | | | | @@ -5535,7 +5533,6 @@ void KEYWORD(String id) #void: { { if (!isKeyword(id)) { - String eol = System.getProperty("line.separator", "\n"); throw new ParseException("Encountered \"" + getToken(1).getImage() + "\" " + "Was expecting: \"" + id + "\"").withLocation(token); } @@ -7056,7 +7053,11 @@ ASTJavaInterfaceClass JavaInterfaceClass(): {} ASTSqlMacroClause SqlMacroClause(): {} { ( - [ [ "=>" ] ( | ) { jjtThis.setType(token.getImage()); } ] + LOOKAHEAD({isKeyword("SQL_MACRO")}) KEYWORD("SQL_MACRO") + [ + [ "=>" ] ( LOOKAHEAD({isKeyword("SCALAR")}) KEYWORD("SCALAR") |
) + { jjtThis.setType(token.getImage()); } + ] ) { return jjtThis; } } diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/ASTSqlMacroClause.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/ASTSqlMacroClause.java index 38b708d2f1..c22910c59c 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/ASTSqlMacroClause.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/ASTSqlMacroClause.java @@ -6,8 +6,11 @@ package net.sourceforge.pmd.lang.plsql.ast; import java.util.Locale; +/** + * @since 7.4.0 + */ public final class ASTSqlMacroClause extends AbstractPLSQLNode { - private String type = "TABLE"; + private String type = "TABLE"; // TABLE is the default type if it is not explicitly given in the source ASTSqlMacroClause(int id) { super(id); diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/ASTSqlMacroClauseTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/ASTSqlMacroClauseTest.java deleted file mode 100644 index 73165712af..0000000000 --- a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/ASTSqlMacroClauseTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.lang.plsql.ast; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; - -import java.util.List; - -import org.junit.jupiter.api.Test; - -import net.sourceforge.pmd.lang.plsql.AbstractPLSQLParserTst; - -class ASTSqlMacroClauseTest extends AbstractPLSQLParserTst { - - @Test - void testEmpty() { - ASTInput input = plsql.parseResource("SqlMacroClause.pls"); - - List sqlMacros = input.descendants(ASTSqlMacroClause.class).toList(); - assertFalse(sqlMacros.isEmpty()); - assertEquals("TABLE", sqlMacros.get(0).getType()); - assertEquals("SCALAR", sqlMacros.get(1).getType()); - assertEquals("SCALAR", sqlMacros.get(2).getType()); - assertEquals("TABLE", sqlMacros.get(3).getType()); - - //assertEquals("=", conditions.get(0).getOperator()); - } -} diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/PlsqlTreeDumpTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/PlsqlTreeDumpTest.java index cd3c2a2f07..221ade3b56 100644 --- a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/PlsqlTreeDumpTest.java +++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/PlsqlTreeDumpTest.java @@ -61,4 +61,9 @@ class PlsqlTreeDumpTest extends BaseTreeDumpTest { void exceptionHandlerTomKytesDespair() { doTest("ExceptionHandlerTomKytesDespair"); } + + @Test + void sqlMacroClause() { + doTest("SqlMacroClause"); + } } diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlMacroClause.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlMacroClause.pls index 7ad7f36298..4ef9b93c04 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlMacroClause.pls +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlMacroClause.pls @@ -21,7 +21,7 @@ create or replace package body test is end test3; - function test3() return clob sql_macro(TABLE) is + function test4() return clob sql_macro(TABLE) is begin return 'q[select * from dual]'; diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlMacroClause.txt b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlMacroClause.txt new file mode 100644 index 0000000000..7a70ce073a --- /dev/null +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlMacroClause.txt @@ -0,0 +1,109 @@ ++- Input[@CanonicalImage = null, @ExcludedLinesCount = 0, @ExcludedRangesCount = 0] + +- PackageBody[@CanonicalImage = "TEST", @Image = "test", @ObjectName = "test"] + +- ObjectNameDeclaration[@CanonicalImage = "TEST", @Image = "test"] + | +- ID[@CanonicalImage = "TEST", @Image = "test"] + +- DeclarativeSection[@CanonicalImage = null] + | +- DeclarativeUnit[@CanonicalImage = null] + | | +- ProgramUnit[@CanonicalImage = null, @MethodName = "test1", @Name = "test1", @ObjectName = null] + | | +- MethodDeclarator[@CanonicalImage = "TEST1", @Image = "test1", @ParameterCount = 1] + | | | +- ObjectNameDeclaration[@CanonicalImage = "TEST1", @Image = "test1"] + | | | | +- ID[@CanonicalImage = "TEST1", @Image = "test1"] + | | | +- FormalParameters[@CanonicalImage = "()", @Image = "()"] + | | | +- Datatype[@CanonicalImage = "CLOB", @Image = "CLOB", @TypeImage = "CLOB"] + | | | | +- ScalarDataTypeName[@CanonicalImage = "CLOB", @Image = "CLOB"] + | | | +- SqlMacroClause[@CanonicalImage = null, @Type = "TABLE"] + | | +- Statement[@CanonicalImage = null] + | | | +- UnlabelledStatement[@CanonicalImage = null] + | | | +- ReturnStatement[@CanonicalImage = null] + | | | +- Expression[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'"] + | | | +- PrimaryPrefix[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'", @SelfModifier = false] + | | | +- Literal[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'"] + | | | +- StringLiteral[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'", @String = "q[select * from dual]"] + | | +- ID[@CanonicalImage = "TEST1", @Image = "test1"] + | +- DeclarativeUnit[@CanonicalImage = null] + | | +- ProgramUnit[@CanonicalImage = null, @MethodName = "test2", @Name = "test2", @ObjectName = null] + | | +- MethodDeclarator[@CanonicalImage = "TEST2", @Image = "test2", @ParameterCount = 1] + | | | +- ObjectNameDeclaration[@CanonicalImage = "TEST2", @Image = "test2"] + | | | | +- ID[@CanonicalImage = "TEST2", @Image = "test2"] + | | | +- FormalParameters[@CanonicalImage = "()", @Image = "()"] + | | | +- Datatype[@CanonicalImage = "CLOB", @Image = "CLOB", @TypeImage = "CLOB"] + | | | | +- ScalarDataTypeName[@CanonicalImage = "CLOB", @Image = "CLOB"] + | | | +- SqlMacroClause[@CanonicalImage = null, @Type = "SCALAR"] + | | +- Statement[@CanonicalImage = null] + | | | +- UnlabelledStatement[@CanonicalImage = null] + | | | +- ReturnStatement[@CanonicalImage = null] + | | | +- Expression[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'"] + | | | +- PrimaryPrefix[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'", @SelfModifier = false] + | | | +- Literal[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'"] + | | | +- StringLiteral[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'", @String = "q[select * from dual]"] + | | +- ID[@CanonicalImage = "TEST2", @Image = "test2"] + | +- DeclarativeUnit[@CanonicalImage = null] + | | +- ProgramUnit[@CanonicalImage = null, @MethodName = "test3", @Name = "test3", @ObjectName = null] + | | +- MethodDeclarator[@CanonicalImage = "TEST3", @Image = "test3", @ParameterCount = 1] + | | | +- ObjectNameDeclaration[@CanonicalImage = "TEST3", @Image = "test3"] + | | | | +- ID[@CanonicalImage = "TEST3", @Image = "test3"] + | | | +- FormalParameters[@CanonicalImage = "()", @Image = "()"] + | | | +- Datatype[@CanonicalImage = "CLOB", @Image = "CLOB", @TypeImage = "CLOB"] + | | | | +- ScalarDataTypeName[@CanonicalImage = "CLOB", @Image = "CLOB"] + | | | +- SqlMacroClause[@CanonicalImage = null, @Type = "SCALAR"] + | | +- Statement[@CanonicalImage = null] + | | | +- UnlabelledStatement[@CanonicalImage = null] + | | | +- ReturnStatement[@CanonicalImage = null] + | | | +- Expression[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'"] + | | | +- PrimaryPrefix[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'", @SelfModifier = false] + | | | +- Literal[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'"] + | | | +- StringLiteral[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'", @String = "q[select * from dual]"] + | | +- ID[@CanonicalImage = "TEST3", @Image = "test3"] + | +- DeclarativeUnit[@CanonicalImage = null] + | | +- ProgramUnit[@CanonicalImage = null, @MethodName = "test4", @Name = "test4", @ObjectName = null] + | | +- MethodDeclarator[@CanonicalImage = "TEST4", @Image = "test4", @ParameterCount = 1] + | | | +- ObjectNameDeclaration[@CanonicalImage = "TEST4", @Image = "test4"] + | | | | +- ID[@CanonicalImage = "TEST4", @Image = "test4"] + | | | +- FormalParameters[@CanonicalImage = "()", @Image = "()"] + | | | +- Datatype[@CanonicalImage = "CLOB", @Image = "CLOB", @TypeImage = "CLOB"] + | | | | +- ScalarDataTypeName[@CanonicalImage = "CLOB", @Image = "CLOB"] + | | | +- SqlMacroClause[@CanonicalImage = null, @Type = "TABLE"] + | | +- Statement[@CanonicalImage = null] + | | | +- UnlabelledStatement[@CanonicalImage = null] + | | | +- ReturnStatement[@CanonicalImage = null] + | | | +- Expression[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'"] + | | | +- PrimaryPrefix[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'", @SelfModifier = false] + | | | +- Literal[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'"] + | | | +- StringLiteral[@CanonicalImage = "\'Q[SELECT * FROM DUAL]\'", @Image = "\'q[select * from dual]\'", @String = "q[select * from dual]"] + | | +- ID[@CanonicalImage = "TEST4", @Image = "test4"] + | +- DeclarativeUnit[@CanonicalImage = null] + | +- ProgramUnit[@CanonicalImage = null, @MethodName = "test5", @Name = "test5", @ObjectName = null] + | +- MethodDeclarator[@CanonicalImage = "TEST5", @Image = "test5", @ParameterCount = 1] + | | +- ObjectNameDeclaration[@CanonicalImage = "TEST5", @Image = "test5"] + | | | +- ID[@CanonicalImage = "TEST5", @Image = "test5"] + | | +- FormalParameters[@CanonicalImage = "()", @Image = "()"] + | | +- Datatype[@CanonicalImage = "INT", @Image = "INT", @TypeImage = "INT"] + | | +- ScalarDataTypeName[@CanonicalImage = "INT", @Image = "INT"] + | +- DeclarativeSection[@CanonicalImage = null] + | | +- DeclarativeUnit[@CanonicalImage = null] + | | +- CursorSpecification[@CanonicalImage = null] + | | +- CursorUnit[@CanonicalImage = "C", @Image = "c"] + | | +- ID[@CanonicalImage = "C", @Image = "c"] + | | +- SelectStatement[@All = false, @CanonicalImage = null, @Distinct = false, @Unique = false] + | | +- SelectList[@CanonicalImage = null] + | | | +- SqlExpression[@CanonicalImage = "1", @Image = "1"] + | | | +- PrimaryPrefix[@CanonicalImage = "1", @Image = "1", @SelfModifier = false] + | | | +- Literal[@CanonicalImage = "1", @Image = "1"] + | | | +- NumericLiteral[@CanonicalImage = "1", @Image = "1"] + | | +- FromClause[@CanonicalImage = null] + | | +- TableReference[@CanonicalImage = null] + | | +- SchemaName[@CanonicalImage = "TEST", @Image = "test"] + | | | +- ID[@CanonicalImage = "TEST", @Image = "test"] + | | +- FunctionCall[@CanonicalImage = "TEST1", @Image = "test1"] + | | +- FunctionName[@CanonicalImage = "TEST1", @Image = "test1"] + | | | +- ID[@CanonicalImage = "TEST1", @Image = "test1"] + | | +- Arguments[@ArgumentCount = 0, @CanonicalImage = null] + | +- Statement[@CanonicalImage = null] + | | +- UnlabelledStatement[@CanonicalImage = null] + | | +- ReturnStatement[@CanonicalImage = null] + | | +- Expression[@CanonicalImage = "1", @Image = "1"] + | | +- PrimaryPrefix[@CanonicalImage = "1", @Image = "1", @SelfModifier = false] + | | +- Literal[@CanonicalImage = "1", @Image = "1"] + | | +- NumericLiteral[@CanonicalImage = "1", @Image = "1"] + | +- ID[@CanonicalImage = "TEST5", @Image = "test5"] + +- ID[@CanonicalImage = "TEST", @Image = "test"]