Re: BlockNumber fixes

Поиск
Список
Период
Сортировка
От Bruce Momjian
Тема Re: BlockNumber fixes
Дата
Msg-id 200207161754.g6GHsUs25483@candle.pha.pa.us
обсуждение исходный текст
Ответ на Re: BlockNumber fixes  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > The only other
> > unusual case I saw was tid outputing block number as %d and not %u.  Is
> > that OK?
>
> Seems like it should use %u.  The input side might be wrong too.
>

OK, fixed.  Patch attached.  There was also some confusion in the code
of how strtol returns its end pointer as always non-NULL:

    test=> insert into x values ('(1,2)');
    INSERT 16591 1
    test=> insert into x values ('(1000000000,2)');
    INSERT 16592 1
    test=> insert into x values ('(3000000000,2)');
    INSERT 16593 1
    test=> select * from x;
           y
    ----------------
              (1,2)
     (1000000000,2)
     (3000000000,2)
    (3 rows)

    test=> insert into x values ('(5000000000,2)');
    ERROR:  tidin: invalid value.
    test=> insert into x values ('(3000000000,200000)');
    ERROR:  tidin: invalid value.
    test=> insert into x values ('(3000000000,20000)');
    INSERT 16595 1

> > Also, pg_class.relpages is an int.  We don't have unsigned int columns.
>
> Yeah.  I had a todo item to look at all the uses of relpages and make
> sure they were being casted to unsigned ...

They all look OK to me.

--
  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/utils/adt/numutils.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/numutils.c,v
retrieving revision 1.49
diff -c -r1.49 numutils.c
*** src/backend/utils/adt/numutils.c    20 Jun 2002 20:29:38 -0000    1.49
--- src/backend/utils/adt/numutils.c    16 Jul 2002 17:51:06 -0000
***************
*** 46,52 ****
  pg_atoi(char *s, int size, int c)
  {
      long        l = 0;
!     char       *badp = (char *) NULL;

      Assert(s);

--- 46,52 ----
  pg_atoi(char *s, int size, int c)
  {
      long        l = 0;
!     char       *badp;

      Assert(s);

***************
*** 71,77 ****
       */
      if (errno && errno != EINVAL)
          elog(ERROR, "pg_atoi: error reading \"%s\": %m", s);
!     if (badp && *badp && (*badp != c))
          elog(ERROR, "pg_atoi: error in \"%s\": can\'t parse \"%s\"", s, badp);

      switch (size)
--- 71,77 ----
       */
      if (errno && errno != EINVAL)
          elog(ERROR, "pg_atoi: error reading \"%s\": %m", s);
!     if (*badp && *badp != c)
          elog(ERROR, "pg_atoi: error in \"%s\": can\'t parse \"%s\"", s, badp);

      switch (size)
Index: src/backend/utils/adt/tid.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v
retrieving revision 1.31
diff -c -r1.31 tid.c
*** src/backend/utils/adt/tid.c    20 Jun 2002 20:29:38 -0000    1.31
--- src/backend/utils/adt/tid.c    16 Jul 2002 17:51:06 -0000
***************
*** 18,23 ****
--- 18,27 ----

  #include "postgres.h"

+ #include <errno.h>
+ #include <math.h>
+ #include <limits.h>
+
  #include "access/heapam.h"
  #include "catalog/namespace.h"
  #include "utils/builtins.h"
***************
*** 47,52 ****
--- 51,58 ----
      ItemPointer result;
      BlockNumber blockNumber;
      OffsetNumber offsetNumber;
+     char       *badp;
+     int            hold_offset;

      for (i = 0, p = str; *p && i < NTIDARGS && *p != RDELIM; p++)
          if (*p == DELIM || (*p == LDELIM && !i))
***************
*** 55,62 ****
      if (i < NTIDARGS)
          elog(ERROR, "invalid tid format: '%s'", str);

!     blockNumber = (BlockNumber) atoi(coord[0]);
!     offsetNumber = (OffsetNumber) atoi(coord[1]);

      result = (ItemPointer) palloc(sizeof(ItemPointerData));

--- 61,76 ----
      if (i < NTIDARGS)
          elog(ERROR, "invalid tid format: '%s'", str);

!     errno = 0;
!     blockNumber = strtoul(coord[0], &badp, 10);
!     if (errno || *badp != DELIM)
!         elog(ERROR, "tidin: invalid value.");
!
!     hold_offset = strtol(coord[1], &badp, 10);
!     if (errno || *badp != RDELIM ||
!         hold_offset > USHRT_MAX || hold_offset < 0)
!         elog(ERROR, "tidin: invalid value.");
!     offsetNumber = hold_offset;

      result = (ItemPointer) palloc(sizeof(ItemPointerData));

***************
*** 87,93 ****
      blockNumber = BlockIdGetBlockNumber(blockId);
      offsetNumber = itemPtr->ip_posid;

!     sprintf(buf, "(%d,%d)", (int) blockNumber, (int) offsetNumber);

      PG_RETURN_CSTRING(pstrdup(buf));
  }
--- 101,107 ----
      blockNumber = BlockIdGetBlockNumber(blockId);
      offsetNumber = itemPtr->ip_posid;

!     sprintf(buf, "(%u,%u)", blockNumber, offsetNumber);

      PG_RETURN_CSTRING(pstrdup(buf));
  }

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Peter Eisentraut
Дата:
Сообщение: Spec on pg_cast table/CREATE CAST command
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Spec on pg_cast table/CREATE CAST command