]> granicus.if.org Git - postgresql/commitdiff
Fix dumb bug in tqueue.c
authorRobert Haas <rhaas@postgresql.org>
Wed, 18 Nov 2015 13:25:33 +0000 (08:25 -0500)
committerRobert Haas <rhaas@postgresql.org>
Wed, 18 Nov 2015 13:25:33 +0000 (08:25 -0500)
When I wrote this code originally, the intention was to recompute the
remapinfo only when the tupledesc changes.  This presumably only
happens once per query, but I copied the design pattern from other
DestReceivers.  However, due to a silly oversight on my part,
tqueue->tupledesc never got set, leading to recomputation for every
tuple.

This should improve the performance of parallel scans that return a
significant number of tuples.

Report by Amit Kapila; patch by me, reviewed by him.

src/backend/executor/tqueue.c

index 5735acf10e3356fa8def0ca9fc8aaf695492c5ca..d625b0d800ba50e34a79f941b56de58163ae5586 100644 (file)
@@ -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);