ERROR: cache lookup failed for type - Mailing list pgsql-general
From | Kevin Martins |
---|---|
Subject | ERROR: cache lookup failed for type |
Date | |
Msg-id | BAY144-DS3F377B6934847657D7D6882830@phx.gbl Whole thread Raw |
Responses |
Re: ERROR: cache lookup failed for type
|
List | 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"
#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;
{
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;
if (SRF_IS_FIRSTCALL())
{
MemoryContext oldcontext;
// create a function context for cross-call persistence
funcctx = SRF_FIRSTCALL_INIT();
funcctx = SRF_FIRSTCALL_INIT();
// switch to memory context appropriate for multiple function calls
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
// total number of tuples to be returned
funcctx->max_calls = PG_GETARG_UINT32(0);
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")));
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();
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;
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);
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);
}
}
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);
}
}
pgsql-general by date: