]> granicus.if.org Git - postgresql/commitdiff
tqueue.c's record-typmod hashtables need the HASH_BLOBS option.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 28 Jul 2016 06:08:52 +0000 (02:08 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 28 Jul 2016 06:08:52 +0000 (02:08 -0400)
The keys are integers, not strings.  The code accidentally worked on
little-endian machines, at least up to 256 distinct record types within
a session, but failed utterly on big-endian.  This was unexpectedly
exposed by a test case added by commit 4452000f3, which apparently is the
only parallelizable query in the regression suite that uses more than one
anonymous record type.  Fortunately, buildfarm member mandrill is
big-endian and is running with force_parallel_mode on, so it failed.

src/backend/executor/tqueue.c

index a729372c740d431afe45e203c145c450ea0ed8bd..d29fd2afde430c8e51ec058d7a02b55d97972bea 100644 (file)
@@ -402,7 +402,8 @@ tqueueSendTypmodInfo(TQueueDestReceiver *tqueue, int typmod,
                ctl.entrysize = sizeof(int);
                ctl.hcxt = TopMemoryContext;
                tqueue->recordhtab = hash_create("tqueue record hashtable",
-                                                                                100, &ctl, HASH_ELEM | HASH_CONTEXT);
+                                                                                100, &ctl,
+                                                                         HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
        }
 
        /* Have we already seen this record type?  If not, must report it. */
@@ -877,7 +878,8 @@ TupleQueueHandleControlMessage(TupleQueueReader *reader, Size nbytes,
                ctl.entrysize = sizeof(RecordTypemodMap);
                ctl.hcxt = CurTransactionContext;
                reader->typmodmap = hash_create("typmodmap hashtable",
-                                                                               100, &ctl, HASH_ELEM | HASH_CONTEXT);
+                                                                               100, &ctl,
+                                                                         HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
        }
 
        /* Create map entry. */