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:

Previous
From: Tom Lane
Date:
Subject: Re: Fixes to index pages
Next
From: Bruce Momjian
Date:
Subject: Re: Re: Fixes to index pages