[plsql] Support exception handlers in compound triggers

- allow multiple exception handlers
- parse declarative section correctly in
  compound triggers
- CASE, CURSOR, DECLARE, EXECUTE, IF, PUBLIC, SQL are reserved words
  and cannot be used as an identifiers

Fixes #4270
This commit is contained in:
Andreas Dangel
2024-06-07 17:38:18 +02:00
parent b3851fe26e
commit 7a57aeb4db
8 changed files with 386 additions and 159 deletions

View File

@ -20,6 +20,7 @@ This is a {{ site.pmd.release_type }} release.
* plsql
* [#1934](https://github.com/pmd/pmd/issues/1934): \[plsql] ParseException with MERGE statement in anonymous block
* [#2779](https://github.com/pmd/pmd/issues/2779): \[plsql] Error while parsing statement with (Oracle) DML Error Logging
* [#4270](https://github.com/pmd/pmd/issues/4270): \[plsql] Parsing exception COMPOUND TRIGGER with EXCEPTION handler
### 🚨 API Changes

File diff suppressed because it is too large Load Diff

View File

@ -51,4 +51,9 @@ class PlsqlTreeDumpTest extends BaseTreeDumpTest {
void errorLoggingClause() {
doTest("ErrorLoggingClause2779");
}
@Test
void compoundTriggerWithAdditionalDeclarations() {
doTest("CompoundTriggerWithAdditionalDeclarations4270");
}
}

View File

@ -0,0 +1,45 @@
--
-- BSD-style license; for more info see http://pmd.sourceforge.net/license.html
--
-- https://github.com/pmd/pmd/issues/4270
-- TRIGGER EXAMPLE
CREATE OR REPLACE TRIGGER EXAMPLE_TRIGGER
FOR INSERT ON TEST_TABLE
COMPOUND TRIGGER
--
l_number_one NUMBER(2) := ROUND(DBMS_RANDOM.Value(1, 10));
l_number_two NUMBER(2) := ROUND(DBMS_RANDOM.Value(1, 10));
--
BEFORE EACH ROW IS
--
-- This is not officially documented, but might be possible - declarations before the begin block
l_tot_numbers NUMBER(2);
--
BEGIN
--
l_tot_numbers := l_number_one + l_number_two;
--
:NEW.col_one := l_number_one;
:NEW.col_two := l_number_two;
:NEW.col_three := l_tot_numbers;
--
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW' || CHR(10) || SQLERRM);
END BEFORE EACH ROW;
--
--
AFTER STATEMENT IS
BEGIN
--
DBMS_OUTPUT.Put_Line('This is just an example!');
--
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20002, 'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT' || CHR(10) || SQLERRM);
END AFTER STATEMENT;
--
END EXAMPLE_TRIGGER;

View File

@ -0,0 +1,239 @@
+- Input[@CanonicalImage = null, @ExcludedLinesCount = 0, @ExcludedRangesCount = 0]
+- TriggerUnit[@CanonicalImage = "EXAMPLE_TRIGGER", @Image = "EXAMPLE_TRIGGER", @MethodName = "EXAMPLE_TRIGGER", @Name = "EXAMPLE_TRIGGER", @ObjectName = "EXAMPLE_TRIGGER"]
+- ObjectNameDeclaration[@CanonicalImage = "EXAMPLE_TRIGGER", @Image = "EXAMPLE_TRIGGER"]
| +- ID[@CanonicalImage = "EXAMPLE_TRIGGER", @Image = "EXAMPLE_TRIGGER"]
+- ID[@CanonicalImage = "TEST_TABLE", @Image = "TEST_TABLE"]
+- CompoundTriggerBlock[@CanonicalImage = null]
+- DeclarativeSection[@CanonicalImage = null]
| +- DeclarativeUnit[@CanonicalImage = null]
| | +- VariableOrConstantDeclaration[@CanonicalImage = null]
| | +- VariableOrConstantDeclarator[@CanonicalImage = "L_NUMBER_ONE NUMBER(2) := ROUND", @Image = "l_number_one NUMBER(2) := ROUND"]
| | +- VariableOrConstantDeclaratorId[@Array = false, @ArrayDepth = 0, @CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one"]
| | | +- ID[@CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one"]
| | +- Datatype[@CanonicalImage = "NUMBER(2)", @Image = "NUMBER(2)", @TypeImage = "NUMBER(2)"]
| | | +- ScalarDataTypeName[@CanonicalImage = "NUMBER(2)", @Image = "NUMBER(2)"]
| | | +- NumericLiteral[@CanonicalImage = "2", @Image = "2"]
| | +- VariableOrConstantInitializer[@CanonicalImage = "ROUND", @Image = "ROUND"]
| | +- Expression[@CanonicalImage = "ROUND", @Image = "ROUND"]
| | +- PrimaryPrefix[@CanonicalImage = "ROUND", @Image = "ROUND", @SelfModifier = false]
| | +- FunctionCall[@CanonicalImage = "ROUND", @Image = "ROUND"]
| | +- FunctionName[@CanonicalImage = "ROUND", @Image = "ROUND"]
| | | +- ID[@CanonicalImage = "ROUND", @Image = "ROUND"]
| | +- Arguments[@ArgumentCount = 1, @CanonicalImage = null]
| | +- ArgumentList[@CanonicalImage = null]
| | +- Argument[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = "DBMS_RANDOM.VALUE", @Image = "DBMS_RANDOM.Value"]
| | +- PrimaryPrefix[@CanonicalImage = "DBMS_RANDOM.VALUE", @Image = "DBMS_RANDOM.Value", @SelfModifier = false]
| | +- FunctionCall[@CanonicalImage = "DBMS_RANDOM.VALUE", @Image = "DBMS_RANDOM.Value"]
| | +- FunctionName[@CanonicalImage = "DBMS_RANDOM.VALUE", @Image = "DBMS_RANDOM.Value"]
| | | +- ID[@CanonicalImage = "DBMS_RANDOM", @Image = "DBMS_RANDOM"]
| | | +- ID[@CanonicalImage = "VALUE", @Image = "Value"]
| | +- Arguments[@ArgumentCount = 2, @CanonicalImage = null]
| | +- ArgumentList[@CanonicalImage = null]
| | +- Argument[@CanonicalImage = null]
| | | +- Expression[@CanonicalImage = "1", @Image = "1"]
| | | +- PrimaryPrefix[@CanonicalImage = "1", @Image = "1", @SelfModifier = false]
| | | +- Literal[@CanonicalImage = "1", @Image = "1"]
| | | +- NumericLiteral[@CanonicalImage = "1", @Image = "1"]
| | +- Argument[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = "10", @Image = "10"]
| | +- PrimaryPrefix[@CanonicalImage = "10", @Image = "10", @SelfModifier = false]
| | +- Literal[@CanonicalImage = "10", @Image = "10"]
| | +- NumericLiteral[@CanonicalImage = "10", @Image = "10"]
| +- DeclarativeUnit[@CanonicalImage = null]
| +- VariableOrConstantDeclaration[@CanonicalImage = null]
| +- VariableOrConstantDeclarator[@CanonicalImage = "L_NUMBER_TWO NUMBER(2) := ROUND", @Image = "l_number_two NUMBER(2) := ROUND"]
| +- VariableOrConstantDeclaratorId[@Array = false, @ArrayDepth = 0, @CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two"]
| | +- ID[@CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two"]
| +- Datatype[@CanonicalImage = "NUMBER(2)", @Image = "NUMBER(2)", @TypeImage = "NUMBER(2)"]
| | +- ScalarDataTypeName[@CanonicalImage = "NUMBER(2)", @Image = "NUMBER(2)"]
| | +- NumericLiteral[@CanonicalImage = "2", @Image = "2"]
| +- VariableOrConstantInitializer[@CanonicalImage = "ROUND", @Image = "ROUND"]
| +- Expression[@CanonicalImage = "ROUND", @Image = "ROUND"]
| +- PrimaryPrefix[@CanonicalImage = "ROUND", @Image = "ROUND", @SelfModifier = false]
| +- FunctionCall[@CanonicalImage = "ROUND", @Image = "ROUND"]
| +- FunctionName[@CanonicalImage = "ROUND", @Image = "ROUND"]
| | +- ID[@CanonicalImage = "ROUND", @Image = "ROUND"]
| +- Arguments[@ArgumentCount = 1, @CanonicalImage = null]
| +- ArgumentList[@CanonicalImage = null]
| +- Argument[@CanonicalImage = null]
| +- Expression[@CanonicalImage = "DBMS_RANDOM.VALUE", @Image = "DBMS_RANDOM.Value"]
| +- PrimaryPrefix[@CanonicalImage = "DBMS_RANDOM.VALUE", @Image = "DBMS_RANDOM.Value", @SelfModifier = false]
| +- FunctionCall[@CanonicalImage = "DBMS_RANDOM.VALUE", @Image = "DBMS_RANDOM.Value"]
| +- FunctionName[@CanonicalImage = "DBMS_RANDOM.VALUE", @Image = "DBMS_RANDOM.Value"]
| | +- ID[@CanonicalImage = "DBMS_RANDOM", @Image = "DBMS_RANDOM"]
| | +- ID[@CanonicalImage = "VALUE", @Image = "Value"]
| +- Arguments[@ArgumentCount = 2, @CanonicalImage = null]
| +- ArgumentList[@CanonicalImage = null]
| +- Argument[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = "1", @Image = "1"]
| | +- PrimaryPrefix[@CanonicalImage = "1", @Image = "1", @SelfModifier = false]
| | +- Literal[@CanonicalImage = "1", @Image = "1"]
| | +- NumericLiteral[@CanonicalImage = "1", @Image = "1"]
| +- Argument[@CanonicalImage = null]
| +- Expression[@CanonicalImage = "10", @Image = "10"]
| +- PrimaryPrefix[@CanonicalImage = "10", @Image = "10", @SelfModifier = false]
| +- Literal[@CanonicalImage = "10", @Image = "10"]
| +- NumericLiteral[@CanonicalImage = "10", @Image = "10"]
+- TriggerTimingPointSection[@CanonicalImage = "BEFORE ROW", @Image = "BEFORE ROW", @MethodName = "BEFORE ROW", @Name = "BEFORE ROW"]
| +- DeclarativeSection[@CanonicalImage = null]
| | +- DeclarativeUnit[@CanonicalImage = null]
| | +- VariableOrConstantDeclaration[@CanonicalImage = null]
| | +- VariableOrConstantDeclarator[@CanonicalImage = "L_TOT_NUMBERS NUMBER(2)", @Image = "l_tot_numbers NUMBER(2)"]
| | +- VariableOrConstantDeclaratorId[@Array = false, @ArrayDepth = 0, @CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers"]
| | | +- ID[@CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers"]
| | +- Datatype[@CanonicalImage = "NUMBER(2)", @Image = "NUMBER(2)", @TypeImage = "NUMBER(2)"]
| | +- ScalarDataTypeName[@CanonicalImage = "NUMBER(2)", @Image = "NUMBER(2)"]
| | +- NumericLiteral[@CanonicalImage = "2", @Image = "2"]
| +- Statement[@CanonicalImage = null]
| | +- UnlabelledStatement[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = "L_TOT_NUMBERS := L_NUMBER_ONE + L_NUMBER_TWO", @Image = "l_tot_numbers := l_number_one + l_number_two"]
| | +- Assignment[@CanonicalImage = "L_TOT_NUMBERS := L_NUMBER_ONE + L_NUMBER_TWO", @Image = "l_tot_numbers := l_number_one + l_number_two"]
| | +- PrimaryPrefix[@CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers", @SelfModifier = false]
| | | +- SimpleExpression[@CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers"]
| | | +- Column[@CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers"]
| | | +- ID[@CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers"]
| | +- Expression[@CanonicalImage = "L_NUMBER_ONE + L_NUMBER_TWO", @Image = "l_number_one + l_number_two"]
| | +- AdditiveExpression[@CanonicalImage = "L_NUMBER_ONE + L_NUMBER_TWO", @Image = "l_number_one + l_number_two"]
| | +- PrimaryPrefix[@CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one", @SelfModifier = false]
| | | +- SimpleExpression[@CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one"]
| | | +- Column[@CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one"]
| | | +- ID[@CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one"]
| | +- PrimaryPrefix[@CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two", @SelfModifier = false]
| | +- SimpleExpression[@CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two"]
| | +- Column[@CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two"]
| | +- ID[@CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two"]
| +- Statement[@CanonicalImage = null]
| | +- UnlabelledStatement[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = ":NEW.COL_ONE := L_NUMBER_ONE", @Image = ":NEW.col_one := l_number_one"]
| | +- Assignment[@CanonicalImage = ":NEW.COL_ONE := L_NUMBER_ONE", @Image = ":NEW.col_one := l_number_one"]
| | +- PrimaryPrefix[@CanonicalImage = ":NEW.COL_ONE", @Image = ":NEW.col_one", @SelfModifier = false]
| | | +- SimpleExpression[@CanonicalImage = ":NEW.COL_ONE", @Image = ":NEW.col_one"]
| | | +- TableName[@CanonicalImage = ":NEW", @Image = ":NEW"]
| | | | +- ID[@CanonicalImage = ":NEW", @Image = ":NEW"]
| | | +- Column[@CanonicalImage = "COL_ONE", @Image = "col_one"]
| | | +- ID[@CanonicalImage = "COL_ONE", @Image = "col_one"]
| | +- Expression[@CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one"]
| | +- PrimaryPrefix[@CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one", @SelfModifier = false]
| | +- SimpleExpression[@CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one"]
| | +- Column[@CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one"]
| | +- ID[@CanonicalImage = "L_NUMBER_ONE", @Image = "l_number_one"]
| +- Statement[@CanonicalImage = null]
| | +- UnlabelledStatement[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = ":NEW.COL_TWO := L_NUMBER_TWO", @Image = ":NEW.col_two := l_number_two"]
| | +- Assignment[@CanonicalImage = ":NEW.COL_TWO := L_NUMBER_TWO", @Image = ":NEW.col_two := l_number_two"]
| | +- PrimaryPrefix[@CanonicalImage = ":NEW.COL_TWO", @Image = ":NEW.col_two", @SelfModifier = false]
| | | +- SimpleExpression[@CanonicalImage = ":NEW.COL_TWO", @Image = ":NEW.col_two"]
| | | +- TableName[@CanonicalImage = ":NEW", @Image = ":NEW"]
| | | | +- ID[@CanonicalImage = ":NEW", @Image = ":NEW"]
| | | +- Column[@CanonicalImage = "COL_TWO", @Image = "col_two"]
| | | +- ID[@CanonicalImage = "COL_TWO", @Image = "col_two"]
| | +- Expression[@CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two"]
| | +- PrimaryPrefix[@CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two", @SelfModifier = false]
| | +- SimpleExpression[@CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two"]
| | +- Column[@CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two"]
| | +- ID[@CanonicalImage = "L_NUMBER_TWO", @Image = "l_number_two"]
| +- Statement[@CanonicalImage = null]
| | +- UnlabelledStatement[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = ":NEW.COL_THREE := L_TOT_NUMBERS", @Image = ":NEW.col_three := l_tot_numbers"]
| | +- Assignment[@CanonicalImage = ":NEW.COL_THREE := L_TOT_NUMBERS", @Image = ":NEW.col_three := l_tot_numbers"]
| | +- PrimaryPrefix[@CanonicalImage = ":NEW.COL_THREE", @Image = ":NEW.col_three", @SelfModifier = false]
| | | +- SimpleExpression[@CanonicalImage = ":NEW.COL_THREE", @Image = ":NEW.col_three"]
| | | +- TableName[@CanonicalImage = ":NEW", @Image = ":NEW"]
| | | | +- ID[@CanonicalImage = ":NEW", @Image = ":NEW"]
| | | +- Column[@CanonicalImage = "COL_THREE", @Image = "col_three"]
| | | +- ID[@CanonicalImage = "COL_THREE", @Image = "col_three"]
| | +- Expression[@CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers"]
| | +- PrimaryPrefix[@CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers", @SelfModifier = false]
| | +- SimpleExpression[@CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers"]
| | +- Column[@CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers"]
| | +- ID[@CanonicalImage = "L_TOT_NUMBERS", @Image = "l_tot_numbers"]
| +- ExceptionHandler[@CanonicalImage = null]
| +- Statement[@CanonicalImage = null]
| +- UnlabelledStatement[@CanonicalImage = null]
| +- Expression[@CanonicalImage = "RAISE_APPLICATION_ERROR", @Image = "RAISE_APPLICATION_ERROR"]
| +- PrimaryPrefix[@CanonicalImage = "RAISE_APPLICATION_ERROR", @Image = "RAISE_APPLICATION_ERROR", @SelfModifier = false]
| +- FunctionCall[@CanonicalImage = "RAISE_APPLICATION_ERROR", @Image = "RAISE_APPLICATION_ERROR"]
| +- FunctionName[@CanonicalImage = "RAISE_APPLICATION_ERROR", @Image = "RAISE_APPLICATION_ERROR"]
| | +- ID[@CanonicalImage = "RAISE_APPLICATION_ERROR", @Image = "RAISE_APPLICATION_ERROR"]
| +- Arguments[@ArgumentCount = 2, @CanonicalImage = null]
| +- ArgumentList[@CanonicalImage = null]
| +- Argument[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = "-20001", @Image = " -20001"]
| | +- PrimaryPrefix[@CanonicalImage = "20001", @Image = "20001", @SelfModifier = false]
| | +- Literal[@CanonicalImage = "20001", @Image = "20001"]
| | +- NumericLiteral[@CanonicalImage = "20001", @Image = "20001"]
| +- Argument[@CanonicalImage = null]
| +- Expression[@CanonicalImage = "\'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW\' || CHR || SQLERRM", @Image = "\'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW\' || CHR || SQLERRM"]
| +- AdditiveExpression[@CanonicalImage = "\'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW\' || CHR || SQLERRM", @Image = "\'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW\' || CHR || SQLERRM"]
| +- PrimaryPrefix[@CanonicalImage = "\'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW\'", @Image = "\'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW\'", @SelfModifier = false]
| | +- Literal[@CanonicalImage = "\'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW\'", @Image = "\'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW\'"]
| | +- StringLiteral[@CanonicalImage = "\'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW\'", @Image = "\'ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW\'", @String = "ERROR AT EXAMPLE_TRIGGER - BEFORE EACH ROW"]
| +- PrimaryPrefix[@CanonicalImage = "CHR", @Image = "CHR", @SelfModifier = false]
| | +- FunctionCall[@CanonicalImage = "CHR", @Image = "CHR"]
| | +- FunctionName[@CanonicalImage = "CHR", @Image = "CHR"]
| | | +- ID[@CanonicalImage = "CHR", @Image = "CHR"]
| | +- Arguments[@ArgumentCount = 1, @CanonicalImage = null]
| | +- ArgumentList[@CanonicalImage = null]
| | +- Argument[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = "10", @Image = "10"]
| | +- PrimaryPrefix[@CanonicalImage = "10", @Image = "10", @SelfModifier = false]
| | +- Literal[@CanonicalImage = "10", @Image = "10"]
| | +- NumericLiteral[@CanonicalImage = "10", @Image = "10"]
| +- PrimaryPrefix[@CanonicalImage = "SQLERRM", @Image = "SQLERRM", @SelfModifier = false]
| +- SimpleExpression[@CanonicalImage = "SQLERRM", @Image = "SQLERRM"]
| +- Column[@CanonicalImage = "SQLERRM", @Image = "SQLERRM"]
| +- ID[@CanonicalImage = "SQLERRM", @Image = "SQLERRM"]
+- TriggerTimingPointSection[@CanonicalImage = "AFTER STATEMENT", @Image = "AFTER STATEMENT", @MethodName = "AFTER STATEMENT", @Name = "AFTER STATEMENT"]
| +- Statement[@CanonicalImage = null]
| | +- UnlabelledStatement[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = "DBMS_OUTPUT.PUT_LINE", @Image = "DBMS_OUTPUT.Put_Line"]
| | +- PrimaryPrefix[@CanonicalImage = "DBMS_OUTPUT.PUT_LINE", @Image = "DBMS_OUTPUT.Put_Line", @SelfModifier = false]
| | +- FunctionCall[@CanonicalImage = "DBMS_OUTPUT.PUT_LINE", @Image = "DBMS_OUTPUT.Put_Line"]
| | +- FunctionName[@CanonicalImage = "DBMS_OUTPUT.PUT_LINE", @Image = "DBMS_OUTPUT.Put_Line"]
| | | +- ID[@CanonicalImage = "DBMS_OUTPUT", @Image = "DBMS_OUTPUT"]
| | | +- ID[@CanonicalImage = "PUT_LINE", @Image = "Put_Line"]
| | +- Arguments[@ArgumentCount = 1, @CanonicalImage = null]
| | +- ArgumentList[@CanonicalImage = null]
| | +- Argument[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = "\'THIS IS JUST AN EXAMPLE!\'", @Image = "\'This is just an example!\'"]
| | +- PrimaryPrefix[@CanonicalImage = "\'THIS IS JUST AN EXAMPLE!\'", @Image = "\'This is just an example!\'", @SelfModifier = false]
| | +- Literal[@CanonicalImage = "\'THIS IS JUST AN EXAMPLE!\'", @Image = "\'This is just an example!\'"]
| | +- StringLiteral[@CanonicalImage = "\'THIS IS JUST AN EXAMPLE!\'", @Image = "\'This is just an example!\'", @String = "This is just an example!"]
| +- ExceptionHandler[@CanonicalImage = null]
| +- Statement[@CanonicalImage = null]
| +- UnlabelledStatement[@CanonicalImage = null]
| +- Expression[@CanonicalImage = "RAISE_APPLICATION_ERROR", @Image = "RAISE_APPLICATION_ERROR"]
| +- PrimaryPrefix[@CanonicalImage = "RAISE_APPLICATION_ERROR", @Image = "RAISE_APPLICATION_ERROR", @SelfModifier = false]
| +- FunctionCall[@CanonicalImage = "RAISE_APPLICATION_ERROR", @Image = "RAISE_APPLICATION_ERROR"]
| +- FunctionName[@CanonicalImage = "RAISE_APPLICATION_ERROR", @Image = "RAISE_APPLICATION_ERROR"]
| | +- ID[@CanonicalImage = "RAISE_APPLICATION_ERROR", @Image = "RAISE_APPLICATION_ERROR"]
| +- Arguments[@ArgumentCount = 2, @CanonicalImage = null]
| +- ArgumentList[@CanonicalImage = null]
| +- Argument[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = "-20002", @Image = " -20002"]
| | +- PrimaryPrefix[@CanonicalImage = "20002", @Image = "20002", @SelfModifier = false]
| | +- Literal[@CanonicalImage = "20002", @Image = "20002"]
| | +- NumericLiteral[@CanonicalImage = "20002", @Image = "20002"]
| +- Argument[@CanonicalImage = null]
| +- Expression[@CanonicalImage = "\'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT\' || CHR || SQLERRM", @Image = "\'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT\' || CHR || SQLERRM"]
| +- AdditiveExpression[@CanonicalImage = "\'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT\' || CHR || SQLERRM", @Image = "\'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT\' || CHR || SQLERRM"]
| +- PrimaryPrefix[@CanonicalImage = "\'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT\'", @Image = "\'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT\'", @SelfModifier = false]
| | +- Literal[@CanonicalImage = "\'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT\'", @Image = "\'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT\'"]
| | +- StringLiteral[@CanonicalImage = "\'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT\'", @Image = "\'ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT\'", @String = "ERROR AT EXAMPLE_TRIGGER - AFTER STATEMENT"]
| +- PrimaryPrefix[@CanonicalImage = "CHR", @Image = "CHR", @SelfModifier = false]
| | +- FunctionCall[@CanonicalImage = "CHR", @Image = "CHR"]
| | +- FunctionName[@CanonicalImage = "CHR", @Image = "CHR"]
| | | +- ID[@CanonicalImage = "CHR", @Image = "CHR"]
| | +- Arguments[@ArgumentCount = 1, @CanonicalImage = null]
| | +- ArgumentList[@CanonicalImage = null]
| | +- Argument[@CanonicalImage = null]
| | +- Expression[@CanonicalImage = "10", @Image = "10"]
| | +- PrimaryPrefix[@CanonicalImage = "10", @Image = "10", @SelfModifier = false]
| | +- Literal[@CanonicalImage = "10", @Image = "10"]
| | +- NumericLiteral[@CanonicalImage = "10", @Image = "10"]
| +- PrimaryPrefix[@CanonicalImage = "SQLERRM", @Image = "SQLERRM", @SelfModifier = false]
| +- SimpleExpression[@CanonicalImage = "SQLERRM", @Image = "SQLERRM"]
| +- Column[@CanonicalImage = "SQLERRM", @Image = "SQLERRM"]
| +- ID[@CanonicalImage = "SQLERRM", @Image = "SQLERRM"]
+- ID[@CanonicalImage = "EXAMPLE_TRIGGER", @Image = "EXAMPLE_TRIGGER"]

View File

@ -9,8 +9,8 @@ DECLARE
BEGIN
OPEN emp_cv FOR -- open cursor variable
'SELECT ename, sal FROM emp WHERE sal > :s' USING my_sal;
open cursor for 'query' USING variable;
open cursor for 'query' USING IN variable;
open cursor for 'query' USING OUT variable, IN othervariable;
open cursor for 'query' USING IN OUT variable;
open cursorvar for 'query' USING variable;
open cursorvar for 'query' USING IN variable;
open cursorvar for 'query' USING OUT variable, IN othervariable;
open cursorvar for 'query' USING IN OUT variable;
END;

View File

@ -327,8 +327,6 @@ CREATE OR REPLACE PACKAGE BODY Foo AS
CURRENT_TIMESTAMP IN OUT VARCHAR2,
/** Unreserved Keyword Word CURRENT_USER **/
CURRENT_USER IN OUT VARCHAR2,
/** Unreserved Keyword Word CURSOR **/
CURSOR IN OUT VARCHAR2,
/** Unreserved Keyword Word CURSOR_SHARING_EXACT **/
CURSOR_SHARING_EXACT IN OUT VARCHAR2,
/** Unreserved Keyword Word CURSOR_SPECIFIC_SEGMENT **/
@ -2253,7 +2251,6 @@ CREATE OR REPLACE PACKAGE BODY Foo AS
CURRENT_TIME := 'CURRENT_TIME' ; -- CURRENT_TIME VARCHAR2(240)
CURRENT_TIMESTAMP := 'CURRENT_TIMESTAMP' ; -- CURRENT_TIMESTAMP VARCHAR2(240)
CURRENT_USER := 'CURRENT_USER' ; -- CURRENT_USER VARCHAR2(240)
CURSOR := 'CURSOR' ; -- CURSOR VARCHAR2(240)
CURSOR_SHARING_EXACT := 'CURSOR_SHARING_EXACT' ; -- CURSOR_SHARING_EXACT VARCHAR2(240)
CURSOR_SPECIFIC_SEGMENT := 'CURSOR_SPECIFIC_SEGMENT' ; -- CURSOR_SPECIFIC_SEGMENT VARCHAR2(240)
CYCLE := 'CYCLE' ; -- CYCLE VARCHAR2(240)
@ -3156,7 +3153,6 @@ CREATE OR REPLACE PACKAGE BODY Foo AS
"COMMENT" := 'COMMENT' ; -- COMMENT VARCHAR2(240)
"CURRENT" := 'CURRENT' ; -- CURRENT VARCHAR2(240)
"CURRENT_USER" := 'CURRENT_USER' ; -- CURRENT_USER VARCHAR2(240)
"CURSOR" := 'CURSOR' ; -- CURSOR VARCHAR2(240)
"DEC" := 'DEC' ; -- DEC VARCHAR2(240)
"DECLARE" := 'DECLARE' ; -- DECLARE VARCHAR2(240)
"DEFINER" := 'DEFINER' ; -- DEFINER VARCHAR2(240)

View File

@ -105,8 +105,6 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
BECOME VARCHAR2(240);
/** Unreserved Keyword Word BEFORE **/
BEFORE VARCHAR2(240);
/** Unreserved Keyword Word BEGIN **/
--SRT BEGIN VARCHAR2(240);
/** Unreserved Keyword Word BEGIN_OUTLINE_DATA **/
BEGIN_OUTLINE_DATA VARCHAR2(240);
/** Unreserved Keyword Word BEHALF **/
@ -187,8 +185,6 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
CARDINALITY VARCHAR2(240);
/** Unreserved Keyword Word CASCADE **/
CASCADE VARCHAR2(240);
/** Unreserved Keyword Word CASE **/
CASE VARCHAR2(240);
/** Unreserved Keyword Word CAST **/
CAST VARCHAR2(240);
/** Unreserved Keyword Word CATEGORY **/
@ -325,8 +321,6 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
CURRENT_TIMESTAMP VARCHAR2(240);
/** Unreserved Keyword Word CURRENT_USER **/
CURRENT_USER VARCHAR2(240);
/** Unreserved Keyword Word CURSOR **/
CURSOR VARCHAR2(240);
/** Unreserved Keyword Word CURSOR_SHARING_EXACT **/
CURSOR_SHARING_EXACT VARCHAR2(240);
/** Unreserved Keyword Word CURSOR_SPECIFIC_SEGMENT **/
@ -367,8 +361,6 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
DEBUG VARCHAR2(240);
/** Unreserved Keyword Word DEC **/
DEC VARCHAR2(240);
/** Unreserved Keyword Word DECLARE **/
DECLARE VARCHAR2(240);
/** Unreserved Keyword Word DECREMENT **/
DECREMENT VARCHAR2(240);
/** Unreserved Keyword Word DECRYPT **/
@ -469,8 +461,6 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
ENCRYPT VARCHAR2(240);
/** Unreserved Keyword Word ENCRYPTION **/
ENCRYPTION VARCHAR2(240);
/** Unreserved Keyword Word END **/
--SRT END VARCHAR2(240);
/** Unreserved Keyword Word END_OUTLINE_DATA **/
END_OUTLINE_DATA VARCHAR2(240);
/** Unreserved Keyword Word ENFORCE **/
@ -576,7 +566,7 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
/** Unreserved Keyword Word FOLLOWING **/
FOLLOWING VARCHAR2(240);
/** Unreserved Keyword Word FORCE **/
-- FORCE VARCHAR2(240);
FORCE VARCHAR2(240);
/** Unreserved Keyword Word FORCE_XML_QUERY_REWRITE **/
FORCE_XML_QUERY_REWRITE VARCHAR2(240);
/** Unreserved Keyword Word FOREIGN **/
@ -591,8 +581,6 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
FRESH VARCHAR2(240);
/** Unreserved Keyword Word FULL **/
FULL VARCHAR2(240);
/** Unreserved Keyword Word FUNCTION **/
--SRT FUNCTION VARCHAR2(240);
/** Unreserved Keyword Word FUNCTIONS **/
FUNCTIONS VARCHAR2(240);
/** Unreserved Keyword Word G **/
@ -657,8 +645,6 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
IDGENERATORS VARCHAR2(240);
/** Unreserved Keyword Word IDLE_TIME **/
IDLE_TIME VARCHAR2(240);
/** Unreserved Keyword Word IF **/
IF VARCHAR2(240);
/** Unreserved Keyword Word IGNORE **/
IGNORE VARCHAR2(240);
/** Unreserved Keyword Word IGNORE_OPTIM_EMBEDDED_HINTS **/
@ -674,7 +660,7 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
/** Unreserved Keyword Word INCLUDE_VERSION **/
INCLUDE_VERSION VARCHAR2(240);
/** Unreserved Keyword Word INCLUDING **/
-- INCLUDING VARCHAR2(240);
INCLUDING VARCHAR2(240);
/** Unreserved Keyword Word INCREMENT **/
INCREMENT VARCHAR2(240);
/** Unreserved Keyword Word INCREMENTAL **/
@ -1258,7 +1244,7 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
/** Unreserved Keyword Word ONLINE **/
ONLINE VARCHAR2(240);
/** Unreserved Keyword Word ONLY **/
-- ONLY VARCHAR2(240);
ONLY VARCHAR2(240);
/** Unreserved Keyword Word OPAQUE **/
OPAQUE VARCHAR2(240);
/** Unreserved Keyword Word OPAQUE_TRANSFORM **/
@ -1433,8 +1419,6 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
PRIVILEGE VARCHAR2(240);
/** Unreserved Keyword Word PRIVILEGES **/
PRIVILEGES VARCHAR2(240);
/** Unreserved Keyword Word PROCEDURE **/
--SRT PROCEDURE VARCHAR2(240);
/** Unreserved Keyword Word PROFILE **/
PROFILE VARCHAR2(240);
/** Unreserved Keyword Word PROGRAM **/
@ -1520,7 +1504,7 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
/** Unreserved Keyword Word REFERENCES **/
REFERENCES VARCHAR2(240);
/** Unreserved Keyword Word REFERENCING **/
--REFERENCING VARCHAR2(240);
REFERENCING VARCHAR2(240);
/** Unreserved Keyword Word REFRESH **/
REFRESH VARCHAR2(240);
/** Unreserved Keyword Word REGEXP_LIKE **/
@ -1737,8 +1721,6 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
SPLIT VARCHAR2(240);
/** Unreserved Keyword Word SPREADSHEET **/
SPREADSHEET VARCHAR2(240);
/** Unreserved Keyword Word SQL **/
SQL VARCHAR2(240);
/** Unreserved Keyword Word SQL_TRACE **/
SQL_TRACE VARCHAR2(240);
/** Unreserved Keyword Word SQLLDR **/
@ -2037,8 +2019,6 @@ CREATE OR REPLACE PACKAGE pkg_fields AS
WALLET VARCHAR2(240);
/** Unreserved Keyword Word WELLFORMED **/
WELLFORMED VARCHAR2(240);
/** Unreserved Keyword Word WHEN **/
--SRT WHEN VARCHAR2(240);
/** Unreserved Keyword Word WHENEVER **/
WHENEVER VARCHAR2(240);
/** Unreserved Keyword Word WHITESPACE **/