[plsql] SQL_MACRO - fixups from #5087

This commit is contained in:
Andreas Dangel
2024-07-11 10:15:58 +02:00
parent 3579f3f079
commit 7b172acc7c
6 changed files with 125 additions and 38 deletions

View File

@ -747,7 +747,7 @@ ASTMethodDeclarator MethodDeclarator() :
}
}
// There is no RETURN for a WRAPPED object
[ <RETURN> Datatype() [ SqlMacroClause() ] ]
[ <RETURN> Datatype() [ LOOKAHEAD({isKeyword("SQL_MACRO")}) SqlMacroClause() ] ]
)
| <PROCEDURE>
@ -5171,7 +5171,6 @@ TOKEN [IGNORE_CASE]:
<ROWTYPE: "ROWTYPE"> |
<SAVE: "SAVE"> |
<SAVEPOINT: "SAVEPOINT"> |
<SCALAR: "SCALAR"> |
<SECOND: "SECOND"> |
<SELF: "SELF"> |
<SEPARATE: "SEPARATE"> |
@ -5185,7 +5184,6 @@ TOKEN [IGNORE_CASE]:
<SPACE: "SPACE"> |
<SQLCODE: "SQLCODE"> |
<SQLERRM: "SQLERRM"> |
<SQL_MACRO: "SQL_MACRO"> |
<STATIC: "STATIC"> |
<SUBSTITUTABLE: "SUBSTITUTABLE"> |
<SUCCESSFUL: "SUCCESSFUL"> |
@ -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(): {}
{
(
<SQL_MACRO> [ <LPAREN> [ <TYPE> "=>" ] ( <SCALAR> | <TABLE> ) { jjtThis.setType(token.getImage()); } <RPAREN> ]
LOOKAHEAD({isKeyword("SQL_MACRO")}) KEYWORD("SQL_MACRO")
[
<LPAREN> [ <TYPE> "=>" ] ( LOOKAHEAD({isKeyword("SCALAR")}) KEYWORD("SCALAR") | <TABLE> )
{ jjtThis.setType(token.getImage()); } <RPAREN>
]
)
{ return jjtThis; }
}

View File

@ -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);

View File

@ -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<ASTSqlMacroClause> 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());
}
}

View File

@ -61,4 +61,9 @@ class PlsqlTreeDumpTest extends BaseTreeDumpTest {
void exceptionHandlerTomKytesDespair() {
doTest("ExceptionHandlerTomKytesDespair");
}
@Test
void sqlMacroClause() {
doTest("SqlMacroClause");
}
}

View File

@ -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]';

View File

@ -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"]