Ошибка использования FreeAdhocUDF с Firebird 3/4 в Debian 11

У нас проблемы с использованием библиотеки FreeAdhocUDF http://freeadhocudf.org с Firebird на Debian 11.

Немного основной информации:

  • Дебиан 11 64бит

  • uname -a говорит:

    Linux RMVM18 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21)
    x86_64 GNU/Linux
    

Firebird был установлен через apt с этими пакетами:

firebird3.0-common 3.0.7.33374.ds
firebird3.0-server 3.0.7.33374.ds
firebird3.0-server-core q3.0.7.33374.ds
firebird3.0-utils q3.0.7.33374.ds

а позже напрямую с помощью установочных пакетов с https://firebirdsql.org/en/firebird-3-0/#Linux_AMD64.

Наконец, мы попробовали версию 4 Firebird, но тоже безуспешно: https://github.com/FirebirdSQL/firebird/releases/download/v4.0.2/Firebird-4.0.2.2816-0.amd64.tar. гз

Сам Firebird отлично работает в обеих версиях. Только использование FreeAdhocUDF дает сбой.

Мы проверили зависимости библиотеки с помощью

ldd FreeAdhocUDF.so

успешно, результат был:

cd.1 (0x00007fff557da000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fae5a559000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fae5a384000)
libib_util.so => /lib/x86_64-linux-gnu/libib_util.so (0x00007fae5a37f000)
libicudataFAU.so.44 => /lib/x86_64-linux-gnu/libicudataFAU.so.44
(0x00007fae5933f000)
libicui18nFAU.so.44 => /lib/x86_64-linux-gnu/libicui18nFAU.so.44
(0x00007fae58f65000)
libicuucFAU.so.44 => /lib/x86_64-linux-gnu/libicuucFAU.so.44
(0x00007fae58c12000)
libfbclient.so.2 => /lib/x86_64-linux-gnu/libfbclient.so.2
(0x00007fae58a6e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fae5a8d3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0
(0x00007fae58a4c000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fae58a46000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fae58879000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fae5885f000)
libtommath.so.1 => /lib/x86_64-linux-gnu/libtommath.so.1
(0x00007fae5883d000)

Настройки в firebird.conf:

UdfAccess = Restrict (перепробовали несколько вариантов, включая Full)

Какой бы из описанных ниже вариантов мы ни пробовали, результат всегда был таким:

Select f_abs(-1) from rdb$database;
Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Use of UDF/BLOB-filter module at location FreeAdhocUDF is not
allowed by server configuration.
-------------------------------------------------------------------------------------------------------------
SQLCODE: -902
SQLSTATE: 28000
GDSCODE: 335544831

Что не так? Что еще мы можем попробовать?

Значение параметра буквально Restrict? Потому что в этом случае вы не указали разрешенные места для библиотек UDF, поэтому Firebird ничего не загрузит.

Mark Rotteveel 20.04.2023 13:27

Кроме того, зачем использовать UDF для F_ABS, который, как я полагаю, получает абсолютное значение, когда в Firebird он встроен как ABS?

Mark Rotteveel 20.04.2023 13:29

Извините, мы использовали не только Restrict, а в сочетании с несколькими путями, относительными, абсолютными, и в конце мы старались Full, чтобы точно не попасть туда.

Uwe 21.04.2023 11:27

Каково определение F_ABS, потому что тогда оно предполагает, что определение неверно (например, не может найти нужную библиотеку).

Mark Rotteveel 21.04.2023 11:29

Если бы это был только F_ABS, я бы согласился, но мы должны использовать БОЛЬШОЕ количество кода, который интенсивно использует несколько функций FreeAdhoc :-(

Uwe 21.04.2023 11:29

ОК, но если это выдает ошибку, даже когда у вас есть UdfAccess = Full, то это может означать, что определение неверное, и библиотека не может быть загружена (хотя, если честно, то я бы ожидал ошибку "имя модуля или точка входа не удалось найти" вместо ошибки, которую вы показываете в своем вопросе). Поэтому может быть полезно иметь пример определения одной из UDF, которая не удалась.

Mark Rotteveel 21.04.2023 11:32

Вопрос новичка: я попытался указать, что тем временем мы нашли решение, и я сам очень ценю темы с намеком на то, что в конце темы есть решение. Поэтому я отредактировал заголовок, добавив «РЕШЕНО», но кто-то удалил это. Почему? Я уверен, что для этого есть причины, но как я могу добиться того, чтобы сигнализировать «мы нашли решение»? Я хочу научиться делать это правильно, я пытался связаться с пользователем редактирования, но также не нашел способа, поэтому я пытаюсь выяснить это здесь...

Uwe 22.04.2023 12:02

Вы отмечаете вопрос как решенный, принимая ответ (нажимая галочку перед этим ответом). Если ни один из текущих ответов не дает решения, опубликуйте свой собственный ответ с решением и примите его после тайм-аута (вы не можете сразу принять свой собственный ответ).

Mark Rotteveel 22.04.2023 12:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Текст ошибки: «Использование модуля UDF/BLOB-фильтра в расположении FreeAdhocUDF не разрешено конфигурацией сервера». Неудачная зависимость или пропущенная библиотека дадут вам ошибку «имя модуля или точка входа не могут быть найдены».

За значением "Restict" должен следовать список каталогов, в которых библиотеки UDF разрешены (и действительно ищутся). Простое «Ограничение» бессмысленно и, скорее всего, позволяет библиотекам UDF находиться только в корневом каталоге Firebird, что является плохой идеей.

Если вы установите для UdfAccess значение «полный», вы должны указать абсолютный путь к библиотеке в запросе «DECLARE FUNCTION».

Помните, что сервер Firebird (если он настроен как SuperServer или SuperClassic) необходимо перезапустить, чтобы отразить изменения в конфигурации.

Для детального исследования вы можете использовать утилиту dltrace, чтобы увидеть, откуда пытается загрузиться библиотека.

Я согласен - проблема не в неудачных включениях. "не разрешено"... но где конфигурация, запрещающая серверу использовать UDF? Извините, не очень хорошо описал... мы не использовали Restrict в одиночку, а использовали несколько вариантов, прямые пути, относительные, и в конце постарались Full не подвести там. Спасибо за подсказку относительно путей DECLARE! Мы попробуем это!

Uwe 21.04.2023 11:39

@Uwe Бьюсь об заклад, вы забыли перезапустить сервер Firebird после изменения firebird.conf.

user13964273 21.04.2023 13:49

мы перезагружались каждый раз после изменения .conf или файловой структуры/имен/прав с помощью перезапуска sysctl

Uwe 21.04.2023 14:36
Ответ принят как подходящий

Проблема заключалась в следующем: мы работали с символическими ссылками повсюду (обычная стратегия), но, в конце концов, нам пришлось явно копировать FreeAdhocUDF_FB2x_amd64.so в FreeAdhocUDF.so. Это решило проблему.

Дополнительная информация: мы использовали каталог /UDF/ в качестве местоположения для UDF и имели UdfAccess = Restrict /UDF в firebird.config (Firebird 4.)

Да, ссылки не работают с ограниченными местоположениями UDF, потому что технически библиотека находится вне разрешенного каталога, который сравнивается буквально.

user13964273 21.04.2023 23:48

Место было идентичным. И - исходный файл, и символическая ссылка - где в /UDF. КОПИЮ было разрешено связывать, а символическую ссылку - нет. В случае с несколькими специальными библиотечными файлами, такими как libicuucFAU.so.44, можно было использовать символическую ссылку. Собственно сам скрипт установки работал так. Так что нам было совершенно непонятно, что в ЭТОМ случае это должна быть копия. Мы узнали случайно, это была своего рода последняя догадка.

Uwe 22.04.2023 11:56

Другие вопросы по теме