Improve the consistency of the error message emitted when rejecting
authorNeil Conway
Wed, 18 Feb 2004 00:01:34 +0000 (00:01 +0000)
committerNeil Conway
Wed, 18 Feb 2004 00:01:34 +0000 (00:01 +0000)
invalid input to the oid type. Also, remove some long-unused code
from adt/numutils.c

src/backend/utils/adt/numutils.c
src/backend/utils/adt/oid.c
src/test/regress/expected/oid.out

index d169be8bd09a927b0721af7f14742056049e1631..20227884ed171b190e525dfbfef1325ef09d9d1e 100644 (file)
@@ -3,15 +3,14 @@
  * numutils.c
  *   utility functions for I/O of built-in numeric types.
  *
- *     integer:                pg_itoa, pg_ltoa
- *     floating point:         ftoa, atof1
+ *     integer:                pg_atoi, pg_itoa, pg_ltoa
  *
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/adt/numutils.c,v 1.60 2004/01/07 18:56:28 neilc Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/adt/numutils.c,v 1.61 2004/02/18 00:01:33 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -147,334 +146,3 @@ pg_ltoa(int32 l, char *a)
 {
    sprintf(a, "%d", l);
 }
-
-/*
- **  ftoa      - FLOATING POINT TO ASCII CONVERSION
- **
- **        CODE derived from ingres, ~ingres/source/gutil/ftoa.c
- **
- **        'Value' is converted to an ascii character string and stored
- **        into 'ascii'.  Ascii should have room for at least 'width' + 1
- **        characters.  'Width' is the width of the output field (max).
- **        'Prec' is the number of characters to put after the decimal
- **        point.  The format of the output string is controlled by
- **        'format'.
- **
- **        'Format' can be:
- **                e or E: "E" format output
- **                f or F:  "F" format output
- **                g or G:  "F" format output if it will fit, otherwise
- **                        use "E" format.
- **                n or N:  same as G, but decimal points will not always
- **                        be aligned.
- **
- **        If 'format' is upper case, the "E" comes out in upper case;
- **        otherwise it comes out in lower case.
- **
- **        When the field width is not big enough, it fills the field with
- **        stars ("*****") and returns zero.  Normal return is the width
- **        of the output field (sometimes shorter than 'width').
- */
-#ifdef NOT_USED
-int
-ftoa(double value, char *ascii, int width, int prec1, char format)
-{
-#ifndef HAVE_FCVT
-   char        out[256];
-   char        fmt[256];
-   int         ret;
-
-   sprintf(fmt, "%%%d.%d%c", width, prec1, format);
-   sprintf(out, fmt, value);
-   if ((ret = strlen(out)) > width)
-   {
-       MemSet(ascii, '*', width - 2);
-       ascii[width] = 0;
-       return 0;
-   }
-   strcpy(ascii, out);
-   return ret;
-#else
-   auto int    expon;
-   auto int    sign;
-   int         avail = 0;
-   char       *a = NULL;
-   char       *p = NULL;
-   char        mode;
-   int         lowercase;
-   int         prec;
-
-/*   extern char       *ecvt(), *fcvt();*/
-
-   prec = prec1;
-   mode = format;
-   lowercase = 'a' - 'A';
-   if (mode >= 'a')
-       mode -= 'a' - 'A';
-   else
-       lowercase = 0;
-
-   if (mode != 'E')
-   {
-       /* try 'F' style output */
-       p = fcvt(value, prec, &expon, &sign);
-       avail = width;
-       a = ascii;
-
-       /* output sign */
-       if (sign)
-       {
-           avail--;
-           *a++ = '-';
-       }
-
-       /* output '0' before the decimal point */
-       if (expon <= 0)
-       {
-           *a++ = '0';
-           avail--;
-       }
-
-       /* compute space length left after dec pt and fraction */
-       avail -= prec + 1;
-       if (mode == 'G')
-           avail -= 4;
-
-       if (avail >= expon)
-       {
-
-           /* it fits.  output */
-           while (expon > 0)
-           {
-               /* output left of dp */
-               expon--;
-               if (*p)
-                   *a++ = *p++;
-               else
-                   *a++ = '0';
-           }
-
-           /* output fraction (right of dec pt) */
-           avail = expon;
-           goto frac_out;
-       }
-       /* won't fit; let's hope for G format */
-   }
-
-   if (mode != 'F')
-   {
-       /* try to do E style output */
-       p = ecvt(value, prec + 1, &expon, &sign);
-       avail = width - 5;
-       a = ascii;
-
-       /* output the sign */
-       if (sign)
-       {
-           *a++ = '-';
-           avail--;
-       }
-   }
-
-   /* check for field too small */
-   if (mode == 'F' || avail < prec)
-   {
-       /* sorry joker, you lose */
-       a = ascii;
-       for (avail = width; avail > 0; avail--)
-           *a++ = '*';
-       *a = 0;
-       return 0;
-   }
-
-   /* it fits; output the number */
-   mode = 'E';
-
-   /* output the LHS single digit */
-   *a++ = *p++;
-   expon--;
-
-   /* output the rhs */
-   avail = 1;
-
-frac_out:
-   *a++ = '.';
-   while (prec > 0)
-   {
-       prec--;
-       if (avail < 0)
-       {
-           avail++;
-           *a++ = '0';
-       }
-       else
-       {
-           if (*p)
-               *a++ = *p++;
-           else
-               *a++ = '0';
-       }
-   }
-
-   /* output the exponent */
-   if (mode == 'E')
-   {
-       *a++ = 'E' + lowercase;
-       if (expon < 0)
-       {
-           *a++ = '-';
-           expon = -expon;
-       }
-       else
-           *a++ = '+';
-       *a++ = (expon / 10) % 10 + '0';
-       *a++ = expon % 10 + '0';
-   }
-
-   /* output spaces on the end in G format */
-   if (mode == 'G')
-   {
-       *a++ = ' ';
-       *a++ = ' ';
-       *a++ = ' ';
-       *a++ = ' ';
-   }
-
-   /* finally, we can return */
-   *a = 0;
-   avail = a - ascii;
-   return avail;
-#endif
-}
-#endif
-
-/*
- **   atof1        - ASCII TO FLOATING CONVERSION
- **
- **        CODE derived from ~ingres/source/gutil/atof.c
- **
- **        Converts the string 'str' to floating point and stores the
- **        result into the cell pointed to by 'val'.
- **
- **        The syntax which it accepts is pretty much what you would
- **        expect.  Basically, it is:
- **                {} [+|-] {} {} [.{digit}] {} []
- **        where  is "e" or "E" followed by an integer,  is a
- **        space character,  is zero through nine, [] is zero or
- **        one, and {} is zero or more.
- **
- **        Parameters:
- **                str -- string to convert.
- **                val -- pointer to place to put the result (which
- **                        must be type double).
- **
- **        Returns:
- **                zero -- ok.
- **                -1 -- syntax error.
- **                +1 -- overflow (not implemented).
- **
- **        Side Effects:
- **                clobbers *val.
- */
-#ifdef NOT_USED
-int
-atof1(char *str, double *val)
-{
-   char       *p;
-   double      v;
-   double      fact;
-   int         minus;
-   char        c;
-   int         expon;
-   int         gotmant;
-
-   v = 0.0;
-   p = str;
-   minus = 0;
-
-   /* skip leading blanks */
-   while ((c = *p) != '\0')
-   {
-       if (c != ' ')
-           break;
-       p++;
-   }
-
-   /* handle possible sign */
-   switch (c)
-   {
-       case '-':
-           minus++;
-
-       case '+':
-           p++;
-   }
-
-   /* skip blanks after sign */
-   while ((c = *p) != '\0')
-   {
-       if (c != ' ')
-           break;
-       p++;
-   }
-
-   /* start collecting the number to the decimal point */
-   gotmant = 0;
-   for (;;)
-   {
-       c = *p;
-       if (c < '0' || c > '9')
-           break;
-       v = v * 10.0 + (c - '0');
-       gotmant++;
-       p++;
-   }
-
-   /* check for fractional part */
-   if (c == '.')
-   {
-       fact = 1.0;
-       for (;;)
-       {
-           c = *++p;
-           if (c < '0' || c > '9')
-               break;
-           fact *= 0.1;
-           v += (c - '0') * fact;
-           gotmant++;
-       }
-   }
-
-   /* skip blanks before possible exponent */
-   while ((c = *p) != '\0')
-   {
-       if (c != ' ')
-           break;
-       p++;
-   }
-
-   /* test for exponent */
-   if (c == 'e' || c == 'E')
-   {
-       p++;
-       expon = pg_atoi(p, sizeof(expon), '\0');
-       if (!gotmant)
-           v = 1.0;
-       fact = expon;
-       v *= pow(10.0, fact);
-   }
-   else
-   {
-       /* if no exponent, then nothing */
-       if (c != 0)
-           return -1;
-   }
-
-   /* store the result and exit */
-   if (minus)
-       v = -v;
-   *val = v;
-   return 0;
-}
-
-#endif
index a60f1f4cde601513169d41c07692b5de9d31b692..c6a47d1bfd47392514f36f6f35d9c5b297075588 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/adt/oid.c,v 1.53 2003/11/29 19:51:59 pgsql Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/adt/oid.c,v 1.54 2004/02/18 00:01:34 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -46,18 +46,18 @@ oidin_subr(const char *funcname, const char *s, char **endloc)
    if (errno && errno != ERANGE && errno != EINVAL)
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-                errmsg("invalid input syntax for type \"oid\": \"%s\"",
+                errmsg("invalid input syntax for type oid: \"%s\"",
                        s)));
    if (endptr == s && *endptr)
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-                errmsg("invalid input syntax for type \"oid\": \"%s\"",
+                errmsg("invalid input syntax for type oid: \"%s\"",
                        s)));
 
    if (errno == ERANGE)
        ereport(ERROR,
                (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-                errmsg("value \"%s\" is out of range for type \"oid\"", s)));
