Re: Fixes to index pages - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: Fixes to index pages |
Date | |
Msg-id | 200102220356.WAA12912@candle.pha.pa.us Whole thread Raw |
In response to | Re: Fixes to index pages (Tom Lane <tgl@sss.pgh.pa.us>) |
List | pgsql-patches |
> Bruce Momjian <pgman@candle.pha.pa.us> writes: > >> What happened to our discussion about keeping t_info bit 13 unused?? > > > I wasn't going to reserve it in the patch. I figured I would make all > > the items/flags match, and if someone wants to reserve it, it is easy to > > do in one place. I imagine 7.2 is going to be dump/reload anyway so the > > decision can be made during development cycle. I basically didn't want > > to leave a bit gap and leave it unnamed because it could cause > > confusion. > > I object. Strongly. You are making a significant change without > discussion --- in fact, contrary to what discussion there has been. > This is not a "trivial cleanup". OK, attached is the patch. I guess I don't understand how what I am doing affects anything. I realize you were commenting about the earlier patch that gave the 13th bit to the length. I now see the issue you were talking about was this test: /* * Here we make sure that the size will fit in the field reserved for * it in t_info. */ if ((size & INDEX_SIZE_MASK) != size) elog(ERROR, "index_formtuple: data takes %lu bytes, max is %d", (unsigned long) size, INDEX_SIZE_MASK); I originally didn't realize that expanding the _storage_ space for the index tuples actually allow storage of longer tuples. I see that now, and this is why I just mark the patch as UNUSED. I will let others handle it. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 Index: src/backend/access/common/indextuple.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/access/common/indextuple.c,v retrieving revision 1.51 diff -c -w -r1.51 indextuple.c *** src/backend/access/common/indextuple.c 2001/02/15 20:57:01 1.51 --- src/backend/access/common/indextuple.c 2001/02/22 03:23:17 *************** *** 230,236 **** attnum--; ! if (IndexTupleNoNulls(tup)) { #ifdef IN_MACRO /* This is handled in the macro */ --- 230,236 ---- attnum--; ! if (!IndexTupleHasNulls(tup)) { #ifdef IN_MACRO /* This is handled in the macro */ *************** *** 301,307 **** return fetchatt(att[attnum], tp + att[attnum]->attcacheoff); } ! else if (!IndexTupleAllFixed(tup)) { int j; --- 301,307 ---- return fetchatt(att[attnum], tp + att[attnum]->attcacheoff); } ! else if (IndexTupleHasVarlenas(tup)) { int j; *************** *** 365,371 **** for (i = 0; i < attnum; i++) { ! if (!IndexTupleNoNulls(tup)) { if (att_isnull(i, bp)) { --- 365,371 ---- for (i = 0; i < attnum; i++) { ! if (IndexTupleHasNulls(tup)) { if (att_isnull(i, bp)) { Index: src/backend/access/gist/gist.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/access/gist/gist.c,v retrieving revision 1.69 diff -c -w -r1.69 gist.c *** src/backend/access/gist/gist.c 2001/01/29 00:39:12 1.69 --- src/backend/access/gist/gist.c 2001/02/22 03:23:17 *************** *** 1102,1108 **** { memcpy(datum, entry.pred, entry.bytes); /* clear out old size */ ! t->t_info &= 0xe000; /* or in new size */ t->t_info |= MAXALIGN(entry.bytes + sizeof(IndexTupleData)); --- 1102,1108 ---- { memcpy(datum, entry.pred, entry.bytes); /* clear out old size */ ! t->t_info &= ~INDEX_SIZE_MASK; /* or in new size */ t->t_info |= MAXALIGN(entry.bytes + sizeof(IndexTupleData)); Index: src/backend/access/hash/hash.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/access/hash/hash.c,v retrieving revision 1.48 diff -c -w -r1.48 hash.c *** src/backend/access/hash/hash.c 2001/01/29 00:39:13 1.48 --- src/backend/access/hash/hash.c 2001/02/22 03:23:18 *************** *** 170,176 **** * of the way nulls are handled here. */ ! if (itup->t_info & INDEX_NULL_MASK) { pfree(itup); continue; --- 170,176 ---- * of the way nulls are handled here. */ ! if (IndexTupleHasNulls(itup)) { pfree(itup); continue; *************** *** 256,262 **** itup = index_formtuple(RelationGetDescr(rel), datum, nulls); itup->t_tid = *ht_ctid; ! if (itup->t_info & INDEX_NULL_MASK) PG_RETURN_POINTER((InsertIndexResult) NULL); hitem = _hash_formitem(itup); --- 256,262 ---- itup = index_formtuple(RelationGetDescr(rel), datum, nulls); itup->t_tid = *ht_ctid; ! if (IndexTupleHasNulls(itup)) PG_RETURN_POINTER((InsertIndexResult) NULL); hitem = _hash_formitem(itup); Index: src/backend/access/hash/hashutil.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/access/hash/hashutil.c,v retrieving revision 1.25 diff -c -w -r1.25 hashutil.c *** src/backend/access/hash/hashutil.c 2001/01/24 19:42:47 1.25 --- src/backend/access/hash/hashutil.c 2001/02/22 03:23:18 *************** *** 72,78 **** Size tuplen; /* disallow nulls in hash keys */ ! if (itup->t_info & INDEX_NULL_MASK) elog(ERROR, "hash indices cannot include null keys"); /* make a copy of the index tuple with room for the sequence number */ --- 72,78 ---- Size tuplen; /* disallow nulls in hash keys */ ! if (IndexTupleHasNulls(itup)) elog(ERROR, "hash indices cannot include null keys"); /* make a copy of the index tuple with room for the sequence number */ Index: src/include/access/itup.h =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/access/itup.h,v retrieving revision 1.29 diff -c -w -r1.29 itup.h *** src/include/access/itup.h 2001/02/21 19:07:04 1.29 --- src/include/access/itup.h 2001/02/22 03:23:22 *************** *** 24,35 **** { ItemPointerData t_tid; /* reference TID to heap tuple */ ! /* * t_info is layed out in the following fashion: * ! * 15th (leftmost) bit: "has nulls" bit 14th bit: "has varlenas" bit 13th ! * bit: "has rules" bit - (removed ay 11/94) bits 12-0 bit: size of ! * tuple. */ unsigned short t_info; /* various info about tuple */ --- 24,37 ---- { ItemPointerData t_tid; /* reference TID to heap tuple */ ! /* --------------- * t_info is layed out in the following fashion: * ! * 15th (high) bit: has nulls ! * 14th bit: has varlenas ! * 13th bit: unused ! * 12-0 bit: size of tuple ! * --------------- */ unsigned short t_info; /* various info about tuple */ *************** *** 69,81 **** #define INDEX_SIZE_MASK 0x1FFF #define INDEX_NULL_MASK 0x8000 #define INDEX_VAR_MASK 0x4000 ! #define IndexTupleSize(itup) ((Size) (((IndexTuple) (itup))->t_info & 0x1FFF)) ! #define IndexTupleDSize(itup) ((Size) ((itup).t_info & 0x1FFF)) ! #define IndexTupleNoNulls(itup) (!(((IndexTuple) (itup))->t_info & 0x8000)) ! #define IndexTupleAllFixed(itup) (!(((IndexTuple) (itup))->t_info & 0x4000)) ! #define IndexTupleHasMinHeader(itup) (IndexTupleNoNulls(itup)) /* * Takes an infomask as argument (primarily because this needs to be usable --- 71,84 ---- #define INDEX_SIZE_MASK 0x1FFF #define INDEX_NULL_MASK 0x8000 #define INDEX_VAR_MASK 0x4000 + #define INDEX_UNUSED 0x2000 ! #define IndexTupleSize(itup) ((Size) (((IndexTuple) (itup))->t_info & INDEX_SIZE_MASK)) ! #define IndexTupleDSize(itup) ((Size) ((itup).t_info & INDEX_SIZE_MASK)) ! #define IndexTupleHasNulls(itup) ((((IndexTuple) (itup))->t_info & INDEX_NULL_MASK)) ! #define IndexTupleHasVarlenas(itup) ((((IndexTuple) (itup))->t_info & INDEX_VAR_MASK)) ! #define IndexTupleHasMinHeader(itup) (!IndexTupleHasNulls(itup)) /* * Takes an infomask as argument (primarily because this needs to be usable *************** *** 107,113 **** ( \ AssertMacro(PointerIsValid(isnull) && (attnum) > 0), \ *(isnull) = false, \ ! IndexTupleNoNulls(tup) ? \ ( \ (tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ? \ ( \ --- 110,116 ---- ( \ AssertMacro(PointerIsValid(isnull) && (attnum) > 0), \ *(isnull) = false, \ ! !IndexTupleHasNulls(tup) ? \ ( \ (tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ? \ ( \ Index: src/include/access/nbtree.h =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/access/nbtree.h,v retrieving revision 1.52 diff -c -w -r1.52 nbtree.h *** src/include/access/nbtree.h 2001/02/21 19:07:04 1.52 --- src/include/access/nbtree.h 2001/02/22 03:23:23 *************** *** 50,56 **** #define BTREE_METAPAGE 0 /* first page is meta */ ! #define BTREE_MAGIC 0x053162 #define BTreeInvalidParent(opaque) \ (opaque->btpo_parent == InvalidBlockNumber || \ --- 50,56 ---- #define BTREE_METAPAGE 0 /* first page is meta */ ! #define BTREE_MAGIC 0x053162 /* magic number of btree pages */ #define BTreeInvalidParent(opaque) \ (opaque->btpo_parent == InvalidBlockNumber || \
pgsql-patches by date: