cache lookup error for shell type creation with incompatible output function (DDL deparsing bug)

Поиск
Список
Период
Сортировка
От Michael Paquier
Тема cache lookup error for shell type creation with incompatible output function (DDL deparsing bug)
Дата
Msg-id CAB7nPqRxuH+3g0SD2pOKQgJitjvCDaHQJ3PY0nMLsKuHZex+Kg@mail.gmail.com
обсуждение исходный текст
Ответы Re: cache lookup error for shell type creation with incompatible output function (DDL deparsing bug)  (Alvaro Herrera <alvherre@2ndquadrant.com>)
Список pgsql-hackers
Hi all,

I just bumped into the following problem in HEAD (1c41e2a):
=# create type my_array_float (INPUT = array_in, OUTPUT = array_out,
ELEMENT = float4, INTERNALLENGTH = 32);
ERROR:  XX000: cache lookup failed for type 0
LOCATION:  format_type_internal, format_type.c:135

First note that in ~9.4 the error message is correct:
=# create type my_array_float (INPUT = array_in, OUTPUT = array_out,
ELEMENT = float4, INTERNALLENGTH = 32);
ERROR:  42883: function array_out(my_array_float) does not exist
LOCATION:  findTypeOutputFunction, typecmds.c:1709

Now, the problem is caused by findTypeOutputFunction() in DefineType()
because process passes InvalidOid as type OID when creating a type
shell, root cause being a2e35b5 because of this:
+               address = TypeShellMake(typeName, typeNamespace, GetUserId());

The fix consists in being sure that typoid uses the OID of the type
shell created, aka the OID stored in adress.ObjectID. Attached is a
patch with a regression test checking for shell creation with
incompatible input/output functions (failure caused by output function
here though) able to check this code path.
Regards,
--
Michael

Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Amit Kapila
Дата:
Сообщение: Re: Relation extension scalability
Следующее
От: David Rowley
Дата:
Сообщение: Re: Combining Aggregates