ERROR: cache lookup failed for type

From: "Kevin Martins" <martins506(at)hotmail(dot)com>
To: <pgsql-general(at)postgresql(dot)org>
Subject: ERROR: cache lookup failed for type
Date: 2007-11-16 02:52:09
Message-ID: BAY144-DS3F377B6934847657D7D6882830@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi,
I've been working with SRF and i want to return a setof record but i keep getting this error ´cache lookup failed for type 18867840´ . My question is why and how to fix it. I need to do this work as quick as possible so I need all the help i can get, pleeeeeeease .....I am including postgres library and i am using version 8.1.
Where is the code:

#include "SRF_example.h"
#include "postgres.h"
#include "fmgr.h"
#include "funcapi.h"
#include "executor/spi.h"
#include "executor/executor.h"

PG_FUNCTION_INFO_V1(my_SRF_example);

Datum my_SRF_example(PG_FUNCTION_ARGS)
{
FuncCallContext *funcctx;
int call_cntr;
int max_calls;
TupleDesc tupdesc;
AttInMetadata *attinmeta;

// stuff done only on the first call of the function
if (SRF_IS_FIRSTCALL())
{
MemoryContext oldcontext;

// create a function context for cross-call persistence
funcctx = SRF_FIRSTCALL_INIT();

// switch to memory context appropriate for multiple function calls
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);

// total number of tuples to be returned
funcctx->max_calls = PG_GETARG_UINT32(0);

// Build a tuple descriptor for our result type
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")));

// generate attribute metadata needed later to produce tuples from raw
// C strings

attinmeta = TupleDescGetAttInMetadata(tupdesc);
funcctx->attinmeta = attinmeta;

MemoryContextSwitchTo(oldcontext);
}

// stuff done on every call of the function
funcctx = SRF_PERCALL_SETUP();

call_cntr = funcctx->call_cntr;
max_calls = funcctx->max_calls;
// max_calls -= 1;
attinmeta = funcctx->attinmeta;
elog(NOTICE,"%d < %d",call_cntr,max_calls);
if (call_cntr <max_calls) // do when there is more left to send
{
char **values;
HeapTuple tuple;
Datum result;

// Prepare a values array for building the returned tuple.
// This should be an array of C strings which will
// be processed later by the type input functions.

values = (char **) palloc(3 * sizeof(char *));
values[0] = (char *) palloc(16 * sizeof(char));
values[1] = (char *) palloc(16 * sizeof(char));
values[2] = (char *) palloc(16 * sizeof(char));

snprintf(values[0], 16, "%d", 1 * PG_GETARG_INT32(1));
snprintf(values[1], 16, "%d", 2 * PG_GETARG_INT32(1));
snprintf(values[2], 16, "%d", 3 * PG_GETARG_INT32(1));

// build a tuple
tuple = BuildTupleFromCStrings(attinmeta, values);

// make the tuple into a datum
result = HeapTupleGetDatum(tuple);
// clean up (this is not really necessary)
pfree(values[0]);
pfree(values[1]);
pfree(values[2]);
pfree(values);
SRF_RETURN_NEXT(funcctx, result);
}
else // do when there is no more left
{
//elog(NOTICE,"%s",funcctx->user_fctx);
SRF_RETURN_DONE(funcctx);
}
}

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2007-11-16 03:31:01 Re: ERROR: cache lookup failed for type
Previous Message Gregory Stark 2007-11-16 02:37:12 Re: Variable LIMIT and OFFSET in SELECTs