Problem returning strings with pgsql 8.3.x

Поиск
Список
Период
Сортировка
От Josh Tolley
Тема Problem returning strings with pgsql 8.3.x
Дата
Msg-id e7e0a2570805100425r6dbeaadk49b540c886802260@mail.gmail.com
обсуждение исходный текст
Список pgsql-general
While developing PL/LOLCODE, I've found something wrong with returning
strings from LOLCODE functions using 8.3.0 or greater. Using 8.4beta
from a few days ago, for instance, a function that should return "test
string" returns
"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F" in
pgsql (sometimes the number of \x7F characters varies). In 8.2.4 it
works fine.

Here's the code involved, from pl_lolcode_call_handler, the call
handler function for PL/LOLCODE. First, the bit that finds the
FmgrInfo structure and typioparam for the result type:

        procTup = SearchSysCache(PROCOID,
ObjectIdGetDatum(fcinfo->flinfo->fn_oid), 0, 0, 0);
        if (!HeapTupleIsValid(procTup)) elog(ERROR, "Cache lookup
failed for procedure %u", fcinfo->flinfo->fn_oid);
        procStruct = (Form_pg_proc) GETSTRUCT(procTup);

        typeTup = SearchSysCache(TYPEOID,
ObjectIdGetDatum(procStruct->prorettype), 0, 0, 0);
        if (!HeapTupleIsValid(typeTup)) elog(ERROR, "Cache lookup
failed for type %u", procStruct->prorettype);
        typeStruct = (Form_pg_type) GETSTRUCT(typeTup);

        resultTypeIOParam = getTypeIOParam(typeTup);
        fmgr_info_cxt(typeStruct->typinput, &flinfo,
TopMemoryContext); /*CurTransactionContext); */
        ReleaseSysCache(typeTup);

Here's the code that converts the return value into a Datum later on
in the function:

        if (returnTypeOID != VOIDOID) {
                if (returnVal != NULL) {
                        if (returnVal->type == ident_NOOB)
                                fcinfo->isnull = true;
                        else  {
                                SPI_push();
                                if (returnTypeOID == BOOLOID)
                                        retval =
InputFunctionCall(&flinfo, lolVarGetTroof(returnVal) == lolWIN ?
"TRUE" : "FALSE", resultTypeIOParam, -1);
                                else {
                                        /* elog(NOTICE,
lolVarGetString(returnVal, true)); */
                                        retval =
InputFunctionCall(&flinfo, lolVarGetString(returnVal, true),
resultTypeIOParam, -1);
                                }
                                SPI_pop();
                        }
                }
                else {
                        fcinfo->isnull = true;
                }
        }

        SPI_finish();
        /* elog(NOTICE, "PL/LOLCODE ending"); */

        return retval;

returnVal is an instance of the struct PL/LOLCODE uses to store its
variables. The key line in this case is the one after the
commented-out call to elog. retval is a Datum type. lolVarGetString()
returns the string value the returnVal struct represents -- I'm
certain of that thanks to gdb and other testing. All other data types
PL/LOLCODE knows about internally seem to return just fine. I'm fairly
certain I'm screwing up memory somewhere, but I can't see what I've
done wrong.

I'm glad to provide further details, but those included above are all
the ones I thought were relevant. Thanks in advance for any help you
can provide.

- Josh / eggyknap

Note: The -hackers list seemed like the place for this post, but its
list description gives instructions to try another list first, hence
the post here.

В списке pgsql-general по дате отправления:

Предыдущее
От: "Pavel Stehule"
Дата:
Сообщение: Re: Returning RECORD from PGSQL without custom type?
Следующее
От: Steve Atkins
Дата:
Сообщение: Re: choiche of function language was: Re: dynamic procedure call