powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Серьёзная регрессия регулярных выражений в FB4.0
25 сообщений из 26, страница 1 из 2
Серьёзная регрессия регулярных выражений в FB4.0
    #39821716
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простой пример с регулярным выражением, используемым для проверки FQDN:
Код: plsql
1.
2.
3.
SELECT _ASCII 'localh' SIMILAR TO
    '([a-zA-Z0-9]{1,63}.|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9].)*([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]).?'
  FROM rdb$database

Если один символ ASCII проверяется около 49 наносекунд, то каждый следующий символ увеличивает время выполнения ВДЕСЯТЕРО. Так обработка строки из шести символов занимает уже около 4,9 секунд.
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821722
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда пишут о регрессии, то обычно что-то с чем-то сравнивают
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821738
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, причём, если короткие последовательности символов ASCII разделены точками, то скорость обработки всего выражения значительно быстрее. К примеру:
Код: plsql
1.
2.
3.
SELECT _ASCII 'local.mat.ego.host' SIMILAR TO
    '([a-zA-Z0-9]{1,63}.|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9].)*([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]).{0,1}'
  FROM rdb$database

выполняется около 47мс, тогда как:
Код: plsql
1.
2.
3.
SELECT _ASCII 'local.mat.ego.host' SIMILAR TO
    '([a-zA-Z0-9]{1,63}.|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9].)*([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]).{0,1}'
  FROM rdb$database

выполняется уже около 470мс
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821740
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон! В последнем операторе должно быть _ASCII 'local'
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821758
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорость обработки строки с разделёнными точками именами приблизительно равна скорости обработки самого короткого имени между точками.
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821773
bsv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С регулярными вфражениями в FB все очень плохо. http://tracker.firebirdsql.org/browse/CORE-5854
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821775
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

ты ответ Влада то прочитал? Регрессия по сравнению с чем? Где сравнительные тесты 2.5, 3.0?
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821779
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Перевожу: регрессия ожиданий. Думал что будет "ооо!", а оно "нуууу".
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821780
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисrdb_dev,

ты ответ Влада то прочитал? Регрессия по сравнению с чем? Где сравнительные тесты 2.5, 3.0?На 2.5, вроде бы, такого не замечал. Даже если сравнивать скорость обработки строк: 'local.host', 'local' и 'hostname.domain.my' то последнее выполнится быстрее всего, а следовательно, регрессия налицо даже без сравнения с другими версиями.
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821782
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryСимонов Денис,

Перевожу: регрессия ожиданий. Думал что будет "ооо!", а оно "нуууу".Не так! Оно "ой-йо-о-о-о-о-о..."
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821786
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bsv9С регулярными вфражениями в FB все очень плохо. http://tracker.firebirdsql.org/browse/CORE-5854 Прям всё ? Или ВСЁ ?! :)
И зачем постить ссылку на тикет, закрытый как дубликат ?
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821795
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devрегрессия налицоНепонимание употребляемых слов - вот что на лице.

PS проблему с быстродействием SIMILAR TO в некоторых случаях никто не отрицает
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821806
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladPS проблему с быстродействием SIMILAR TO в некоторых случаях никто не отрицаетЯсно! Чо делать-то? :)
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821811
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devЧо делать-то? :)

Вариант 1: Открыть исходники, исправить, запуллить реквест.
Вариант 2: Забыть о существовании регэкспов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821817
bsv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladИ зачем постить ссылку на тикет, закрытый как дубликат ?

В оригинальном тикете слишком много кода. В этом тикете, по моему, понятнее показана проблема - на примере одного регекспа. Проблема с регулярными выражениями началась в FB 3. И до сих пор не решена. Не аккуратно написанное выражение может очень-очень надолго завесить серевер со 100% утилизацией процессора. Например, вот это:
Код: sql
1.
select iif ('abcde.abc' similar to '[[:ALPHA:].]{1,60}.ab' ,1,0) is_similar from rdb$database 


В 2.5 таких проблем не было.
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821821
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devhvladPS проблему с быстродействием SIMILAR TO в некоторых случаях никто не отрицаетЯсно! Чо делать-то? :)1. Пинать трекер
2. Взять готовую udf, правда там скорее всего будет POSIX синтаксис regexp'ов, а он отличается от SQL варианта
3. Улучшить реализацию в FB, там нет ничего военного и в инете куча кода для regexp'ов.
Единственная сложность - отличие POSIX и SQL синтаксиса
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821822
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bsv9Проблема с регулярными выражениями началась в FB 3...
...В 2.5 таких проблем не былоОчень сомневаюсь. Я не помню, чтобы в 3-ке трогали этот код.
Если же это действительно так, то имеет смысл опять же пинать трекер.
Но с аргументами.
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39821828
bsv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladОчень сомневаюсь. Я не помню, чтобы в 3-ке трогали этот код.

