Hi all, I added a new variable-length field to the pg_class catalog, but I did something wrong, and I can't tell what else I'd need to change. (I know about how extending pg_class is bad and all, but it seems to be the simplest solution to my problem right now, and I'd just like to get it working.) The code I'm working with is based on Postgres 7.3.2 (avail. at http://telegraph.cs.berkeley.edu). I've added a char field to it before, but now I'm trying to add a text field, which pg_type also has. I modified pg_class.h and pg_attribute.h (which I've pasted to http://rafb.net/paste/results/c1CiIo27.html), but when I run initdb, I'm getting a seg fault in the first postgres being run under the section 'CREATE VIEWS and other things'. gdb tells me that it's happening for the line:

backend> REVOKE ALL on pg_shadow FROM public;
QUERY: REVOKE ALL on pg_shadow FROM public;

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1076389696 (LWP 7710)]
0x0807a6e8 in DataFill (data=0x83d4710 '\177' <repeats 200 times>...,
tupleDesc=0x83971e4, value=0x83d4400,
nulls=0x83d45d8 ' ' <repeats 24 times>, "n~\177\177\177\177\177\177$F=\b ", infomask=0x83d4688, bit=0x83d468b "ÿÿÿ\002") at heaptuple.c:120
120 if (VARATT_IS_EXTERNAL(value[i]))
(gdb) l
115 }
116 else if (att[i]->attlen == -1)
117 {
118 /* varlena */
119 *infomask |= HEAP_HASVARWIDTH;
120 if (VARATT_IS_EXTERNAL(value[i]))
121 *infomask |= HEAP_HASEXTERNAL;
122 if (VARATT_IS_COMPRESSED(value[i]))
123 *infomask |= HEAP_HASCOMPRESSED;
124 data_length = VARATT_SIZE(DatumGetPointer(value[i]));
(gdb) p i
$1 = 25
(gdb) bt
#0 0x0807a6e8 in DataFill (data=0x83d4710 '\177' <repeats 200 times>...,
tupleDesc=0x83971e4, value=0x83d4400,
nulls=0x83d45d8 ' ' <repeats 24 times>, "n~\177\177\177\177\177\177$F=\b ", infomask=0x83d4688, bit=0x83d468b "ÿÿÿ\002") at heaptuple.c:120
#1 0x0807bbc7 in heap_formtuple (tupleDescriptor=0x83971e4, value=0x83d4400,
nulls=0x83d45d8 ' ' <repeats 24 times>, "n~\177\177\177\177\177\177$F=\b ")
at heaptuple.c:622
#2 0x0807c0fe in heap_modifytuple (tuple=0x403b6a60, relation=0x83970cc,
replValue=0xbffff5b0,
replNull=0xbffff590 ' ' <repeats 26 times>, "ÿ¿1\t&\b",
repl=0xbffff570 ' ' <repeats 25 times>, "rÿ¿1\t&\b", ' ' <repeats 26 times>, "ÿ¿1\t&\b") at heaptuple.c:697
#3 0x080ce977 in ExecuteGrantStmt_Relation (stmt=0x83c1954) at aclchk.c:236
#4 0x080ce4e8 in ExecuteGrantStmt (stmt=0x83c1954) at aclchk.c:138
#5 0x081ec38d in ProcessUtility (parsetree=0x83c1954, dest=Debug,
completionTag=0xbffff790 "") at utility.c:690
#6 0x081e7fdc in pg_exec_query_string (query_string=0x83c1664, dest=Debug,
parse_context=0x83954ec) at postgres.c:1035
#7 0x081ea453 in PostgresMain (argc=7, argv=0x837e5c8,
username=0x837f988 "z") at postgres.c:2774
#8 0x08177692 in main (argc=7, argv=0xbffff9f4) at main.c:236


The REVOKE command invokes ExecuteGrantStmt_Relation() to modify the relacl attribute of pg_class, which is the last attribute and also var-length. My new field is interfering with this operation somehow. For some reason, in frame 2, the new 'value' array is allocated with length numberOfAttributes = RelationGetForm(relation)->relnatts = 25, instead of 26. This looks like a problem (not sure if it's *the* problem), but I have no idea where/how this was set. I've tried setting the Natts_pg_class_fixed to both 24 and 25, to no avail.

Please let me know if more details are needed; thanks very much in advance for any help!

---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

Reply via email to