Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Серьёзная регрессия регулярных выражений в FB4.0 / 25 сообщений из 26, страница 1 из 2
03.06.2019, 14:47
    #39821716
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
Простой пример с регулярным выражением, используемым для проверки 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
03.06.2019, 14:54
    #39821722
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
Когда пишут о регрессии, то обычно что-то с чем-то сравнивают
...
Рейтинг: 0 / 0
03.06.2019, 15:08
    #39821738
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
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
03.06.2019, 15:09
    #39821740
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
Пардон! В последнем операторе должно быть _ASCII 'local'
...
Рейтинг: 0 / 0
03.06.2019, 15:37
    #39821758
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
Скорость обработки строки с разделёнными точками именами приблизительно равна скорости обработки самого короткого имени между точками.
...
Рейтинг: 0 / 0
03.06.2019, 15:50
    #39821773
bsv9
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
С регулярными вфражениями в FB все очень плохо. http://tracker.firebirdsql.org/browse/CORE-5854
...
Рейтинг: 0 / 0
03.06.2019, 15:51
    #39821775
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
rdb_dev,

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

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

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

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

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

Вариант 1: Открыть исходники, исправить, запуллить реквест.
Вариант 2: Забыть о существовании регэкспов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.06.2019, 16:26
    #39821817
bsv9
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
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
03.06.2019, 16:29
    #39821821
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
rdb_devhvladPS проблему с быстродействием SIMILAR TO в некоторых случаях никто не отрицаетЯсно! Чо делать-то? :)1. Пинать трекер
2. Взять готовую udf, правда там скорее всего будет POSIX синтаксис regexp'ов, а он отличается от SQL варианта
3. Улучшить реализацию в FB, там нет ничего военного и в инете куча кода для regexp'ов.
Единственная сложность - отличие POSIX и SQL синтаксиса
...
Рейтинг: 0 / 0
03.06.2019, 16:30
    #39821822
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
bsv9Проблема с регулярными выражениями началась в FB 3...
...В 2.5 таких проблем не былоОчень сомневаюсь. Я не помню, чтобы в 3-ке трогали этот код.
Если же это действительно так, то имеет смысл опять же пинать трекер.
Но с аргументами.
...
Рейтинг: 0 / 0
03.06.2019, 16:39
    #39821828
bsv9
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
hvladОчень сомневаюсь. Я не помню, чтобы в 3-ке трогали этот код.

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

Для таких банальностей и гугль сойдёт.
...
Рейтинг: 0 / 0
07.06.2019, 11:20
    #39823914
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
Ещё немного поисследовал проблему... Оказалось, что "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
07.06.2019, 12:41
    #39823984
Tonal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
Похоже проще написать UDF/R-ку в коей использовать любую удобную реализацию регулярок.
Например из ICU , которая и так используется сервером. :)

Собственно в коде сервера можно было бы именно её и вызвать, предварительно странслировав синтаксис, если нужно. :)
...
Рейтинг: 0 / 0
07.06.2019, 13:17
    #39824007
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
Рано я обрадовался, что нашёл решение... Оказалось, что при экранировании неразрешённых символов, поток сервера вешается от неизвестного символа '+' даже на элементарнейшем паттерне:
Код: 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
07.06.2019, 13:50
    #39824020
Tonal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серьёзная регрессия регулярных выражений в FB4.0
Если смотреть по коду (SimilarToMatcher.h), то конструкция x{n,m} преобразуется в x{n}(x?){m-n} .
Что вызывает комбинаторный взрыв при неудаче.
Так что просто не пользуйся конструкцией повторения.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Серьёзная регрессия регулярных выражений в FB4.0 / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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