OK, I have found the problem. I looked AGAIN at CatalogIndexInsert(),
because all problems seem to be localized there. I remembered something
Tom Szybist said yesterday while we were on the phone about Datum only
being one value.
I said they are chained together, which I saw in IndexFormDatum, but
when I looked, I saw that the Datum pointer indexed in IndexFormDatum
was only a single Datum value, not an array of datum values like nulls
is defined.
With single-key system indexes, this was not a problem, but with the new
multi-key system indicies, it is.
I have attached the patch, and it is applied to the tree. Please let me
know if this fixes the many reported index problems. It should.
--
Bruce Momjian | 830 Blythe Avenue
maillist@candle.pha.pa.us | Drexel Hill, Pennsylvania 19026
+ If your life is a hard drive, | (610) 353-9879(w)
+ Christ can be your backup. | (610) 853-3000(h)
Index: src/backend/catalog/indexing.c
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/backend/catalog/indexing.c,v
retrieving revision 1.29
diff -c -r1.29 indexing.c
*** indexing.c 1998/09/01 16:21:47 1.29
--- indexing.c 1998/09/02 23:00:59
***************
*** 109,120 ****
HeapTuple index_tup;
TupleDesc heapDescriptor;
Form_pg_index index_form;
! Datum datum;
int natts;
AttrNumber *attnumP;
FuncIndexInfo finfo,
*finfoP;
- char nulls[INDEX_MAX_KEYS];
int i;
heapDescriptor = RelationGetDescr(heapRelation);
--- 109,120 ----
HeapTuple index_tup;
TupleDesc heapDescriptor;
Form_pg_index index_form;
! Datum datum[INDEX_MAX_KEYS];
! char nulls[INDEX_MAX_KEYS];
int natts;
AttrNumber *attnumP;
FuncIndexInfo finfo,
*finfoP;
int i;
heapDescriptor = RelationGetDescr(heapRelation);
***************
*** 152,162 ****
(AttrNumber *) index_form->indkey,
heapTuple,
heapDescriptor,
! &datum,
nulls,
finfoP);
! indexRes = index_insert(idescs[i], &datum, nulls,
&heapTuple->t_ctid, heapRelation);
if (indexRes)
pfree(indexRes);
--- 152,162 ----
(AttrNumber *) index_form->indkey,
heapTuple,
heapDescriptor,
! datum,
nulls,
finfoP);
! indexRes = index_insert(idescs[i], datum, nulls,
&heapTuple->t_ctid, heapRelation);
if (indexRes)
pfree(indexRes);