RE: [GENERAL] postgresql v6.4.2 c funcs and null text pointers... - Mailing list pgsql-hackers

From Jackson, DeJuan
Subject RE: [GENERAL] postgresql v6.4.2 c funcs and null text pointers...
Date
Msg-id F10BB1FAF801D111829B0060971D839F5C7E60@cpsmail
Whole thread Raw
Responses Re: [GENERAL] postgresql v6.4.2 c funcs and null text pointers...
List pgsql-hackers
Very observant of you.  The postgres function system doesn't have a way
to tell which parameter is null, so the function just returns null.
I don't like it and we hope to get it changed for PGv6.5 (at least I
do).

Is it on the TODO guys?  Jan, do you think you'll have the time to get
to it by beta?

*** Blatant flattery start ***
I'm still willing and looking for that backend mentor to truly get me
started, and I want you, Jan and Bruce, because I want the best.
BTW don't give me license to bug you unless you mean it.
*** Blatant flattery end ***
    -DEJ

> -----Original Message-----
> I wrote a c func (ATTACHED BELOW) which takes 2 pointers to
> type text, and
> a bool field.  When a field in a row passed to the func is
> null, espically
> the 'first' field, Postgresql does not return the value that my code
> produced.
>
> For example:
> First        lastco        nocompany
> ------------------------------------------
> NULL            Walt Bigelow    True
>
> the above data is contained in the database, and when passed
> to my c func
> like:
>
> SELECT lastfirst(first, lastco, nocompany) as name from
> tbladdress where
> agencyid = 691;
>
> I get:
> name
> ----
>
> (1 row)
>
> Not the expected output of 'Walt Bigelow, '.
>
> When I update that row with first = '', the result is correct, but the
> value is no null, so it works.
>
> What am I missing??
>
> Any help is appricated,
> Walt
>
> -------------
> name.c:
>
> #include <string.h>
> #include "postgres.h"
>
> #define        COMMA    ", "
>
> text *lastfirst (text *first, text *last, bool nocompany)
> {
> /* this function will take in the first name, and last name
>  * and based on nocompany set the output to either return
>  * 'last, first' or just the company name.
>  */
>
> int32    ret_size;
> text    *return_text;
>
>     if (nocompany) {
>
>         if (first == NULL) {
>
>             ret_size = VARSIZE(last) + sizeof(COMMA);
>             return_text = (text *) palloc(ret_size);
>
>             memset(return_text, 0, ret_size);
>
>             VARSIZE(return_text) = ret_size;
>
>             strncpy (VARDATA(return_text), VARDATA(last),
>                 VARSIZE(last)-VARHDRSZ);
>
>             strncat (VARDATA(return_text), COMMA,
>                 sizeof(COMMA));
>
>             return (return_text);
>
>         } else {
>
>             ret_size = VARSIZE(first) + VARSIZE(last) +
>                 sizeof(COMMA) - VARHDRSZ;
>
>             return_text = (text *) palloc(ret_size);
>
>             memset(return_text, 0, ret_size);
>
>             VARSIZE(return_text) = ret_size;
>
>             strncpy (VARDATA(return_text),
> VARDATA(last), VARSIZE(last)-VARHDRSZ);
>             strncat (VARDATA(return_text), COMMA,
> sizeof(COMMA));
>             strncat (VARDATA(return_text),
> VARDATA(first), VARSIZE(first)-VARHDRSZ);
>
>             return (return_text);
>
>         }
>
>     } else {
>         /* Just the company name is returned here */
>
>         ret_size = VARSIZE(last);
>         return_text = (text *) palloc(ret_size);
>
>         VARSIZE(return_text) = ret_size;
>         strncpy(VARDATA(return_text), VARDATA(last),
>             VARSIZE(last)-VARHDRSZ);
>
>         return (return_text);
>     }
> }

pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: [HACKERS] 6.4 lateness and CIDR
Next
From: "Jackson, DeJuan"
Date:
Subject: RE: [HACKERS] 6.4 lateness and CIDR