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: