Физический смысл: если в запросе, приведенном ниже, идет обращение к таблице, отличной от SD, то нужно забраковать такой запрос.
select sd.id, (select sum(val) from SD where id=1) - (select sum(val) from SD where id=2) res
from SD, SD a, (select * from SD) ab, SD b left join (SD c join SD d on c.id=d.up) e on e.t=b.t
where (select max(id) from SD where id=a.up)=0 and sd.id=a.up and a.t=ab.id and b.up=a.t
order by sd.id, sd.up
Попытался описать своими словами последовательность поиска:
1) from или join
2.1) любое количество пробельных символов и скобок, затем слово не SD до следующего вхождения SELECT, ORDER, GROUP, JOIN
2.2) или любой текст или символы до первой "," до следующего вхождения SELECT, ORDER, GROUP, JOIN, после которой идет любое количество пробельных символов и скобок, затем слово не SD
1. combatlynx - 12 Апреля, 2016 - 17:40:54 - перейти к сообщению
2. combatlynx - 18 Апреля, 2016 - 12:50:53 - перейти к сообщению
Написал такое вот выражение:
CODE (htmlphp):
скопировать код в буфер обмена
скопировать код в буфер обмена
- (from|join)[\s(]*([\s(])\b(?!sd\b)|from[^,]*([\s(]*,[\s(]*\b(sd\b)|[\s(]*,[\s(]*\b(sd[\s]*[\w]*\b))*[\s(]*,[\s(]*\b(?!sd\b|select\b)
Натравливаю на запрос:
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- SELECT sd.id, res1 (SELECT sum(val) FROM SD WHERE id=1) - (SELECT sum(val) FROM SD WHERE id=2) res
- FROM SD, SD фф, sd 'sfg', sdf, (SELECT AS, cb FROM SD, sd, sdf) ab, SD b LEFT JOIN (SD c JOIN SD d ON c.id=d.up) e ON e.t=b.t
- WHERE (SELECT max(id) FROM SD WHERE id=a.up)=0 AND sd.id=a.up AND a.t=ab.id AND b.up=a.t
- ORDER BY sd.id, sd.up
Осталось решить две проблемы: кириллические буквы в именах таблиц и упоминание алиасов в апострофах/кавычках (см. скриншот): фрагменты "SD фф, sd 'sfg'" не дает обнаружить идущий за ним недопустимый "sdf"
[img]https://yadi.sk/i/x3WMjEmZr5pjQ[/img]