Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[plsql] Improve XML by adding the NAME of the SAVEPOINT statement #3710

Open
hgodinez89 opened this issue Dec 29, 2021 · 0 comments
Open

[plsql] Improve XML by adding the NAME of the SAVEPOINT statement #3710

hgodinez89 opened this issue Dec 29, 2021 · 0 comments
Labels
an:enhancement An improvement on existing features / rules

Comments

@hgodinez89
Copy link

Is your feature request related to a problem? Please describe.

It would be very useful to get the name of the savepoints, either savepoint declaration or rollback statements, inside of the PLSQL code. Currently, PMD don't parse this information as part of the XML.

Describe the solution you'd like

Parsing the name of the savepoints in PMD XML.

Describe alternatives you've considered

The only alternative may be to include the name of the savepoint in the XML generated by PMD.

Additional context

This is an example of a stored procedure. It has several definitions of savepoints in PLSQL code:

CREATE OR REPLACE PROCEDURE EXAMPLE_PROCEDURE IS
BEGIN
   --
   SAVEPOINT SP_EXAMPLE_1;
   --
   BEGIN
      --
      INSERT INTO EXAMPLE_TABLE
         (id_column, description_column)
      VALUES
         (1, 'Example value - 1');
      --
      UPDATE EXAMPLE_TABLE
         SET description_column = 'Example value'
       WHERE id_column = 1;
      --
   EXCEPTION
      WHEN OTHERS THEN
         ROLLBACK TO SP_EXAMPLE_1;
         RETURN;
   END;
   --
   SAVEPOINT SP_EXAMPLE_2;
   --
   BEGIN
      --
      INSERT INTO EXAMPLE_TABLE
         (id_column, description_column)
      VALUES
         (2, 'Example value');
      --
   EXCEPTION
      WHEN OTHERS THEN
         ROLLBACK TO SP_EXAMPLE_2;
         RETURN;
   END;
   --
EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK TO SP_EXAMPLE_1;
END EXAMPLE_PROCEDURE;

