PostgreSQL процедурный язык "C" не найден
Я пытаюсь использовать процедурный язык PL/R в базе данных PostgreSQL 9.2. Я установил plr
язык, и я пытаюсь добавить его в базу данных. Когда я запускаю команду CREATE EXTENSION plr;
Я получаю следующую ошибку:
ERROR: language "C" does not exist
STATEMENT: CREATE EXTENSION plr;
ERROR: language "C" does not exist
Когда я перечисляю доступные языки в базе данных с select * from pg_language;
я получил
lanname | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl
----------+----------+---------+--------------+---------------+-----------+--------------+--------
internal | 10 | f | f | 0 | 0 | 2246 |
c | 10 | f | f | 0 | 0 | 2247 |
sql | 10 | f | t | 0 | 0 | 2248 |
plpgsql | 10 | t | t | 12514 | 12515 | 12516 |
(4 rows)
Так что есть язык c
но это не прописными буквами (не уверен, если это имеет значение).
Мне интересно, почему plr
расширение не находит C
процедурный язык?
2 ответа
Вы, вероятно, сталкиваетесь с этим изменением в PostgreSQL 9.2 (цитируя заметки о выпуске здесь):
Больше не нужно принудительно использовать строчные имена процедурных языков в CREATE FUNCTION (Роберт Хаас)
Хотя идентификаторы языка без кавычек по-прежнему в нижнем регистре, строки и идентификаторы в кавычках больше не приводятся к принудительному падежу. Так, например, CREATE FUNCTION ... LANGUAGE 'C' больше не будет работать; оно должно быть написано "с", или лучше опустить кавычки.
Это также отражено в руководстве по CREATE FUNCTION
lang_name
Название языка, на котором реализована функция. Может быть
SQL
,C
,internal
или имя пользовательского процедурного языка. Для обратной совместимости имя может быть заключено в одинарные кавычки.
Цитировать название языка не рекомендуется по крайней мере с версии 7.3 (возможно, дольше), но старые привычки умирают, очевидно. Удаление цитат вокруг 'C'
решает проблему, придя к: LANGUAGE c
или же LANGUAGE C
,
PL/R
не был готов к PostgreSQL 9.2 в этом отношении, судя по странице проекта.
Отзыв от Джо Конвея
Джо Конвей оставил удаленный ответ, потому что это должен быть комментарий. Я вставляю это здесь для широкой публики, которая не может видеть удаленные ответы:
Я получил сообщение, просто не было времени, чтобы сделать новый релиз PL/R. Ищите его к декабрю, но пока что ручной обходной путь, отмеченный выше, довольно прост.
У меня была похожая проблема с pg_collkey. Я считаю, что ваша ситуация может иметь то же решение. Вот что я сделал: в вашем каталоге расширений postgres есть файл.sql, который сообщает postgres, как установить расширение. В моем случае это называется pg_collkey -0.5.0.sql. Вам нужно будет изменить этот файл sql. В моей системе (с использованием Mac OS X и Homebrew) файл находится по адресу /usr/local/share/postgresql/extension/pg_collkey--0.5.0.sql). Вероятно, он содержит заглавную букву "C" в предложении LANGUAGE, например:
CREATE OR REPLACE FUNCTION collkey (text, text, bool, int4, bool) RETURNS bytea
LANGUAGE 'C' IMMUTABLE STRICT AS
'$libdir/collkey_icu.so',
'pgsqlext_collkey';
Измените его на строчную букву "c" и повторно запустите "CREATE EXTENSION pg_collkey;" команда в psql:
psql -c 'CREATE EXTENSION pg_collkey;' my_database_name
Конечно, вам нужно будет использовать "plr" вместо pg_collkey для имени расширения.