我试图通过复制xpath规则在sonar (plsql)中编写自定义规则。此规则的任务是标记“回滚到保存点”语句,其中缺少保存点语句。
对于2条保存点和3条回滚语句,AST (抽象语法树)如下所示:
<PROCEDURE_DEFINITION>
...
<SAVEPOINT>
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spA" />
<SEMICOLON tokenValue=";" />
</SAVEPOINT>
...
<SAVEPOINT>
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spB" />
<SEMICOLON tokenValue=";" />
</SAVEPOINT>
...
<ROLLBACK>
<IDENTIFIER tokenValue="ROLLBACK" />
<TO />
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spB" />
<SEMICOLON tokenValue=";" />
</ROLLBACK>
...
<ROLLBACK>
<IDENTIFIER tokenValue="ROLLBACK" />
<TO />
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spA" />
<SEMICOLON tokenValue=";" />
</ROLLBACK>
...
<ROLLBACK>
<IDENTIFIER tokenValue="ROLLBACK" />
<TO />
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spX" />
<SEMICOLON tokenValue=";" />
</ROLLBACK>
...
</PROCEDURE_DEFINITION> 我搜索标记最后回滚的XPath查询,因为保存点spX丢失了。但是这个xpath标记最后两个回滚。
//PROCEDURE_DEFINITION//ROLLBACK[
IDENTIFIER[
@tokenValue =
./ancestor::PROCEDURE_DEFINITION
//SAVEPOINT/IDENTIFIER[2]/@tokenValue
]
]有什么建议吗?
编辑:
我找到了一个次优的解决方案:
//PROCEDURE_DEFINITION//ROLLBACK
[
not(
./IDENTIFIER[3]/@tokenValue =
ancestor::PROCEDURE_DEFINITION//SAVEPOINT/IDENTIFIER[2]/@tokenValue
)
]PLSQL不区分大小写。但是,当我添加转换函数时,首先和最后一个回滚节点会被标记出来。我想所有回滚的名字都会和第一个保存点的名字一致?
发布于 2013-06-27 08:13:54
首先,根据您显示的AST,在我看来,这是您想要在XPath查询上运行的PL/SQL代码:
DECLARE
PROCEDURE foo AS
BEGIN
SAVEPOINT spA;
SAVEPOINT spB;
ROLLBACK spB; -- Compliant
ROLLBACK spA; -- Compliant
ROLLBACK spX; -- Non-Compliant
END;
BEGIN
NULL;
END;
/当我使用SSLR /SQL运行您的第一个XPath查询时,将选择回滚到'spB‘和'spA’,而不是选择'spX‘。
第二个XPath查询选择所有这些查询。
在我看来,您只想选择一个“spX”,因为没有相应的保存点。
对第一个查询的简单更改允许通过使用not()否定条件来反转所选节点:
//PROCEDURE_DEFINITION//ROLLBACK[
not(IDENTIFIER[
@tokenValue =
./ancestor::PROCEDURE_DEFINITION
//SAVEPOINT/IDENTIFIER[2]/@tokenValue
])
]但实际上我建议您删除查询的PROCEDURE_DEFINITION部分,因为保存点和ROLLBACK语句在函数或匿名块中也是有效的:
//ROLLBACK[not(IDENTIFIER[@tokenValue = //SAVEPOINT/IDENTIFIER[2]/@tokenValue])]https://stackoverflow.com/questions/17296618
复制相似问题