This is the current XML generated by PMD (It doesn't include SAVEPOINT information):

<?xml version='1.0' encoding='UTF-8'?>
<ProgramUnit CanonicalImage='' Image='' MethodName='EXAMPLE_PROCEDURE' Name='EXAMPLE_PROCEDURE' ObjectName=''>
    <MethodDeclarator CanonicalImage='EXAMPLE_PROCEDURE' Image='EXAMPLE_PROCEDURE' ParameterCount='1'>
        <ObjectNameDeclaration CanonicalImage='EXAMPLE_PROCEDURE' Image='EXAMPLE_PROCEDURE'>
            <ID CanonicalImage='EXAMPLE_PROCEDURE' Image='EXAMPLE_PROCEDURE' />
        </ObjectNameDeclaration>
    </MethodDeclarator>
    <DeclarativeSection CanonicalImage='' Image='' />
    <Statement CanonicalImage='' Image=''>
        <UnlabelledStatement CanonicalImage='' Image=''>
            <SqlStatement CanonicalImage='' Image='' Type='SAVEPOINT'>
                <Skip2NextTerminator CanonicalImage='' Image='' />
            </SqlStatement>
        </UnlabelledStatement>
    </Statement>
    <Statement CanonicalImage='' Image=''>
        <UnlabelledStatement CanonicalImage='' Image=''>
            <Block CanonicalImage='' Image=''>
                <Statement CanonicalImage='' Image=''>
                    <UnlabelledStatement CanonicalImage='' Image=''>
                        <InsertStatement CanonicalImage='' Image=''>
                            <SingleTableInsert CanonicalImage='' Image=''>
                                <InsertIntoClause CanonicalImage='' Image=''>
                                    <DMLTableExpressionClause CanonicalImage='' Image=''>
                                        <TableName CanonicalImage='EXAMPLE_TABLE' Image='EXAMPLE_TABLE'>
                                            <ID CanonicalImage='EXAMPLE_TABLE' Image='EXAMPLE_TABLE' />
                                        </TableName>
                                    </DMLTableExpressionClause>
                                    <Column CanonicalImage='ID_COLUMN' Image='id_column'>
                                        <ID CanonicalImage='ID_COLUMN' Image='id_column' />
                                    </Column>
                                    <Column CanonicalImage='DESCRIPTION_COLUMN' Image='description_column'>
                                        <ID CanonicalImage='DESCRIPTION_COLUMN' Image='description_column' />
                                    </Column>
                                </InsertIntoClause>
                                <ValuesClause CanonicalImage='' Image=''>
                                    <Expression CanonicalImage='1' Image='1'>
                                        <PrimaryPrefix CanonicalImage='1' Image='1' SelfModifier='false'>
                                            <Literal CanonicalImage='1' Image='1'>
                                                <NumericLiteral CanonicalImage='1' Image='1' />
                                            </Literal>
                                        </PrimaryPrefix>
                                    </Expression>
                                    <Expression CanonicalImage='&apos;EXAMPLE VALUE - 1&apos;' Image='&apos;Example value - 1&apos;'>
                                        <PrimaryPrefix CanonicalImage='&apos;EXAMPLE VALUE - 1&apos;' Image='&apos;Example value - 1&apos;' SelfModifier='false'>
                                            <Literal CanonicalImage='&apos;EXAMPLE VALUE - 1&apos;' Image='&apos;Example value - 1&apos;'>
                                                <StringLiteral CanonicalImage='&apos;EXAMPLE VALUE - 1&apos;' Image='&apos;Example value - 1&apos;' String='Example value - 1' />
                                            </Literal>
                                        </PrimaryPrefix>
                                    </Expression>
                                </ValuesClause>
                            </SingleTableInsert>
                        </InsertStatement>
                    </UnlabelledStatement>
                </Statement>
                <Statement CanonicalImage='' Image=''>
                    <UnlabelledStatement CanonicalImage='' Image=''>
                        <UpdateStatement CanonicalImage='' Image=''>
                            <DMLTableExpressionClause CanonicalImage='' Image=''>
                                <TableName CanonicalImage='EXAMPLE_TABLE' Image='EXAMPLE_TABLE'>
                                    <ID CanonicalImage='EXAMPLE_TABLE' Image='EXAMPLE_TABLE' />
                                </TableName>
                            </DMLTableExpressionClause>
                            <UpdateSetClause CanonicalImage='' Image=''>
                                <Column CanonicalImage='DESCRIPTION_COLUMN' Image='description_column'>
                                    <ID CanonicalImage='DESCRIPTION_COLUMN' Image='description_column' />
                                </Column>
                                <Expression CanonicalImage='&apos;EXAMPLE VALUE&apos;' Image='&apos;Example value&apos;'>
                                    <PrimaryPrefix CanonicalImage='&apos;EXAMPLE VALUE&apos;' Image='&apos;Example value&apos;' SelfModifier='false'>
                                        <Literal CanonicalImage='&apos;EXAMPLE VALUE&apos;' Image='&apos;Example value&apos;'>
                                            <StringLiteral CanonicalImage='&apos;EXAMPLE VALUE&apos;' Image='&apos;Example value&apos;' String='Example value' />
                                        </Literal>
                                    </PrimaryPrefix>
                                </Expression>
                            </UpdateSetClause>
                            <WhereClause CanonicalImage='' Image=''>
                                <Condition CanonicalImage='' Image=''>
                                    <CompoundCondition CanonicalImage='' Image='' Type=''>
                                        <ComparisonCondition CanonicalImage='' Image='' Operator='='>
                                            <SqlExpression CanonicalImage='ID_COLUMN' Image='id_column'>
                                                <PrimaryPrefix CanonicalImage='ID_COLUMN' Image='id_column' SelfModifier='false'>
                                                    <SimpleExpression CanonicalImage='ID_COLUMN' Image='id_column'>
                                                        <Column CanonicalImage='ID_COLUMN' Image='id_column'>
                                                            <ID CanonicalImage='ID_COLUMN' Image='id_column' />
                                                        </Column>
                                                    </SimpleExpression>
                                                </PrimaryPrefix>
                                            </SqlExpression>
                                            <SqlExpression CanonicalImage='1' Image='1'>
                                                <PrimaryPrefix CanonicalImage='1' Image='1' SelfModifier='false'>
                                                    <Literal CanonicalImage='1' Image='1'>
                                                        <NumericLiteral CanonicalImage='1' Image='1' />
                                                    </Literal>
                                                </PrimaryPrefix>
                                            </SqlExpression>
                                        </ComparisonCondition>
                                    </CompoundCondition>
                                </Condition>
                            </WhereClause>
                        </UpdateStatement>
                    </UnlabelledStatement>
                </Statement>
                <ExceptionHandler CanonicalImage='' Image=''>
                    <QualifiedName CanonicalImage='OTHERS' Image='OTHERS'>
                        <UnqualifiedID CanonicalImage='OTHERS' Image='OTHERS'>
                            <KEYWORD_UNRESERVED CanonicalImage='OTHERS' Image='OTHERS' />
                        </UnqualifiedID>
                    </QualifiedName>
                    <Statement CanonicalImage='' Image=''>
                        <UnlabelledStatement CanonicalImage='' Image=''>
                            <SqlStatement CanonicalImage='' Image='' Type='ROLLBACK'>
                                <Skip2NextTerminator CanonicalImage='' Image='' />
                            </SqlStatement>
                        </UnlabelledStatement>
                    </Statement>
                    <Statement CanonicalImage='' Image=''>
                        <UnlabelledStatement CanonicalImage='' Image=''>
                            <ReturnStatement CanonicalImage='' Image='' />
                        </UnlabelledStatement>
                    </Statement>
                </ExceptionHandler>
            </Block>
        </UnlabelledStatement>
    </Statement>
    <Statement CanonicalImage='' Image=''>
        <UnlabelledStatement CanonicalImage='' Image=''>
            <SqlStatement CanonicalImage='' Image='' Type='SAVEPOINT'>
                <Skip2NextTerminator CanonicalImage='' Image='' />
            </SqlStatement>
        </UnlabelledStatement>
    </Statement>
    <Statement CanonicalImage='' Image=''>
        <UnlabelledStatement CanonicalImage='' Image=''>
            <Block CanonicalImage='' Image=''>
                <Statement CanonicalImage='' Image=''>
                    <UnlabelledStatement CanonicalImage='' Image=''>
                        <InsertStatement CanonicalImage='' Image=''>
                            <SingleTableInsert CanonicalImage='' Image=''>
                                <InsertIntoClause CanonicalImage='' Image=''>
                                    <DMLTableExpressionClause CanonicalImage='' Image=''>
                                        <TableName CanonicalImage='EXAMPLE_TABLE' Image='EXAMPLE_TABLE'>
                                            <ID CanonicalImage='EXAMPLE_TABLE' Image='EXAMPLE_TABLE' />
                                        </TableName>
                                    </DMLTableExpressionClause>
                                    <Column CanonicalImage='ID_COLUMN' Image='id_column'>
                                        <ID CanonicalImage='ID_COLUMN' Image='id_column' />
                                    </Column>
                                    <Column CanonicalImage='DESCRIPTION_COLUMN' Image='description_column'>
                                        <ID CanonicalImage='DESCRIPTION_COLUMN' Image='description_column' />
                                    </Column>
                                </InsertIntoClause>
                                <ValuesClause CanonicalImage='' Image=''>
                                    <Expression CanonicalImage='2' Image='2'>
                                        <PrimaryPrefix CanonicalImage='2' Image='2' SelfModifier='false'>
                                            <Literal CanonicalImage='2' Image='2'>
                                                <NumericLiteral CanonicalImage='2' Image='2' />
                                            </Literal>
                                        </PrimaryPrefix>
                                    </Expression>
                                    <Expression CanonicalImage='&apos;EXAMPLE VALUE&apos;' Image='&apos;Example value&apos;'>
                                        <PrimaryPrefix CanonicalImage='&apos;EXAMPLE VALUE&apos;' Image='&apos;Example value&apos;' SelfModifier='false'>
                                            <Literal CanonicalImage='&apos;EXAMPLE VALUE&apos;' Image='&apos;Example value&apos;'>
                                                <StringLiteral CanonicalImage='&apos;EXAMPLE VALUE&apos;' Image='&apos;Example value&apos;' String='Example value' />
                                            </Literal>
                                        </PrimaryPrefix>
                                    </Expression>
                                </ValuesClause>
                            </SingleTableInsert>
                        </InsertStatement>
                    </UnlabelledStatement>
                </Statement>
                <ExceptionHandler CanonicalImage='' Image=''>
                    <QualifiedName CanonicalImage='OTHERS' Image='OTHERS'>
                        <UnqualifiedID CanonicalImage='OTHERS' Image='OTHERS'>
                            <KEYWORD_UNRESERVED CanonicalImage='OTHERS' Image='OTHERS' />
                        </UnqualifiedID>
                    </QualifiedName>
                    <Statement CanonicalImage='' Image=''>
                        <UnlabelledStatement CanonicalImage='' Image=''>
                            <SqlStatement CanonicalImage='' Image='' Type='ROLLBACK'>
                                <Skip2NextTerminator CanonicalImage='' Image='' />
                            </SqlStatement>
                        </UnlabelledStatement>
                    </Statement>
                    <Statement CanonicalImage='' Image=''>
                        <UnlabelledStatement CanonicalImage='' Image=''>
                            <ReturnStatement CanonicalImage='' Image='' />
                        </UnlabelledStatement>
                    </Statement>
                </ExceptionHandler>
            </Block>
        </UnlabelledStatement>
    </Statement>
    <ExceptionHandler CanonicalImage='' Image=''>
        <QualifiedName CanonicalImage='OTHERS' Image='OTHERS'>
            <UnqualifiedID CanonicalImage='OTHERS' Image='OTHERS'>
                <KEYWORD_UNRESERVED CanonicalImage='OTHERS' Image='OTHERS' />
            </UnqualifiedID>
        </QualifiedName>
        <Statement CanonicalImage='' Image=''>
            <UnlabelledStatement CanonicalImage='' Image=''>
                <SqlStatement CanonicalImage='' Image='' Type='ROLLBACK'>
                    <Skip2NextTerminator CanonicalImage='' Image='' />
                </SqlStatement>
            </UnlabelledStatement>
        </Statement>
    </ExceptionHandler>
    <ID CanonicalImage='EXAMPLE_PROCEDURE' Image='EXAMPLE_PROCEDURE' />
</ProgramUnit>

Please, pay attention to the following XML sections:

Declaration of savepoints

<Statement CanonicalImage='' Image=''>
    <UnlabelledStatement CanonicalImage='' Image=''>
        <SqlStatement CanonicalImage='' Image='' Type='SAVEPOINT'>
            <Skip2NextTerminator CanonicalImage='' Image='' />
        </SqlStatement>
    </UnlabelledStatement>
</Statement>

Rollback to a specific savepoint

<Statement CanonicalImage='' Image=''>
    <UnlabelledStatement CanonicalImage='' Image=''>
        <SqlStatement CanonicalImage='' Image='' Type='ROLLBACK'>
            <Skip2NextTerminator CanonicalImage='' Image='' />
        </SqlStatement>
    </UnlabelledStatement>
</Statement>
@hgodinez89 hgodinez89 added the an:enhancement An improvement on existing features / rules label Dec 29, 2021
@hgodinez89 hgodinez89 changed the title [plsql] Improve XML by adding NAME of the SAVEPOINT statement [plsql] Improve XML by adding the NAME of the SAVEPOINT statement Dec 29, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
an:enhancement An improvement on existing features / rules
Projects
None yet
Development

No branches or pull requests

1 participant