diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JavaccToken.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JavaccToken.java index 957bb8ad14..f8e2d1442f 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JavaccToken.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JavaccToken.java @@ -147,6 +147,11 @@ public class JavaccToken implements GenericToken { return image.toString(); } + /** Returns the original text of the token. The image may be normalized. */ + public Chars getText() { + return document.getTextDocument().sliceOriginalText(getRegion()); + } + @Override public final TextRegion getRegion() { return TextRegion.fromBothOffsets(startOffset, endOffset); diff --git a/pmd-plsql/etc/grammar/PLSQL.jjt b/pmd-plsql/etc/grammar/PLSQL.jjt index 02713f61a3..39531df865 100644 --- a/pmd-plsql/etc/grammar/PLSQL.jjt +++ b/pmd-plsql/etc/grammar/PLSQL.jjt @@ -216,7 +216,10 @@ public class PLSQLParserImpl { * Usage: LOOKAHEAD({isKeyword("WAIT")}) KEYWORD("WAIT") */ private boolean isKeyword(String keyword) { - return getToken(1).kind == IDENTIFIER && getToken(1).getImage().equalsIgnoreCase(keyword); + return getToken(1).kind == IDENTIFIER + && getToken(1).getImage().equalsIgnoreCase(keyword) + // quoted identifiers are excluded + && getToken(1).getText().charAt(0) != '"'; } } @@ -1686,18 +1689,18 @@ ASTSimpleExpression SimpleExpression() : LOOKAHEAD(4) ID() "." ( | ) | LOOKAHEAD(6) - SchemaName() { sb.append(token.getImage()); } "." { sb.append(token.getImage()); } - TableName() { sb.append(token.getImage()); } "." { sb.append(token.getImage()); } - ( "*" | Column() ) { sb.append(token.getImage()); } + SchemaName() { sb.append(token.getText()); } "." { sb.append(token.getImage()); } + TableName() { sb.append(token.getText()); } "." { sb.append(token.getImage()); } + ( "*" | Column() ) { sb.append(token.getText()); } | LOOKAHEAD(4) - TableName() { sb.append(token.getImage()); } "." { sb.append(token.getImage()); } - ( "*" | Column() ) { sb.append(token.getImage()); } + TableName() { sb.append(token.getText()); } "." { sb.append(token.getImage()); } + ( "*" | Column() ) { sb.append(token.getText()); } | // Named Cursor: https://docs.oracle.com/en/database/oracle/oracle-database/18/lnpls/named-cursor-attribute.html#GUID-CD8D8415-FF19-4D81-99BA-7825FD40CC96 // Implicit Cursor: https://docs.oracle.com/en/database/oracle/oracle-database/18/lnpls/implicit-cursor-attribute.html#GUID-5A938EE7-E8D2-468C-B60F-81898F110BE1 LOOKAHEAD(3) - Column() { sb.append(token.getImage()); } "%" ( LOOKAHEAD({isKeyword("isopen")}) KEYWORD("ISOPEN") + Column() { sb.append(token.getText()); } "%" ( LOOKAHEAD({isKeyword("isopen")}) KEYWORD("ISOPEN") | LOOKAHEAD({isKeyword("found")}) KEYWORD("FOUND") | LOOKAHEAD({isKeyword("notfound")}) KEYWORD("NOTFOUND") | LOOKAHEAD({isKeyword("rowcount")}) KEYWORD("ROWCOUNT") @@ -1706,7 +1709,7 @@ ASTSimpleExpression SimpleExpression() : ) { sb.append('%').append(token.getImage()); } | LOOKAHEAD(2) - ( "*" | Column() ) { sb.append(token.getImage()); } + ( "*" | Column() ) { sb.append(token.getText()); } ) { jjtThis.setImage(sb.toString()); @@ -1715,11 +1718,11 @@ ASTSimpleExpression SimpleExpression() : } ASTOuterJoinExpression OuterJoinExpression() : -{ StringBuilder sb = new StringBuilder(); } +{ StringBuilder sb = new StringBuilder(); PLSQLNode node; } { - [ LOOKAHEAD(6) SchemaName() { sb.append(token.getImage()); } "." { sb.append(token.getImage()); } ] - [ LOOKAHEAD(4) TableName() { sb.append(token.getImage()); } "." { sb.append(token.getImage()); } ] - Column() { sb.append(token.getImage()); } + [ LOOKAHEAD(6) node=SchemaName() { sb.append(node.getImage()); } "." { sb.append(token.getImage()); } ] + [ LOOKAHEAD(4) node=TableName() { sb.append(node.getImage()); } "." { sb.append(token.getImage()); } ] + node=Column() { sb.append(node.getImage()); } "(" "+" ")" { @@ -5229,6 +5232,7 @@ TOKEN : | ( ( | | "$" | "_" | "#" )* ) | + // todo separate quoted identifier into other token ( "\"" "\"" ) > | @@ -5425,10 +5429,13 @@ void KEYWORD(String id) #void: } } -ASTKEYWORD_UNRESERVED KEYWORD_UNRESERVED (): {} +// This is only used to generate a node class +// @Deprecated +void KEYWORD_UNRESERVED (): {}{KEYWORD_NOT_RESERVED()} + +void KEYWORD_NOT_RESERVED () #void: {} { // PL/SQL UNRESERVED KEYWORDS - V$RESERVED.RESERVED='N' -( "REF" | "LAST" | "TRIM" | "OVER" | "UNBOUNDED" | "PRECEDING" | "FOLLOWING" | "WITHIN" | "OVERFLOW" | "ERROR" | "WITHOUT" | "COUNT" | "SUBPARTITION" | "LOG" | "ERRORS" | "REJECT" | "UNLIMITED" | @@ -6489,9 +6496,6 @@ ASTKEYWORD_UNRESERVED KEYWORD_UNRESERVED (): {} | //Although RENAME is an Oracle reserved word, it may be used as a PL/SQL name. | //Although RELEASE is an Oracle reserved word, it may be used as a PL/SQL name. | // PRAGMA INLINE is not a PLSQL reserved word -) - -{ jjtThis.setImage(token.getImage()) ; jjtThis.value = token ; return jjtThis ; } } //SRT 2011-04-17 - END */ @@ -6502,7 +6506,7 @@ ASTID ID(): {} { ( | - | KEYWORD_UNRESERVED() //SRT 2011-04-17 + | KEYWORD_NOT_RESERVED() //SRT 2011-04-17 /*KEYWORDS_UNRESERVED | | | | | | | | | | | | @@ -6676,7 +6680,7 @@ ASTID ID(): {} //20120427 | //SRT 20110524 | ) - { jjtThis.setImage(token.getImage()) ; jjtThis.value = token ; return jjtThis ; } + { jjtThis.setImage(token.getText().toString()) ; jjtThis.value = token ; return jjtThis ; } } /** @@ -6687,7 +6691,7 @@ ASTUnqualifiedID UnqualifiedID(): {} ( | - | KEYWORD_UNRESERVED() //SRT 2011-04-17 + | KEYWORD_NOT_RESERVED() //SRT 2011-04-17 | //20120501 | | @@ -6706,9 +6710,9 @@ ASTUnqualifiedID UnqualifiedID(): {} | | //| - //| KEYWORD_UNRESERVED() //SRT 2011-04-17 + //| KEYWORD_NOT_RESERVED() //SRT 2011-04-17 ) - { jjtThis.setImage(token.getImage()) ; jjtThis.value = token ; return jjtThis ; } + { jjtThis.setImage(token.getText().toString()) ; jjtThis.value = token ; return jjtThis ; } } /** @@ -6719,7 +6723,7 @@ ASTQualifiedID QualifiedID(): {} ( | - | KEYWORD_UNRESERVED() //SRT 2011-04-17 + | KEYWORD_NOT_RESERVED() //SRT 2011-04-17 /* | --Unreserved Key Word | --Unreserved Key Word @@ -6921,9 +6925,9 @@ ASTQualifiedID QualifiedID(): {} // | //| //| - //| KEYWORD_UNRESERVED() //SRT 2011-04-17 + //| KEYWORD_NOT_RESERVED() //SRT 2011-04-17 ) - { jjtThis.setImage(token.getImage()) ; jjtThis.value = token ; return jjtThis ; } + { jjtThis.setImage(token.getText().toString()) ; jjtThis.value = token ; return jjtThis ; } } ASTTypeKeyword TypeKeyword(): {} diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParser.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParser.java index 023314586e..169bfb7d1e 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParser.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParser.java @@ -9,6 +9,7 @@ import java.util.Locale; import org.checkerframework.checker.nullness.qual.Nullable; import net.sourceforge.pmd.benchmark.TimeTracker; +import net.sourceforge.pmd.lang.TokenManager; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.impl.javacc.CharStream; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccToken; @@ -16,6 +17,7 @@ import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccTokenDocument; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccTokenDocument.TokenDocumentBehavior; import net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter; import net.sourceforge.pmd.lang.document.Chars; +import net.sourceforge.pmd.lang.document.TextDocument; import net.sourceforge.pmd.lang.plsql.symboltable.SymbolFacade; public class PLSQLParser extends JjtreeParserAdapter { @@ -88,4 +90,8 @@ public class PLSQLParser extends JjtreeParserAdapter { return root; } + public static TokenManager newTokenManager(TextDocument doc) { + return PLSQLTokenKinds.newTokenManager(CharStream.create(doc, TOKEN_BEHAVIOR)); + } + } diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/cpd/PLSQLCpdLexer.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/cpd/PLSQLCpdLexer.java index b459caec0c..dc3c1d0d5e 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/cpd/PLSQLCpdLexer.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/cpd/PLSQLCpdLexer.java @@ -8,9 +8,9 @@ import net.sourceforge.pmd.cpd.CpdLanguageProperties; import net.sourceforge.pmd.cpd.impl.JavaccCpdLexer; import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.TokenManager; -import net.sourceforge.pmd.lang.ast.impl.javacc.CharStream; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccToken; import net.sourceforge.pmd.lang.document.TextDocument; +import net.sourceforge.pmd.lang.plsql.ast.PLSQLParser; import net.sourceforge.pmd.lang.plsql.ast.PLSQLTokenKinds; /** @@ -54,6 +54,6 @@ public class PLSQLCpdLexer extends JavaccCpdLexer { @Override protected TokenManager makeLexerImpl(TextDocument doc) { - return PLSQLTokenKinds.newTokenManager(CharStream.create(doc)); + return PLSQLParser.newTokenManager(doc); } } diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/CursorAttributesTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/CursorAttributesTest.java index afc284df4d..0f5aecee1e 100644 --- a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/CursorAttributesTest.java +++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/CursorAttributesTest.java @@ -16,7 +16,7 @@ class CursorAttributesTest extends AbstractPLSQLParserTst { void parseCursorWithAttribute() { ASTInput input = plsql.parseResource("CursorAttributes.pls"); ASTExpression exp = input.descendants(ASTIfStatement.class).first().firstChild(ASTExpression.class); - assertEquals("TestSearch%notfound", exp.getImage()); + assertEquals("TestSearch%NOTFOUND", exp.getImage()); } @Test diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup0.txt b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup0.txt index c45893721b..9f548a36a8 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup0.txt +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup0.txt @@ -16,7 +16,6 @@ | | | +- SimpleExpression[@CanonicalImage = "A.OWNER", @Image = "a.owner"] | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | +- Column[@CanonicalImage = "OWNER", @Image = "owner"] | | | +- ID[@CanonicalImage = "OWNER", @Image = "owner"] | | +- SqlExpression[@CanonicalImage = "U.OBJECT_NAME", @Image = "u.object_name"] @@ -33,7 +32,6 @@ | | | +- ID[@CanonicalImage = "P", @Image = "p"] | | +- Column[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] | | +- ID[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] - | | +- KEYWORD_UNRESERVED[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] | +- FromClause[@CanonicalImage = null] | | +- JoinClause[@CanonicalImage = null] | | +- TableReference[@CanonicalImage = null] @@ -43,14 +41,12 @@ | | | | +- ID[@CanonicalImage = "U", @Image = "u"] | | | +- TableAlias[@CanonicalImage = "INNER", @Image = "INNER"] | | | +- ID[@CanonicalImage = "INNER", @Image = "INNER"] - | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "INNER", @Image = "INNER"] | | +- InnerCrossJoinClause[@CanonicalImage = null, @Cross = false, @Natural = false] | | | +- TableReference[@CanonicalImage = null] | | | | +- TableName[@CanonicalImage = "ALL_OBJECTS", @Image = "ALL_OBJECTS"] | | | | | +- ID[@CanonicalImage = "ALL_OBJECTS", @Image = "ALL_OBJECTS"] | | | | +- TableAlias[@CanonicalImage = "A", @Image = "a"] | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | +- ConditionalAndExpression[@CanonicalImage = "U.OBJECT_NAME = A.OBJECT_NAME AND U.OBJECT_TYPE = A.OBJECT_TYPE AND U.OBJECT_ID = A.OBJECT_ID", @Image = "u.object_name = a.object_name AND u.object_type = a.object_type AND u.object_id = a.object_id"] | | | +- EqualityExpression[@CanonicalImage = "U.OBJECT_NAME = A.OBJECT_NAME", @Image = "u.object_name = a.object_name"] | | | | +- PrimaryPrefix[@CanonicalImage = "U.OBJECT_NAME", @Image = "u.object_name", @SelfModifier = false] @@ -63,7 +59,6 @@ | | | | +- SimpleExpression[@CanonicalImage = "A.OBJECT_NAME", @Image = "a.object_name"] | | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | | +- Column[@CanonicalImage = "OBJECT_NAME", @Image = "object_name"] | | | | +- ID[@CanonicalImage = "OBJECT_NAME", @Image = "object_name"] | | | +- EqualityExpression[@CanonicalImage = "U.OBJECT_TYPE = A.OBJECT_TYPE", @Image = "u.object_type = a.object_type"] @@ -77,7 +72,6 @@ | | | | +- SimpleExpression[@CanonicalImage = "A.OBJECT_TYPE", @Image = "a.object_type"] | | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | | +- Column[@CanonicalImage = "OBJECT_TYPE", @Image = "object_type"] | | | | +- ID[@CanonicalImage = "OBJECT_TYPE", @Image = "object_type"] | | | +- EqualityExpression[@CanonicalImage = "U.OBJECT_ID = A.OBJECT_ID", @Image = "u.object_id = a.object_id"] @@ -91,7 +85,6 @@ | | | +- SimpleExpression[@CanonicalImage = "A.OBJECT_ID", @Image = "a.object_id"] | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | +- Column[@CanonicalImage = "OBJECT_ID", @Image = "object_id"] | | | +- ID[@CanonicalImage = "OBJECT_ID", @Image = "object_id"] | | +- InnerCrossJoinClause[@CanonicalImage = null, @Cross = false, @Natural = false] @@ -112,7 +105,6 @@ | | | +- SimpleExpression[@CanonicalImage = "A.OWNER", @Image = "a.owner"] | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | +- Column[@CanonicalImage = "OWNER", @Image = "owner"] | | | +- ID[@CanonicalImage = "OWNER", @Image = "owner"] | | +- EqualityExpression[@CanonicalImage = "P.OBJECT_NAME = A.OBJECT_NAME", @Image = "p.object_name = a.object_name"] @@ -126,7 +118,6 @@ | | | +- SimpleExpression[@CanonicalImage = "A.OBJECT_NAME", @Image = "a.object_name"] | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | +- Column[@CanonicalImage = "OBJECT_NAME", @Image = "object_name"] | | | +- ID[@CanonicalImage = "OBJECT_NAME", @Image = "object_name"] | | +- EqualityExpression[@CanonicalImage = "P.OBJECT_TYPE = A.OBJECT_TYPE", @Image = "p.object_type = a.object_type"] @@ -140,7 +131,6 @@ | | +- SimpleExpression[@CanonicalImage = "A.OBJECT_TYPE", @Image = "a.object_type"] | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | +- Column[@CanonicalImage = "OBJECT_TYPE", @Image = "object_type"] | | +- ID[@CanonicalImage = "OBJECT_TYPE", @Image = "object_type"] | +- WhereClause[@CanonicalImage = null] @@ -152,7 +142,6 @@ | | +- SimpleExpression[@CanonicalImage = "A.OWNER", @Image = "a.owner"] | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | +- Column[@CanonicalImage = "OWNER", @Image = "owner"] | | +- ID[@CanonicalImage = "OWNER", @Image = "owner"] | +- SqlExpression[@CanonicalImage = "USER", @Image = "USER"] @@ -160,7 +149,6 @@ | +- SimpleExpression[@CanonicalImage = "USER", @Image = "USER"] | +- Column[@CanonicalImage = "USER", @Image = "USER"] | +- ID[@CanonicalImage = "USER", @Image = "USER"] - | +- KEYWORD_UNRESERVED[@CanonicalImage = "USER", @Image = "USER"] +- Statement[@CanonicalImage = null] | +- UnlabelledStatement[@CanonicalImage = null] | +- ForStatement[@CanonicalImage = null] @@ -225,5 +213,4 @@ | | +- ID[@CanonicalImage = "L_OBJECT", @Image = "l_object"] | +- Column[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] | +- ID[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] - | +- KEYWORD_UNRESERVED[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] +- ID[@CanonicalImage = "EXAMPLE_PROCEDURE", @Image = "EXAMPLE_PROCEDURE"] diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup1.txt b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup1.txt index 71d9aa3509..db09f410fc 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup1.txt +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup1.txt @@ -16,7 +16,6 @@ | | | +- SimpleExpression[@CanonicalImage = "A.OWNER", @Image = "a.owner"] | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | +- Column[@CanonicalImage = "OWNER", @Image = "owner"] | | | +- ID[@CanonicalImage = "OWNER", @Image = "owner"] | | +- SqlExpression[@CanonicalImage = "U.OBJECT_NAME", @Image = "u.object_name"] @@ -33,7 +32,6 @@ | | | +- ID[@CanonicalImage = "P", @Image = "p"] | | +- Column[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] | | +- ID[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] - | | +- KEYWORD_UNRESERVED[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] | +- FromClause[@CanonicalImage = null] | | +- TableReference[@CanonicalImage = null] | | +- JoinClause[@CanonicalImage = null] @@ -50,7 +48,6 @@ | | | | | +- ID[@CanonicalImage = "ALL_OBJECTS", @Image = "ALL_OBJECTS"] | | | | +- TableAlias[@CanonicalImage = "A", @Image = "a"] | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | +- ConditionalAndExpression[@CanonicalImage = "U.OBJECT_NAME = A.OBJECT_NAME AND U.OBJECT_TYPE = A.OBJECT_TYPE AND U.OBJECT_ID = A.OBJECT_ID", @Image = "u.object_name = a.object_name AND u.object_type = a.object_type AND u.object_id = a.object_id"] | | | +- EqualityExpression[@CanonicalImage = "U.OBJECT_NAME = A.OBJECT_NAME", @Image = "u.object_name = a.object_name"] | | | | +- PrimaryPrefix[@CanonicalImage = "U.OBJECT_NAME", @Image = "u.object_name", @SelfModifier = false] @@ -63,7 +60,6 @@ | | | | +- SimpleExpression[@CanonicalImage = "A.OBJECT_NAME", @Image = "a.object_name"] | | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | | +- Column[@CanonicalImage = "OBJECT_NAME", @Image = "object_name"] | | | | +- ID[@CanonicalImage = "OBJECT_NAME", @Image = "object_name"] | | | +- EqualityExpression[@CanonicalImage = "U.OBJECT_TYPE = A.OBJECT_TYPE", @Image = "u.object_type = a.object_type"] @@ -77,7 +73,6 @@ | | | | +- SimpleExpression[@CanonicalImage = "A.OBJECT_TYPE", @Image = "a.object_type"] | | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | | +- Column[@CanonicalImage = "OBJECT_TYPE", @Image = "object_type"] | | | | +- ID[@CanonicalImage = "OBJECT_TYPE", @Image = "object_type"] | | | +- EqualityExpression[@CanonicalImage = "U.OBJECT_ID = A.OBJECT_ID", @Image = "u.object_id = a.object_id"] @@ -91,7 +86,6 @@ | | | +- SimpleExpression[@CanonicalImage = "A.OBJECT_ID", @Image = "a.object_id"] | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | +- Column[@CanonicalImage = "OBJECT_ID", @Image = "object_id"] | | | +- ID[@CanonicalImage = "OBJECT_ID", @Image = "object_id"] | | +- InnerCrossJoinClause[@CanonicalImage = null, @Cross = false, @Natural = false] @@ -112,7 +106,6 @@ | | | +- SimpleExpression[@CanonicalImage = "A.OWNER", @Image = "a.owner"] | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | +- Column[@CanonicalImage = "OWNER", @Image = "owner"] | | | +- ID[@CanonicalImage = "OWNER", @Image = "owner"] | | +- EqualityExpression[@CanonicalImage = "P.OBJECT_NAME = A.OBJECT_NAME", @Image = "p.object_name = a.object_name"] @@ -126,7 +119,6 @@ | | | +- SimpleExpression[@CanonicalImage = "A.OBJECT_NAME", @Image = "a.object_name"] | | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | | +- Column[@CanonicalImage = "OBJECT_NAME", @Image = "object_name"] | | | +- ID[@CanonicalImage = "OBJECT_NAME", @Image = "object_name"] | | +- EqualityExpression[@CanonicalImage = "P.OBJECT_TYPE = A.OBJECT_TYPE", @Image = "p.object_type = a.object_type"] @@ -140,7 +132,6 @@ | | +- SimpleExpression[@CanonicalImage = "A.OBJECT_TYPE", @Image = "a.object_type"] | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | +- Column[@CanonicalImage = "OBJECT_TYPE", @Image = "object_type"] | | +- ID[@CanonicalImage = "OBJECT_TYPE", @Image = "object_type"] | +- WhereClause[@CanonicalImage = null] @@ -152,7 +143,6 @@ | | +- SimpleExpression[@CanonicalImage = "A.OWNER", @Image = "a.owner"] | | +- TableName[@CanonicalImage = "A", @Image = "a"] | | | +- ID[@CanonicalImage = "A", @Image = "a"] - | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] | | +- Column[@CanonicalImage = "OWNER", @Image = "owner"] | | +- ID[@CanonicalImage = "OWNER", @Image = "owner"] | +- SqlExpression[@CanonicalImage = "USER", @Image = "USER"] @@ -160,7 +150,6 @@ | +- SimpleExpression[@CanonicalImage = "USER", @Image = "USER"] | +- Column[@CanonicalImage = "USER", @Image = "USER"] | +- ID[@CanonicalImage = "USER", @Image = "USER"] - | +- KEYWORD_UNRESERVED[@CanonicalImage = "USER", @Image = "USER"] +- Statement[@CanonicalImage = null] | +- UnlabelledStatement[@CanonicalImage = null] | +- ForStatement[@CanonicalImage = null] @@ -225,5 +214,4 @@ | | +- ID[@CanonicalImage = "L_OBJECT", @Image = "l_object"] | +- Column[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] | +- ID[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] - | +- KEYWORD_UNRESERVED[@CanonicalImage = "AGGREGATE", @Image = "aggregate"] +- ID[@CanonicalImage = "EXAMPLE_PROCEDURE", @Image = "EXAMPLE_PROCEDURE"] diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup2.txt b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup2.txt index 7880baff0a..4cbe1737be 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup2.txt +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParenthesisGroup2.txt @@ -25,7 +25,6 @@ | | | | +- ID[@CanonicalImage = "SN", @Image = "sn"] | | | +- Column[@CanonicalImage = "NAME", @Image = "name"] | | | +- ID[@CanonicalImage = "NAME", @Image = "name"] - | | | +- KEYWORD_UNRESERVED[@CanonicalImage = "NAME", @Image = "name"] | | +- SqlExpression[@CanonicalImage = "SA.AGE", @Image = "sa.age"] | | | +- PrimaryPrefix[@CanonicalImage = "SA.AGE", @Image = "sa.age", @SelfModifier = false] | | | +- SimpleExpression[@CanonicalImage = "SA.AGE", @Image = "sa.age"] @@ -47,7 +46,6 @@ | | | +- ID[@CanonicalImage = "SP", @Image = "sp"] | | +- Column[@CanonicalImage = "PARENT", @Image = "parent"] | | +- ID[@CanonicalImage = "PARENT", @Image = "parent"] - | | +- KEYWORD_UNRESERVED[@CanonicalImage = "PARENT", @Image = "parent"] | +- FromClause[@CanonicalImage = null] | | +- TableReference[@CanonicalImage = null] | | +- JoinClause[@CanonicalImage = null] diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParsingExclusion.txt b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParsingExclusion.txt index 7022ea8e0a..ce99d248c1 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParsingExclusion.txt +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/ParsingExclusion.txt @@ -37,7 +37,6 @@ | | +- ID[@CanonicalImage = "DUAL", @Image = "dual"] | +- TableAlias[@CanonicalImage = "A", @Image = "a"] | +- ID[@CanonicalImage = "A", @Image = "a"] - | +- KEYWORD_UNRESERVED[@CanonicalImage = "A", @Image = "a"] +- WhereClause[@CanonicalImage = null] +- Condition[@CanonicalImage = null] +- CompoundCondition[@CanonicalImage = null, @Type = null] diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlPlusLexicalVariablesIssue195.txt b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlPlusLexicalVariablesIssue195.txt index b549a06aef..1e8f913308 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlPlusLexicalVariablesIssue195.txt +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SqlPlusLexicalVariablesIssue195.txt @@ -1,3 +1,3 @@ +- Input[@CanonicalImage = null, @ExcludedLinesCount = 0, @ExcludedRangesCount = 0] - +- SqlPlusCommand[@CanonicalImage = "DEFINE PATCH_NAME = ACME_MODULE", @Image = "define patch_name = acme_module "] - +- SqlPlusCommand[@CanonicalImage = "SPOOL &PATCH_NAME. . LOG", @Image = "spool &patch_name. . log "] + +- SqlPlusCommand[@CanonicalImage = "DEFINE PATCH_NAME = ACME_MODULE", @Image = "DEFINE PATCH_NAME = ACME_MODULE "] + +- SqlPlusCommand[@CanonicalImage = "SPOOL &PATCH_NAME. . LOG", @Image = "SPOOL &PATCH_NAME. . LOG "]