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 для имени расширения.

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