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 но это не прописными буквами (не уверен, что это имеет значение).

I интересно, почему

2 ответов


вы, вероятно, сталкиваетесь с этим изменением в PostgreSQL 9.2 (цитируя примечания к выпуску здесь):

больше не принудительно строчные имена процедурных языков в CREATE Функция (Роберт Хаас)

пока некотируемых язык еще маленькими буквами, строками и указанные идентификаторы больше не подвергаются принудительному понижению. Так, например СОЗДАТЬ ФУНКЦИЮ ... Язык "С" больше не будет работать; он должен быть пишется " c " или лучше опустите цитаты.

это также отражено в руководство CREATE FUNCTION

lang_name

имя языка, на котором реализована функция. Может быть SQL, C, internal, или имя определяемой пользователем процедуры язык. Для обратной совместимости имя может быть заключено в простые кавычки.

цитирование названия языка было обескуражено с тех пор, как версия 7.3 (возможно дольше), но старые привычки умирают с трудом, очевидно. Убрав кавычки 'C' устраняет проблему, прибывая в:LANGUAGE c или LANGUAGE C.

PL/R не был готов к PostgreSQL 9.2 в этом отношении, судя по страница проекта.

обратная связь от Джо Конвея

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

я получил сообщение, просто не было времени, чтобы сделать новый выпуск PL/R. Ищите его к декабрю, но тем временем ручной обходной путь отмеченное выше довольно просто.


у меня была аналогичная проблема с 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 для имени расширения.