Re: [HACKERS] fix for libpq choking on varlen fields - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: [HACKERS] fix for libpq choking on varlen fields
Date
Msg-id 199809101509.LAA01352@candle.pha.pa.us
Whole thread Raw
In response to fix for libpq choking on varlen fields  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
patch applied.


> I broke it, I'm guilty :-(.  Here's the fix.
>
> In view of recent discussions about eliminating the fixed limit
> on tuple sizes, a better long-term solution would be to increase
> the width of field size values from 2 bytes to 4 in the FE/BE
> protocol.  I suspect we will end up doing that someday, so maybe
> we should bite the bullet and do it now as part of the "2.0" FE/BE
> protocol revision.  On the other hand, we did promise a few weeks ago
> that we were done changing the FE/BE protocol for 6.4.  Comments?
>
>             regards, tom lane
>
>
> *** src/interfaces/libpq/fe-exec.c.orig    Wed Sep  9 22:01:38 1998
> --- src/interfaces/libpq/fe-exec.c    Wed Sep  9 22:45:53 1998
> ***************
> *** 541,546 ****
> --- 541,556 ----
>               PQclear(result);
>               return EOF;
>           }
> +         /*
> +          * Since pqGetInt treats 2-byte integers as unsigned, we need to
> +          * coerce the special value "-1" to signed form.  (-1 is sent for
> +          * variable-length fields.)  Formerly, libpq effectively did a
> +          * sign-extension on the 2-byte value by storing it in a signed short.
> +          * Now we only coerce the single value 65535 == -1; values
> +          * 32768..65534 are taken as valid field lengths.
> +          */
> +         if (typlen == 0xFFFF)
> +             typlen = -1;
>           result->attDescs[i].name = strdup(typName);
>           result->attDescs[i].typid = typid;
>           result->attDescs[i].typlen = typlen;
> ***************
> *** 1488,1494 ****
>       if (strncmp(res->cmdStatus, "INSERT ", 7) != 0)
>           return "";
>
> !     /*
>        * The cmdStatus string looks like
>        *     INSERT oid count\0
>        * In order to be able to return an ordinary C string without
> --- 1498,1504 ----
>       if (strncmp(res->cmdStatus, "INSERT ", 7) != 0)
>           return "";
>
> !     /*----------
>        * The cmdStatus string looks like
>        *     INSERT oid count\0
>        * In order to be able to return an ordinary C string without
> ***************
> *** 1498,1503 ****
> --- 1508,1514 ----
>        *     INSERT oid count\0oid\0
>        *                       ^ our return value points here
>        * Pretty klugy eh?  This routine should've just returned an Oid value.
> +      *----------
>        */
>
>       slen = strlen(res->cmdStatus);
>
>


--
Bruce Momjian                          |  830 Blythe Avenue
maillist@candle.pha.pa.us              |  Drexel Hill, Pennsylvania 19026
  +  If your life is a hard drive,     |  (610) 353-9879(w)
  +  Christ can be your backup.        |  (610) 853-3000(h)

pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: [HACKERS] open 6.4 items
Next
From: Daniel Kalchev
Date:
Subject: more on int8