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.