Pull to refresh

Comments 18

У меня в PostgreSQL 9.2 не получается воспроизвести.
Версия: 9.2.3-1.pgdg60+1 (сборки для Debian Squeeze на pgapt.debian.net/).

postgres=# select 1 where 'x' ~ '(((((x)*)*)*)*)*';
 ?column? 
----------
        1
(1 row)

postgres=# 
У себя воспроизвел (имеются) только 9.1(виндовый) и 8.4.0 (дебиан) — оба подвержены,
про 9.2.3 узнал от друга, говорит стандартная сборка от плеск.

Может используется, какая-нибудь стандартная либа (уже пофиксена). Хотя не слышал про такое, да и баг новый совсем. Хм, странно…
Попробуйте увеличить порядок вложенности (например до 10 групп). Заранее благодарен.
Увеличил порядок вложенности до 10, не воспроизводится.
64 или 32?
А то тут подозрение на ошибку компилятора просыпается :)
Блин, пошел билдить под squeeze…
Просмотрел Release Notes. Следует присмотреться к следующим записям:

1. 9-1-3
Fix regular expression back-references with * attached (Tom Lane)

Rather than enforcing an exact string match, the code would effectively accept any string that satisfies the pattern sub-expression referenced by the back-reference symbol.

A similar problem still afflicts back-references that are embedded in a larger quantified expression, rather than being the immediate subject of the quantifier. This will be addressed in a future PostgreSQL release.

2. 9-1-5
Fix extraction of common prefixes from regular expressions (Tom Lane)

The code could get confused by quantified parenthesized subexpressions, such as ^(foo)?bar. This would lead to incorrect index optimization of searches for such patterns.

3. 9-2
Sync regular expression code with TCL 8.5.11 and improve internal processing (Tom Lane)
Пока компилится, смотрю исходники 9.2.3 — nfa участок, отвечающий ИМО за это безобразие, без изменения. Пошел мержить другие изменения в trunc тикля.
TCL 8.5 x86_64 (Windows 7) — баг воспроизводится.
Спасибо, буду знать. К счастью, в боевом проекте регулярки на основе пользовательского ввода не строятся.
Tcl 8.6 32 bit, свежескомпилированный VS10 Express, баг воспроизводится.
Postgresql 9.2.1 на винде не воспроизводится, уровень вложенности увеличивал.
TCL 8.5 64 бита, под «Мак» (он в стандартной поставке) — воспроизводится.
Люди, за что минусуем то: человек просто проверил и сообщил. Я то же не знаю, где еще используется это NFA решение. Чисто теоретически могло быть и в php.
9.1.8 на FreeBSD 8.3 amd64 — воспроизводится.
Рестарт зависшего процесса только жесткий — вместе со всем постгресом :(
Ждем фикса, а пока поставил простую проверку в местах где используется Regexp.
Sign up to leave a comment.

Articles