我们的一条规则是所有database joins have to be ANSI-style。作为构建过程的一部分,我想扫描所有针对违规行为的源代码控制联接。
我得到了一个部分答案,我将在下面发布,但我确定它遗漏了一些东西并且必须有一个更好的答案。
以下是一个非全面的示例列表
应匹配:
SELECT *
FROM cats, owners, dogs
WHERE cats.owner = onwers.id and owners.id += dogs.owner;
SELECT * FROM cats c, owners o WHERE c.owner = o.id;
不应该匹配:
SELECT *
FROM owners left outer join cats on (owners.id = cats.owner);
SELECT *
FROM owners inner join cats on (cats.owners = GetOnersOfTabbies(param1, parm2))
答案 0 :(得分:2)
好吧,我走了:
FROM [\s\S]*?,[\s\S]*?WHERE
即使在多行查询中,也会在,
和FROM
子句之间匹配WHERE
。
[\s\S]*?
表示:将smallest possible match用于空格字符(包括换行符)和非空格字符;这也被称为“非贪婪模式”。
答案 1 :(得分:1)
这是我的正则表达式:
from\s+\w+(\s+)?(\w+)?,(\s+)?\w+
在我的正则表达式测试中,Ruben的回答对我不起作用。
\s == space character
\s+ == 1+ space character(s)
(\s+)? == Within the brackets is optional, reqires a "?" immediately after the ")"
\w == word character, alphanumeric
要抓住SELECT * FROM (cats c, owners o) WHERE c.owner = o.id;
,请使用:
from\s+(\()?\w+(\s+)?(\w+)?,(\s+)?\w+
您需要使用\
字符转义括号:
(\()? == '(' character
答案 2 :(得分:0)
这是我的尝试:
FROM (\s*\S+\s*(\w\s*)*,)+
应该从from子句中获取第一个逗号 - 这些是旧式连接所必需的。