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
?
Ответы
Ответ 1
Вероятно, вы столкнулись с этим изменением в PostgreSQL 9.2 (цитируя примечания к выпуску здесь):
В CREATE больше не требуются строчные имена процедурных языков ФУНКЦИЯ (Роберт Хаас)
В то время как идентификаторы без кавычек все еще находятся внизу, строки и цитируемые идентификаторы уже не принудительно сбрасываются. Так, например CREATE FUNCTION... ЯЗЫК 'C' больше не будет работать; Это должно быть пишется 'c', или лучше опускать кавычки.
Он также отражен в руководстве для CREATE FUNCTION
lang_name
Название языка, в котором реализована функция. Может быть SQL
, C
, internal
или имя пользовательской процедурной язык. Для обратной совместимости имя может быть заключено в одиночные кавычки.
Цитата из названия языка была обескуражена, по крайней мере, с версии 7.3 (может быть, дольше), но старые habbits, очевидно, умирают, очевидно.
Вам нужно будет удалить кавычки вокруг C
, прибывающие по адресу: LANGUAGE c
.
Кажется, что Джо Конвей не получил сообщение, а PL/R
(поэтому) не готов к PostgreSQL 9.2, судя по странице .
Отзывы от Джо Конвей
Джо Конвей оставил ответ, который был удален, потому что это должен быть комментарий. Я вставляю его здесь для широкой публики, который не может видеть удаленные ответы:
Я получил сообщение, просто не успел сделать новую публикацию PL/R. Ищите его к декабрю, но в то же время ручное обходное решение отмеченное выше, довольно просто.
Ответ 2
У меня была аналогичная проблема с pg_collkey. Я считаю, что ваша ситуация может иметь такое же решение. Вот что я сделал: там файл .sql в вашем каталоге расширений postgres, который сообщает 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 для имени расширения.