I'm now using C strings. I don't need to use CStringGetTextDatum, but it
still don't works. There's the code:

---------------------------------------------------------------
PG_FUNCTION_INFO_V1(parse_url_record);
Datum parse_url_record (PG_FUNCTION_ARGS)
{
        // Vars about the params
        //text *str2 = PG_GETARG_TEXT_P(0);
        char str[] = "http://www.ovh.com/intenal.html";;

        // Some vars which will used to create the composite output type
        TupleDesc       tupdesc;
        char            **values;
        HeapTuple       tuple;
        AttInMetadata *attinmeta;
        bool            nulls[2];
        url             *ret;

        // Check NULLs values
        if(PG_ARGISNULL(0) || PG_ARGISNULL(1)) {
                PG_RETURN_NULL();
        }

        ret = parse_url_exec(str);

        if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
{
            ereport(ERROR,
                        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                     errmsg("function returning record called in context that
cannot accept type record")));
        }
        attinmeta = TupleDescGetAttInMetadata(tupdesc);

        // ...
        values = (char **) palloc(2 * sizeof(char *));

        // Add datas into the values Datum
        values[0] = (char *) ret->scheme;
        values[1] = (char *) ret->host;

        // Convert values into a composite type
        memset(nulls, 0, sizeof(nulls));

        // build tuple from datum array
        tuple = BuildTupleFromCStrings(attinmeta, values);

        // Return the composite type
        PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
}
---------------------------------------------------------------

Thanks a lot !
Samuel ROZE.

Le mercredi 21 octobre 2009 à 11:42 -0400, Tom Lane a écrit :
> Samuel ROZE <samuel.r...@gmail.com> writes:
> > The problem is that they don't work fine... :/
> 
> I think the problem is that you are passing C strings to code that
> expects pointers to text datums --- which are not the same thing
> at all.  (text has a length word, not a null terminator byte.)
> It's pure accident that your first example works, and entirely
> unsurprising that the second one doesn't.  Some CStringGetTextDatum
> calls might help.
> 
>                       regards, tom lane



-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to