Хм, дейстивтельно, FB 2.5 так же глухо зависает.
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39822085
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devрегрессия налицо даже без сравнения с другими версиями.Записал в блокнотик.
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39822094
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery, а определения "линейная зависимость" и "линейная функция" в твоём блокнотике уж есть? 😏
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39822109
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Для таких банальностей и гугль сойдёт.
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39823914
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё немного поисследовал проблему... Оказалось, что "SIMILAR TO" очень капризен не только к сложным выражениям, но и к символам, отсутствующим в лидирующих вариациях паттернов, указанных в выражении через "|". Так например простое выражение:
Код: plaintext
'([a-zA-Z0-9]{1,63})|([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])'
на строку 'local-host' будет зверски тупить, тогда как:
Код: plaintext
'([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])|([a-zA-Z0-9]{1,63})'
отработает ожидаемо быстро. Если же вовсе встретиться незнакомый паттернам символ в строке из более чем восьми символов, можно смело килять процесс сервера, так как ФБ затупит на сотни, а то и тысячи секунд и его невозможно будет остановить штатно через запуск/остановку служб.

В результате, приходится не только разбивать строку на удобоваримые части, но и перед началом их проверки исключить возможность появления незнакомых паттернам символов. Для проверки корректности строки с FQDN написал функцию (может ещё кому пригодится):
Национальные имена доменов не поддерживаются
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
SET TERM ^;
CREATE OR ALTER FUNCTION FQDN__CHECK
  (
    fqdName ASCII_STRING DEFAULT NULL
  )
  RETURNS BOOLEAN
AS
  DECLARE VARIABLE dot      INT64;
  DECLARE VARIABLE dotPart  ASCII_STRING;
  DECLARE VARIABLE dotTail  ASCII_STRING DEFAULT NULL;
  DECLARE VARIABLE regEx    ASCII_STRING
    DEFAULT '([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])|([a-zA-Z0-9]{1,63})'
BEGIN
  IF (:fqdName IS NULL) THEN RETURN NULL;
  IF (NOT :fqdName SIMILAR TO '[a-zA-Z0-9-.]{1,255}') THEN RETURN FALSE;

  dotTail = fqdName;
  WHILE (:dotTail IS NOT NULL) DO
    BEGIN
      dot = Position('.', dotTail);
      IF (:dot = 0) THEN
        BEGIN
          dotPart = dotTail;
          dotTail = NULL;
        END
      ELSE
        BEGIN
          dotPart = Left(dotTail, dot - 1);
          IF (Char_Length(:dotTail) = :dot) THEN
            dotTail = NULL;
          ELSE
            dotTail = Substring(dotTail FROM dot + 1);
        END
      IF (NOT :dotPart SIMILAR TO :regEx) THEN RETURN FALSE;
    END
  RETURN TRUE;
END^
SET TERM ;^


...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39823984
Фотография Tonal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже проще написать UDF/R-ку в коей использовать любую удобную реализацию регулярок.
Например из ICU , которая и так используется сервером. :)

Собственно в коде сервера можно было бы именно её и вызвать, предварительно странслировав синтаксис, если нужно. :)
...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39824007
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рано я обрадовался, что нашёл решение... Оказалось, что при экранировании неразрешённых символов, поток сервера вешается от неизвестного символа '+' даже на элементарнейшем паттерне:
Код: plaintext
'my-host.my-domain.org+.ru' SIMILAR TO '[-.a-zA-Z0-9]{1,255}'
Пришлось переписать функцию
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
SET TERM ^;
CREATE OR ALTER FUNCTION FQDN__CHECK
  (
    fqdName ASCII_STRING DEFAULT NULL
  )
  RETURNS BOOLEAN
AS
  DECLARE VARIABLE dot    INT64;
  DECLARE VARIABLE part   ASCII_STRING;
  DECLARE VARIABLE tail   ASCII_STRING DEFAULT NULL;
  DECLARE VARIABLE regEx  ASCII_STRING
    DEFAULT '([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])|([a-zA-Z0-9]{1,63})';
  DECLARE VARIABLE permitted CHAR(38) CHARACTER SET ASCII
    DEFAULT 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.';
BEGIN
  IF (:fqdName IS NULL) THEN RETURN NULL;
  tail = Upper(fqdName);
  dot = Char_Length(tail);
  IF (:dot = 0) THEN RETURN FALSE;
  WHILE (:dot != 0) DO
    IF (Position(Substring(:tail FROM :dot FOR 1), :permitted) = 0) THEN
      RETURN FALSE;
    ELSE
      dot = dot - 1;

  WHILE (:tail IS NOT NULL) DO
    BEGIN
      dot = Position('.', tail);
      IF (:dot = 0) THEN
        BEGIN
          part = tail;
          tail = NULL;
        END
      ELSE
        BEGIN
          part = Left(tail, dot - 1);
          IF (Char_Length(:tail) = :dot) THEN
            tail = NULL;
          ELSE
            tail = Substring(tail FROM dot + 1);
        END
      IF (NOT :part SIMILAR TO :regEx) THEN RETURN FALSE;
    END
  RETURN TRUE;
END^
SET TERM ;^

...
Рейтинг: 0 / 0
Серьёзная регрессия регулярных выражений в FB4.0
    #39824020
Фотография Tonal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если смотреть по коду (SimilarToMatcher.h), то конструкция x{n,m} преобразуется в x{n}(x?){m-n} .
Что вызывает комбинаторный взрыв при неудаче.
Так что просто не пользуйся конструкцией повторения.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Серьёзная регрессия регулярных выражений в FB4.0
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]