On Mon, Nov 16, 2015 at 9:49 PM, Amit Kapila <amit.kapil...@gmail.com> wrote: >> I don't understand this part. >> > > The code in question is as below: > > tqueueReceiveSlot(TupleTableSlot *slot, DestReceiver *self) > > { > .. > > if (tqueue->tupledesc != tupledesc || > > tqueue->remapinfo->natts != tupledesc->natts) > > { > > if (tqueue->remapinfo != NULL) > > pfree(tqueue->remapinfo); > > tqueue->remapinfo = BuildRemapInfo(tupledesc); > > } > > .. > } > > Here the above check always passes as tqueue->tupledesc is not > set due to which it always try to build remap info. Is there any reason > for doing so?
Groan. The problem here is that tqueue->tupledesc never gets set. I think this should be fixed as in the attached. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
diff --git a/src/backend/executor/tqueue.c b/src/backend/executor/tqueue.c index 5735acf..d625b0d 100644 --- a/src/backend/executor/tqueue.c +++ b/src/backend/executor/tqueue.c @@ -127,15 +127,15 @@ tqueueReceiveSlot(TupleTableSlot *slot, DestReceiver *self) * new tupledesc. This is a strange test both because the executor really * shouldn't change the tupledesc, and also because it would be unsafe if * the old tupledesc could be freed and a new one allocated at the same - * address. But since some very old code in printtup.c uses this test, we - * adopt it here as well. + * address. But since some very old code in printtup.c uses a similar + * test, we adopt it here as well. */ - if (tqueue->tupledesc != tupledesc || - tqueue->remapinfo->natts != tupledesc->natts) + if (tqueue->tupledesc != tupledesc) { if (tqueue->remapinfo != NULL) pfree(tqueue->remapinfo); tqueue->remapinfo = BuildRemapInfo(tupledesc); + tqueue->tupledesc = tupledesc; } tuple = ExecMaterializeSlot(slot);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers