Обсуждение: Problem with foreign keys and inheritance
[Version: CVS as of yesterday] When I create a table that inherits from another table that uses foreign keys, I get something like this: ERROR: cache lookup of attribute 10 in relation 124171 failed This is happening in get_attribute_name() of backend/utils/adt/ruleutils.c -- Oliver Elphick Oliver.Elphick@lfix.co.uk Isle of Wight http://www.lfix.co.uk/oliver PGP key from public servers; key ID32B8FAA1 ======================================== "For the LORD is good; his mercy is everlasting; and his truth endureth to all generations." Psalms 100:5
"Oliver Elphick" wrote: >When I create a table that inherits from another table that uses foreign >keys, I get somethinglike this: > > ERROR: cache lookup of attribute 10 in relation 124171 failed > >This is happening in get_attribute_name()of backend/utils/adt/ruleutils.c I'm still trying to track this down; it seems to be happening when the backend is trying to fetch details of the ancestor class, in deparse_expression(). However, I cannot find relation 124171; is there any way to find out where a relation is, given only its oid? -- Oliver Elphick Oliver.Elphick@lfix.co.uk Isle of Wight http://www.lfix.co.uk/oliver PGP key from public servers; key ID32B8FAA1 ======================================== "For I know that my redeemer liveth, and that he shall stand at the latter day upon the earth" Job 19:25
Oliver Elphick wrote: > > However, I cannot find relation 124171; is there any way to find out > where a relation is, given only its oid? This might give you a pretty good hint... select * from pg_attribute where attrelid = 124171; Cheers, Ed Loehr
Ed Loehr wrote: >Oliver Elphick wrote: >> >> However, I cannot find relation 124171; is there any way to find out >> wherea relation is, given only its oid? > >This might give you a pretty good hint... > > select * from pg_attribute whereattrelid = 124171; Nothing. I tried looking for the oid in every system table listed by \dS - no joy :-( -- Oliver Elphick Oliver.Elphick@lfix.co.uk Isle of Wight http://www.lfix.co.uk/oliver PGP key from public servers; key ID32B8FAA1 ======================================== "For I know that my redeemer liveth, and that he shall stand at the latter day upon the earth" Job 19:25
"Oliver Elphick" <olly@lfix.co.uk> writes:
>>> However, I cannot find relation 124171; is there any way to find out
>>> where a relation is, given only its oid?
>>
>> This might give you a pretty good hint...
>>
>> select * from pg_attribute where attrelid = 124171;
Actually, "select * from pg_class where oid = 124171" is the canonical
answer; if that doesn't produce anything, you have no such table.
> I tried looking for the oid in every system table listed by \dS - no joy :-(
Is it possible that you dropped the table in question since that try?
If you recreated it, it wouldn't have the same OID the second time.
Another possibility is that the rule dumper is picking up a completely
wrong number for some reason. I thought that code was pretty solid by
now, but it might still have some glitches left.
If you provided an SQL script that reproduces the problem, more people
might be motivated to look for it...
regards, tom lane
"Oliver Elphick" wrote: >[Version: CVS as of yesterday] >When I create a table that inherits from another table that
usesforeign >keys, I get something like this: > > ERROR: cache lookup of attribute 10 in relation 124171 failed >
>Thisis happening in get_attribute_name() of backend/utils/adt/ruleutils.c
Here is an SQL script that makes this happen:
========================================================
create database newj with encoding = 'SQL_ASCII';
\connect newj
create table person
( id char(10) primary key, name text not null, address
int, salutation text default 'Dear Sir', envelope text, email
text, www text
);
create table individual
( gender char(1) check (gender = 'M' or gender = 'F'
or gender is null), born datetime check ((born >= '1 Jan 1880'
and born <= 'today') or born is null), surname text, forenames text, title
text, old_surname text, mobile text, ni_no text, constraint
is_namedcheck (not (surname isnull and forenames isnull))
) inherits (person);
create table organisation
( contact char(10) references individual (id) match full, structure char(1)
check(structure='L' or structure='C' or structure='U' or structure='O')
) inherits (person);
create table customer
( acs_code char(8), acs_addr int, class char(1) default '',
type char(2), area char(2), country char(2), vat_class char(1),
vat_number char(12), discount numeric(6,3) check (discount >= -50.0::numeric(6,3)
and discount <= 50.0)::numeric(6,3), commission bool default 'f',
status char(1) default '', deliver_to int, factor_code text
) inherits (organisation);
========================================================
Table customer does not get created; instead, I get:
ERROR: cache lookup of attribute 10 in relation <some_oid> failed
--
"Oliver Elphick" <olly@lfix.co.uk> writes:
>> [Version: CVS as of yesterday]
>> When I create a table that inherits from another table that uses foreign
>> keys, I get something like this:
>>
>> ERROR: cache lookup of attribute 10 in relation 124171 failed
Ah, I see it. It's got nothing to do with foreign keys, just inherited
constraints. We're trying to deparse the inherited constraint
expressions at a time that the relation-in-process-of-being-created
isn't yet officially visible. So trying to look up its attributes is
failing. Need another CommandCounterIncrement() in there to make it
work.
This must have been busted for a good while, I think. I rewrote that
module months ago and probably broke it then. Probably should add
a regress test case that uses inherited constraints...
regards, tom lane