Ticket #26217: patch-isspace-utf8-fix.diff

File patch-isspace-utf8-fix.diff, 2.5 KB (added by stevenschlansker@…, 14 years ago)
  • src/backend/utils/adt/arrayfuncs.c

    old new  
    5050        ARRAY_LEVEL_DELIMITED
    5151} ArrayParseState;
    5252
     53static bool array_isspace(char ch);
    5354static int      ArrayCount(const char *str, int *dim, char typdelim);
    5455static void ReadArrayStr(char *arrayStr, const char *origStr,
    5556                         int nitems, int ndim, int *dim,
     
    192193                 * Note: we currently allow whitespace between, but not within,
    193194                 * dimension items.
    194195                 */
    195                 while (isspace((unsigned char) *p))
     196                while (array_isspace(*p))
    196197                        p++;
    197198                if (*p != '[')
    198199                        break;                          /* no more dimension items */
     
    265266                                        (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
    266267                                         errmsg("missing assignment operator")));
    267268                p += strlen(ASSGN);
    268                 while (isspace((unsigned char) *p))
     269                while (array_isspace(*p))
    269270                        p++;
    270271
    271272                /*
     
    345346}
    346347
    347348/*
     349 * array_isspace() --- a non-locale-dependent isspace()
     350 *
     351 * We used to use isspace() for parsing array values, but that has
     352 * undesirable results: an array value might be silently interpreted
     353 * differently depending on the locale setting.  Now we just hard-wire
     354 * the traditional ASCII definition of isspace().
     355 */
     356static bool
     357array_isspace(char ch)
     358{
     359        if (ch == ' ' ||
     360                ch == '\t' ||
     361                ch == '\n' ||
     362                ch == '\r' ||
     363                ch == '\v' ||
     364                ch == '\f')
     365                return true;
     366        return false;
     367}
     368
     369/*
    348370 * ArrayCount
    349371 *       Determines the dimensions for an array string.
    350372 *
     
    528550                                                        itemdone = true;
    529551                                                        nelems[nest_level - 1]++;
    530552                                                }
    531                                                 else if (!isspace((unsigned char) *ptr))
     553                                                else if (!array_isspace(*ptr))
    532554                                                {
    533555                                                        /*
    534556                                                         * Other non-space characters must be after a
     
    557579        /* only whitespace is allowed after the closing brace */
    558580        while (*ptr)
    559581        {
    560                 if (!isspace((unsigned char) *ptr++))
     582                if (!array_isspace(*ptr++))
    561583                        ereport(ERROR,
    562584                                        (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
    563585                                         errmsg("malformed array literal: \"%s\"", str)));
     
    750772                                                indx[ndim - 1]++;
    751773                                                srcptr++;
    752774                                        }
    753                                         else if (isspace((unsigned char) *srcptr))
     775                                        else if (array_isspace(*srcptr))
    754776                                        {
    755777                                                /*
    756778                                                 * If leading space, drop it immediately.  Else, copy
     
    10381060                                        overall_length += 1;
    10391061                                }
    10401062                                else if (ch == '{' || ch == '}' || ch == typdelim ||
    1041                                                  isspace((unsigned char) ch))
     1063                                                 array_isspace(ch))
    10421064                                        needquote = true;
    10431065                        }
    10441066                }