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