Обсуждение: cache lookup error for shell type creation with incompatible output function (DDL deparsing bug)
cache lookup error for shell type creation with incompatible output function (DDL deparsing bug)
От
Michael Paquier
Дата:
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
Вложения
Michael Paquier wrote: > 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 Argh. > 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. Thanks, pushed. I changed the line to be just below TypeShellMake, which seems slightly better aligned to the comment just below, and in fact it matches what DefineRange already uses. I also modified a couple of other places involving TypeCreate: one did not have the "typoid = addr.objectId" assignment at all; while the other did, it actually seems misplaced because at that spot we expect that typoid is already correct. So I added an assert to the other place and changed that assignment to an assert, too. I scanned the rest of the bogus commit and couldn't find any other place on which I made the same mistake. Thanks for reporting, -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Alvaro Herrera wrote: > Michael Paquier wrote: > > 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 I also wanted to point out, but forgot, that this command is not really creating a shell type -- it's creating a full-blown type, because there are args. Shell types are created when no args are given. This happens to fail due to the internal creation of the shell type because of the failure to look up the i/o functions, but as far as I can see the original code should fail in any type creation in pretty much the same way (didn't actually test that); not completely sure why this wasn't more visible in regression tests. I simply removed the word "shell" in the provided test case in the committed version, anyway. -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services