Обсуждение: pg_type
I added a field to pg_type, updated all the bootstrap catalog entries, changed Natts_pg_type, and (I think) fixed the two places in pg_type.c that construct pg_type entries. However, initdb fails at the sysviews creation stage - the core dump shows it failing as shown below. Anyone have a quick idea what I might have missed / done wrong? At this stage the new field is not actually used anywhere, so it can't be a problem with that. thanks andrew Program terminated with signal 11, Segmentation fault. #0 0x0000000000444eac in heap_formtuple (tupleDescriptor=0xa59930, values=0x7fff81f7c800, nulls=0x7fff81f7c930 ' ' <repeats 24 times>, "nn�") at heaptuple.c:157 157 if (ATT_IS_PACKABLE(att[i]) && (gdb) bt #0 0x0000000000444eac in heap_formtuple (tupleDescriptor=0xa59930, values=0x7fff81f7c800, nulls=0x7fff81f7c930 ' ' <repeats 24 times>, "nn�") at heaptuple.c:157 #1 0x00000000004b3cbb in TypeCreate (typeName=0x7fff81f7cbb0 "pg_roles", typeNamespace=11, relationOid=10958, relationKind=118 'v', internalSize=<value optimized out>, typeType=99 'c', typDelim=44 ',', inputProcedure=2290, outputProcedure=2291, receiveProcedure=2402, sendProcedure=2403, typmodinProcedure=0, typmodoutProcedure=0, analyzeProcedure=0, elementType=0, baseType=0, defaultTypeValue=0x0, defaultTypeBin=0x0, passedByValue=0 '\0', alignment=100 'd', storage=120 'x', typeMod=-1, typNDims=0, typeNotNull=0 '\0') at pg_type.c:332 #2 0x00000000004a2e83 in heap_create_with_catalog (relname=0x7fff81f7cbb0 "pg_roles", relnamespace=11, reltablespace=0, relid=10958, ownerid=10, tupdesc=0xb30098, relkind=118 'v', shared_relation=0 '\0', oidislocal=0 '\0', oidinhcount=0, oncommit=ONCOMMIT_NOOP, reloptions=0, allow_system_table_mods=1 '\001') at heap.c:740 #3 0x0000000000507774 in DefineRelation (stmt=0xb2ee28, relkind=<value optimized out>) at tablecmds.c:435 #4 0x000000000051ee95 in DefineView (stmt=0xacc538, queryString=<value optimized out>) at view.c:209
Andrew Dunstan <andrew@dunslane.net> writes:
> I added a field to pg_type, updated all the bootstrap catalog entries,
> changed Natts_pg_type, and (I think) fixed the two places in pg_type.c
> that construct pg_type entries. However, initdb fails at the sysviews
> creation stage - the core dump shows it failing as shown below. Anyone
> have a quick idea what I might have missed / done wrong?
One thing I've been burnt by in the past is failing to update the
pg_class.h DATA statement to show the right number of columns. Also,
you fixed both representations of the attribute list in pg_attribute.h,
right?
regards, tom lane
Tom Lane wrote: > Andrew Dunstan <andrew@dunslane.net> writes: > >> I added a field to pg_type, updated all the bootstrap catalog entries, >> changed Natts_pg_type, and (I think) fixed the two places in pg_type.c >> that construct pg_type entries. However, initdb fails at the sysviews >> creation stage - the core dump shows it failing as shown below. Anyone >> have a quick idea what I might have missed / done wrong? >> > > One thing I've been burnt by in the past is failing to update the > pg_class.h DATA statement to show the right number of columns. Also, > you fixed both representations of the attribute list in pg_attribute.h, > right? > > > Thanks. Yes, it was both pg_class and pg_attribute that I had missed. All better now. ;-) Now to use the field .... cheers andrew
Andrew Dunstan <andrew@dunslane.net> writes:
> Tom Lane wrote:
>> One thing I've been burnt by in the past is failing to update the
>> pg_class.h DATA statement to show the right number of columns. Also,
>> you fixed both representations of the attribute list in pg_attribute.h,
>> right?
> Thanks. Yes, it was both pg_class and pg_attribute that I had missed.
> All better now. ;-)
Yeah, adding a column to one of the core "bootstrap" tables is a real
PITA. But I guess we don't do it often enough to justify having more
infrastructure for that.
> Now to use the field ....
If it hasn't occurred to you already: please add a test or two in
typ_sanity.sql to check that the column is sane, eg the type it points
to is a varlena type that points back to the element type.
regards, tom lane
Tom Lane wrote: > Yeah, adding a column to one of the core "bootstrap" tables is a real > PITA. But I guess we don't do it often enough to justify having more > infrastructure for that. > Maybe we should beef up the comments in those few stratgegic headers files a bit though. >> Now to use the field .... >> > If it hasn't occurred to you already: please add a test or two in > typ_sanity.sql to check that the column is sane, eg the type it points > to is a varlena type that points back to the element type. > > Yeah, I have the test below so far - will fix more when I have the name generation bit done. cheers andrew -- Make sure typarray points to a varlena array type of our own base SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype, p2.typelem, p2.typlen FROM pg_type p1 left join pg_type p2 on (p1.typarray = p2.oid) WHERE p1.typarray <> 0 AND (p2.oid IS NULL OR p2.typelem <> p1.oid OR p2.typlen <> -1);