well, I tried the heap_deformtuple and I am getting now:
select testgetrows();
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
!> 

btw, as can be seen below I tried two kinds of tupledesc just in case
with the same results.
/*funcctx->tuple_desc= BlessTupleDesc(fctx->lRel->rd_att);*/
funcctx->tuple_desc=BlessTupleDesc(RelationNameGetTupleDesc("my_first_ta
ble"));

#include "postgres.h"
#include <string.h>
#include <array.h>
#include "fmgr.h"
#include "funcapi.h"
#include "access/heapam.h" 

typedef struct
{
  HeapScanDesc scan;
  Relation      lRel; 
} testgetrows_fctx;

PG_FUNCTION_INFO_V1(testgetrows);

Datum
testgetrows(PG_FUNCTION_ARGS)
{
     FuncCallContext     *funcctx;
     testgetrows_fctx *fctx; 
     if (SRF_IS_FIRSTCALL())
     {
        MemoryContext   oldcontext;
        funcctx = SRF_FIRSTCALL_INIT();

        oldcontext =
MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
        fctx = (testgetrows_fctx *) palloc(sizeof(testgetrows_fctx)); 
        fctx->lRel = heap_open(17236, AccessShareLock);
        fctx->scan = heap_beginscan(fctx->lRel, SnapshotNow, 0, NULL);

        /*funcctx->tuple_desc= BlessTupleDesc(fctx->lRel->rd_att);*/
 
funcctx->tuple_desc=BlessTupleDesc(RelationNameGetTupleDesc("my_first_ta
ble"));

        funcctx->user_fctx = fctx; 
        MemoryContextSwitchTo(oldcontext);
    }

    funcctx = SRF_PERCALL_SETUP();
    fctx = funcctx->user_fctx;

    HeapTuple    tuple;
    tuple = heap_getnext(fctx->scan, ForwardScanDirection);
    if (HeapTupleIsValid(tuple))
    { 
      
      Datum        result;
      Datum        *values;
      HeapTuple    tupleCopy;
      HeapTuple    tupleCopy2;
      char *nulls = (char *)palloc(funcctx->tuple_desc->natts *
sizeof(char));
      
      tupleCopy = heap_copytuple(tuple);
      heap_deformtuple(tuple,funcctx->tuple_desc,values,nulls);
      tupleCopy2 = heap_formtuple(funcctx->tuple_desc,values,nulls);
      result = HeapTupleGetDatum(tupleCopy2);
      
      SRF_RETURN_NEXT(funcctx, result);

    }
    else    /* do when there is no more left */
    {
      heap_endscan(fctx->scan);
      heap_close(fctx->lRel, AccessShareLock);
      
      SRF_RETURN_DONE(funcctx);
    }
}
Regards,
        tzahi.

> -----Original Message-----
> From: Tom Lane [mailto:[EMAIL PROTECTED] 
> Sent: Friday, January 07, 2005 10:31 PM
> To: Tzahi Fadida
> Cc: pgsql-general@postgresql.org
> Subject: Re: [GENERAL] ERROR: cache lookup failed for type 0 
> 
> 
> Tzahi Fadida <[EMAIL PROTECTED]> writes:
> > It still doesn't work. btw, I am using 8rc2.
> 
> Um.  The "clean" way to do this is to use BlessTupleDesc and 
> then heap_formtuple.  That requires you to break down the 
> original tuple into fields (see heap_deformtuple).  
> Alternatively you could poke the datatype ID fields directly 
> into the copied tuple.
> 
>                       regards, tom lane
> 
> 



---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
      subscribe-nomail command to [EMAIL PROTECTED] so that your
      message can get through to the mailing list cleanly

Reply via email to