+                errmsg("value \"%s\" is out of range for type oid", s)));
 
    if (endloc)
    {
@@ -72,7 +72,7 @@ oidin_subr(const char *funcname, const char *s, char **endloc)
        if (*endptr)
            ereport(ERROR,
                    (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-                    errmsg("invalid input syntax for type \"oid\": \"%s\"",
+                    errmsg("invalid input syntax for type oid: \"%s\"",
                            s)));
    }
 
@@ -95,7 +95,7 @@ oidin_subr(const char *funcname, const char *s, char **endloc)
        cvt != (unsigned long) ((int) result))
        ereport(ERROR,
                (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-                errmsg("value \"%s\" is out of range for type \"oid\"", s)));
+                errmsg("value \"%s\" is out of range for type oid", s)));
 #endif
 
    return result;
index f3fc452587d479460d9d9ea1b2a32732925559c1..ce43b92bbf58243e43611074364f71ace9cab62c 100644 (file)
@@ -10,9 +10,9 @@ INSERT INTO OID_TBL(f1) VALUES ('99999999');
 INSERT INTO OID_TBL(f1) VALUES ('');
 -- bad inputs 
 INSERT INTO OID_TBL(f1) VALUES ('asdfasd');
-ERROR:  invalid input syntax for type "oid": "asdfasd"
+ERROR:  invalid input syntax for type oid: "asdfasd"
 INSERT INTO OID_TBL(f1) VALUES ('99asdfasd');
-ERROR:  invalid input syntax for type "oid": "99asdfasd"
+ERROR:  invalid input syntax for type oid: "99asdfasd"
 SELECT '' AS six, OID_TBL.*;
  six |     f1     
 -----+------------