From 45b75c5ca0e5cd281609b6a0f20c7bd98bafa4be Mon Sep 17 00:00:00 2001 From: Arjen Duursma Date: Thu, 27 Jun 2024 15:28:38 +0200 Subject: [PATCH] Add support for DEFAULT_ARGUMENT as extension to arguments (eg. TO_NUMBER) --- pmd-plsql/etc/grammar/PLSQL.jjt | 5 +- .../plsql/ast/MergeStatementIssue1934.pls | 8 -- .../plsql/ast/MergeStatementIssue1934.txt | 109 +----------------- .../pmd/lang/plsql/ast/SelectExpressions.pls | 8 +- 4 files changed, 13 insertions(+), 117 deletions(-) diff --git a/pmd-plsql/etc/grammar/PLSQL.jjt b/pmd-plsql/etc/grammar/PLSQL.jjt index d307bc68b3..6690dff316 100644 --- a/pmd-plsql/etc/grammar/PLSQL.jjt +++ b/pmd-plsql/etc/grammar/PLSQL.jjt @@ -2690,7 +2690,7 @@ ASTDeleteStatement DeleteStatement() : ASTMergeStatement MergeStatement() : {} { - [ LOOKAHEAD(2) SchemaName() "." ] TableName() [ LOOKAHEAD(1, ID(), { getToken(1).kind != USING } ) TableAlias() ] + [ LOOKAHEAD(2) SchemaName() "." ] TableName() [ TableAlias() ] ( LOOKAHEAD(3) "(" ValuesClause() ")" @@ -3821,7 +3821,7 @@ ASTArgument Argument() : { //[LOOKAHEAD(2) UnqualifiedID() "=>"] Expression() [LOOKAHEAD(2) (simpleNode = UnqualifiedID()) ("=>" | ) ] - (Expression() ) + (Expression() [ <_DEFAULT> Expression() "ERROR" ] ) //Allow Using CharacterSet suffix clause [ ( ) @@ -4984,6 +4984,7 @@ TOKEN [IGNORE_CASE]: | | | + | | | | diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/MergeStatementIssue1934.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/MergeStatementIssue1934.pls index 782d8cffba..555f439f0b 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/MergeStatementIssue1934.pls +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/MergeStatementIssue1934.pls @@ -13,13 +13,5 @@ BEGIN THEN UPDATE SET b.text = e.text WHEN NOT MATCHED THEN INSERT (ID,KEY1, TEXT,LCE_ID) values (JHS_SEQ.NEXTVAL,'PROM_EDIT_PROM_NR','Edycja promocji nr',123123); - - MERGE INTO b - USING ( SELECT 'PROM_EDIT_PROM_NR' key1,'Edycja promocji nr' text,123123 lce_id FROM dual ) e - ON (b.key1 = e.key1 and b.lce_id=e.lce_id) - WHEN MATCHED - THEN UPDATE SET b.text = e.text - WHEN NOT MATCHED - THEN INSERT (ID,KEY1, TEXT,LCE_ID) values (JHS_SEQ.NEXTVAL,'PROM_EDIT_PROM_NR','Edycja promocji nr',123123); END; / diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/MergeStatementIssue1934.txt b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/MergeStatementIssue1934.txt index bda27d276c..c473d6143c 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/MergeStatementIssue1934.txt +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/MergeStatementIssue1934.txt @@ -1,115 +1,12 @@ +- Input[@CanonicalImage = null, @ExcludedLinesCount = 0, @ExcludedRangesCount = 0] +- Global[@CanonicalImage = null] +- Block[@CanonicalImage = null] - +- Statement[@CanonicalImage = null] - | +- UnlabelledStatement[@CanonicalImage = null] - | +- MergeStatement[@CanonicalImage = null] - | +- TableName[@CanonicalImage = "JHS_TRANSLATIONS", @Image = "jhs_translations"] - | | +- ID[@CanonicalImage = "JHS_TRANSLATIONS", @Image = "jhs_translations"] - | +- TableAlias[@CanonicalImage = "B", @Image = "b"] - | | +- ID[@CanonicalImage = "B", @Image = "b"] - | +- QueryBlock[@All = false, @CanonicalImage = null, @Distinct = false, @Unique = false] - | | +- SelectList[@CanonicalImage = null] - | | | +- SqlExpression[@CanonicalImage = "\'PROM_EDIT_PROM_NR\'", @Image = "\'PROM_EDIT_PROM_NR\'"] - | | | | +- PrimaryPrefix[@CanonicalImage = "\'PROM_EDIT_PROM_NR\'", @Image = "\'PROM_EDIT_PROM_NR\'", @SelfModifier = false] - | | | | +- Literal[@CanonicalImage = "\'PROM_EDIT_PROM_NR\'", @Image = "\'PROM_EDIT_PROM_NR\'"] - | | | | +- StringLiteral[@CanonicalImage = "\'PROM_EDIT_PROM_NR\'", @Image = "\'PROM_EDIT_PROM_NR\'", @String = "PROM_EDIT_PROM_NR"] - | | | +- ColumnAlias[@CanonicalImage = "KEY1", @Image = "key1"] - | | | | +- ID[@CanonicalImage = "KEY1", @Image = "key1"] - | | | +- SqlExpression[@CanonicalImage = "\'EDYCJA PROMOCJI NR\'", @Image = "\'Edycja promocji nr\'"] - | | | | +- PrimaryPrefix[@CanonicalImage = "\'EDYCJA PROMOCJI NR\'", @Image = "\'Edycja promocji nr\'", @SelfModifier = false] - | | | | +- Literal[@CanonicalImage = "\'EDYCJA PROMOCJI NR\'", @Image = "\'Edycja promocji nr\'"] - | | | | +- StringLiteral[@CanonicalImage = "\'EDYCJA PROMOCJI NR\'", @Image = "\'Edycja promocji nr\'", @String = "Edycja promocji nr"] - | | | +- ColumnAlias[@CanonicalImage = "TEXT", @Image = "text"] - | | | | +- ID[@CanonicalImage = "TEXT", @Image = "text"] - | | | +- SqlExpression[@CanonicalImage = "123123", @Image = "123123"] - | | | | +- PrimaryPrefix[@CanonicalImage = "123123", @Image = "123123", @SelfModifier = false] - | | | | +- Literal[@CanonicalImage = "123123", @Image = "123123"] - | | | | +- NumericLiteral[@CanonicalImage = "123123", @Image = "123123"] - | | | +- ColumnAlias[@CanonicalImage = "LCE_ID", @Image = "lce_id"] - | | | +- ID[@CanonicalImage = "LCE_ID", @Image = "lce_id"] - | | +- FromClause[@CanonicalImage = null] - | | +- TableReference[@CanonicalImage = null] - | | +- TableName[@CanonicalImage = "DUAL", @Image = "dual"] - | | +- ID[@CanonicalImage = "DUAL", @Image = "dual"] - | +- TableAlias[@CanonicalImage = "E", @Image = "e"] - | | +- ID[@CanonicalImage = "E", @Image = "e"] - | +- Condition[@CanonicalImage = null] - | | +- CompoundCondition[@CanonicalImage = null, @Type = "AND"] - | | +- ComparisonCondition[@CanonicalImage = null, @Operator = "="] - | | | +- SqlExpression[@CanonicalImage = "B.KEY1", @Image = "b.key1"] - | | | | +- PrimaryPrefix[@CanonicalImage = "B.KEY1", @Image = "b.key1", @SelfModifier = false] - | | | | +- SimpleExpression[@CanonicalImage = "B.KEY1", @Image = "b.key1"] - | | | | +- TableName[@CanonicalImage = "B", @Image = "b"] - | | | | | +- ID[@CanonicalImage = "B", @Image = "b"] - | | | | +- Column[@CanonicalImage = "KEY1", @Image = "key1"] - | | | | +- ID[@CanonicalImage = "KEY1", @Image = "key1"] - | | | +- SqlExpression[@CanonicalImage = "E.KEY1", @Image = "e.key1"] - | | | +- PrimaryPrefix[@CanonicalImage = "E.KEY1", @Image = "e.key1", @SelfModifier = false] - | | | +- SimpleExpression[@CanonicalImage = "E.KEY1", @Image = "e.key1"] - | | | +- TableName[@CanonicalImage = "E", @Image = "e"] - | | | | +- ID[@CanonicalImage = "E", @Image = "e"] - | | | +- Column[@CanonicalImage = "KEY1", @Image = "key1"] - | | | +- ID[@CanonicalImage = "KEY1", @Image = "key1"] - | | +- Condition[@CanonicalImage = null] - | | +- CompoundCondition[@CanonicalImage = null, @Type = null] - | | +- ComparisonCondition[@CanonicalImage = null, @Operator = "="] - | | +- SqlExpression[@CanonicalImage = "B.LCE_ID", @Image = "b.lce_id"] - | | | +- PrimaryPrefix[@CanonicalImage = "B.LCE_ID", @Image = "b.lce_id", @SelfModifier = false] - | | | +- SimpleExpression[@CanonicalImage = "B.LCE_ID", @Image = "b.lce_id"] - | | | +- TableName[@CanonicalImage = "B", @Image = "b"] - | | | | +- ID[@CanonicalImage = "B", @Image = "b"] - | | | +- Column[@CanonicalImage = "LCE_ID", @Image = "lce_id"] - | | | +- ID[@CanonicalImage = "LCE_ID", @Image = "lce_id"] - | | +- SqlExpression[@CanonicalImage = "E.LCE_ID", @Image = "e.lce_id"] - | | +- PrimaryPrefix[@CanonicalImage = "E.LCE_ID", @Image = "e.lce_id", @SelfModifier = false] - | | +- SimpleExpression[@CanonicalImage = "E.LCE_ID", @Image = "e.lce_id"] - | | +- TableName[@CanonicalImage = "E", @Image = "e"] - | | | +- ID[@CanonicalImage = "E", @Image = "e"] - | | +- Column[@CanonicalImage = "LCE_ID", @Image = "lce_id"] - | | +- ID[@CanonicalImage = "LCE_ID", @Image = "lce_id"] - | +- MergeUpdateClause[@CanonicalImage = null] - | | +- TableName[@CanonicalImage = "B", @Image = "b"] - | | | +- ID[@CanonicalImage = "B", @Image = "b"] - | | +- Column[@CanonicalImage = "TEXT", @Image = "text"] - | | | +- ID[@CanonicalImage = "TEXT", @Image = "text"] - | | +- Expression[@CanonicalImage = "E.TEXT", @Image = "e.text"] - | | +- PrimaryPrefix[@CanonicalImage = "E.TEXT", @Image = "e.text", @SelfModifier = false] - | | +- SimpleExpression[@CanonicalImage = "E.TEXT", @Image = "e.text"] - | | +- TableName[@CanonicalImage = "E", @Image = "e"] - | | | +- ID[@CanonicalImage = "E", @Image = "e"] - | | +- Column[@CanonicalImage = "TEXT", @Image = "text"] - | | +- ID[@CanonicalImage = "TEXT", @Image = "text"] - | +- MergeInsertClause[@CanonicalImage = null] - | +- Column[@CanonicalImage = "ID", @Image = "ID"] - | | +- ID[@CanonicalImage = "ID", @Image = "ID"] - | +- Column[@CanonicalImage = "KEY1", @Image = "KEY1"] - | | +- ID[@CanonicalImage = "KEY1", @Image = "KEY1"] - | +- Column[@CanonicalImage = "TEXT", @Image = "TEXT"] - | | +- ID[@CanonicalImage = "TEXT", @Image = "TEXT"] - | +- Column[@CanonicalImage = "LCE_ID", @Image = "LCE_ID"] - | | +- ID[@CanonicalImage = "LCE_ID", @Image = "LCE_ID"] - | +- ValuesClause[@CanonicalImage = null] - | +- Expression[@CanonicalImage = "", @Image = ""] - | | +- PrimaryPrefix[@CanonicalImage = "", @Image = "", @SelfModifier = false] - | | +- SimpleExpression[@CanonicalImage = "", @Image = ""] - | | +- ID[@CanonicalImage = "JHS_SEQ", @Image = "JHS_SEQ"] - | +- Expression[@CanonicalImage = "\'PROM_EDIT_PROM_NR\'", @Image = "\'PROM_EDIT_PROM_NR\'"] - | | +- PrimaryPrefix[@CanonicalImage = "\'PROM_EDIT_PROM_NR\'", @Image = "\'PROM_EDIT_PROM_NR\'", @SelfModifier = false] - | | +- Literal[@CanonicalImage = "\'PROM_EDIT_PROM_NR\'", @Image = "\'PROM_EDIT_PROM_NR\'"] - | | +- StringLiteral[@CanonicalImage = "\'PROM_EDIT_PROM_NR\'", @Image = "\'PROM_EDIT_PROM_NR\'", @String = "PROM_EDIT_PROM_NR"] - | +- Expression[@CanonicalImage = "\'EDYCJA PROMOCJI NR\'", @Image = "\'Edycja promocji nr\'"] - | | +- PrimaryPrefix[@CanonicalImage = "\'EDYCJA PROMOCJI NR\'", @Image = "\'Edycja promocji nr\'", @SelfModifier = false] - | | +- Literal[@CanonicalImage = "\'EDYCJA PROMOCJI NR\'", @Image = "\'Edycja promocji nr\'"] - | | +- StringLiteral[@CanonicalImage = "\'EDYCJA PROMOCJI NR\'", @Image = "\'Edycja promocji nr\'", @String = "Edycja promocji nr"] - | +- Expression[@CanonicalImage = "123123", @Image = "123123"] - | +- PrimaryPrefix[@CanonicalImage = "123123", @Image = "123123", @SelfModifier = false] - | +- Literal[@CanonicalImage = "123123", @Image = "123123"] - | +- NumericLiteral[@CanonicalImage = "123123", @Image = "123123"] +- Statement[@CanonicalImage = null] +- UnlabelledStatement[@CanonicalImage = null] +- MergeStatement[@CanonicalImage = null] - +- TableName[@CanonicalImage = "B", @Image = "b"] + +- TableName[@CanonicalImage = "JHS_TRANSLATIONS", @Image = "jhs_translations"] + | +- ID[@CanonicalImage = "JHS_TRANSLATIONS", @Image = "jhs_translations"] + +- TableAlias[@CanonicalImage = "B", @Image = "b"] | +- ID[@CanonicalImage = "B", @Image = "b"] +- QueryBlock[@All = false, @CanonicalImage = null, @Distinct = false, @Unique = false] | +- SelectList[@CanonicalImage = null] diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectExpressions.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectExpressions.pls index 11da9a6493..2f3c3ef11f 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectExpressions.pls +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectExpressions.pls @@ -108,4 +108,10 @@ SELECT CASE INTO VAL FROM dual; END; -/ \ No newline at end of file + +SELECT + TO_NUMBER$('xyz' default 0 on conversion error) BOGUS + INTO some_record + FROM some_table; + +/