ошибка создания типа

ZeroL
Дата: 06.05.2015 16:28:28
PostgreSQL 8.4

--------------- SQL ---------------

CREATE TYPE public.base_type1 (
INPUT = array_in,
OUTPUT = array_out,
INTERNALLENGTH = VARIABLE,
DELIMITER = ',',
SEND = anyarray_send,
RECEIVE = array_recv,
ALIGNMENT = double,
STORAGE = EXTENDED
);


-----СООБЩЕНИЕ ОБ ОШИБКЕ-----

ERROR: function array_out(base_type1) does not exist
p2.
Дата: 06.05.2015 18:39:43
Ищут пожарные, ыщет милиция,
Ищут фотографы в нашей столице,
Ищут два часа, но не могут найти,
Как сообщение то перевести.

(c) Скуфеу Ензу
ZeroL
Дата: 07.05.2015 10:38:37
Что делал:

1. Создаю дамп на текущем сервере командой:

pg_dump -Fc -c -U voip naumendb > /opt/postgres/naudb01.dump

2. Восстанавливаю на целевом сервере командой:
# su - postgres -c "pg_restore -Fc -c -d naumendb /var/lib/pgsql/8.4/backups/naudb01.dump"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 622; 1247 17259 TYPE _V_ALL_OPERATOR_CALLS voip
pg_restore: [archiver (db)] could not execute query: ERROR: type "public._V_ALL_OPERATOR_CALLS" does not exist
Command was: DROP TYPE public."_V_ALL_OPERATOR_CALLS" CASCADE;

pg_restore: [archiver (db)] could not execute query: ERROR: argument of element must be a type name
Command was: CREATE TYPE "_V_ALL_OPERATOR_CALLS" (
INTERNALLENGTH = variable,
INPUT = array_in,
OUTPUT = array_out,
RECEI...
pg_restore: [archiver (db)] could not execute query: ERROR: type "public._V_ALL_OPERATOR_CALLS" does not exist
Command was: ALTER TYPE public."_V_ALL_OPERATOR_CALLS" OWNER TO voip;
ZeroL
Дата: 07.05.2015 10:48:15
функция array_out есть в pg_catalog
ZeroL
Дата: 08.05.2015 12:10:20
Но не могу понять, почему при создании типа она не видна.
PgSQLAnonymous
Дата: 08.05.2015 13:07:21
ZeroL
Но не могу понять, почему при создании типа она не видна.

1. Она точно есть в целевой базе?
2. У неё точно в целевой базе тип аргумента base_type1 (и если да, то как это Вам удалось, кстати)?
Victor Nevsky
Дата: 08.05.2015 13:12:42
ZeroL, предположу - вы даете огрызки логов ...
create language plpgsql, в 8.4, по умолчанию не ставится ...
qwwq
Дата: 08.05.2015 13:27:43
ZeroL
функция array_out есть в pg_catalog


покажЫте вывод

SELECT * FROM information_schema.routines  WHERE routine_name = 'array_out'

в обеих базах.

// а дальше, если всё путём, будем ковыряться в дефолтных кастах, которые сами не переносятся, Максим как-то описывал технику
ikonst
Дата: 08.05.2015 14:54:51
PgSQLAnonymous
ZeroL
Но не могу понять, почему при создании типа она не видна.

1. Она точно есть в целевой базе?
2. У неё точно в целевой базе тип аргумента base_type1 (и если да, то как это Вам удалось, кстати)?


1. Ага, есть. Проверяли: select pg_catalog.array_out('{"a","b"}'::varchar[])::varchar;
2. Да, так и есть. function array_out("_V_ALL_OPERATOR_CALLS") - такой нет, а array_out(pg_catalog.anyarray) - есть. Но она нам не нужна.

Нашли такой тезис:
7.3 is stricter about the declarations of datatype I/O functions than
prior releases were. Since array_out is declared to take anyarray,
not int4array, the above fails.
You could hack your way to a working datatype by creating extra pg_proc
entries for array_in/_out:
create function int4array_in(cstring) returns int4array
as 'array_in' language internal strict immutable;
create function int4array_out(int4array) returns cstring
as 'array_out' language internal strict immutable;

Но функции-обертки сделать не получилось. Далее научные исследования застопорились, подскажите, в какую сторону копать?

PS Дамп был сделан из 8.4.13, а заливается в 8.4.22.
ikonst
Дата: 08.05.2015 14:56:47
Victor Nevsky
ZeroL, предположу - вы даете огрызки логов ...
create language plpgsql, в 8.4, по умолчанию не ставится ...

Zerol рядом, поэтому пишу от его имени.
Я не спец в PG, но боюсь, что это ни при чем. Насколько я смог нарыть, проблема в ужесточении требований к декларированию типов.