@@ -279,6 +279,13 @@ struct Tuplesortstate
279279 */
280280SortTupleComparator comparetup ;
281281
282+ /*
283+ * Alter datum1 representation in the SortTuple's array back from the
284+ * abbreviated key to the first column value.
285+ */
286+ void (* removeabbrev ) (Tuplesortstate * state ,SortTuple * stups ,
287+ int count );
288+
282289/*
283290 * Function to write a stored tuple onto tape. The representation of the
284291 * tuple on tape need not be the same as it is in memory; requirements on
@@ -540,6 +547,7 @@ struct Sharedsort
540547pfree(buf); \
541548} while(0)
542549
550+ #define REMOVEABBREV (state ,stup ,count )((*(state)->removeabbrev) (state, stup, count))
543551#define COMPARETUP (state ,a ,b )((*(state)->comparetup) (a, b, state))
544552#define WRITETUP (state ,tape ,stup )((*(state)->writetup) (state, tape, stup))
545553#define READTUP (state ,stup ,tape ,len ) ((*(state)->readtup) (state, stup, tape, len))
@@ -629,6 +637,14 @@ static void reversedirection(Tuplesortstate *state);
629637static unsignedint getlen (LogicalTape * tape ,bool eofOK );
630638static void markrunend (LogicalTape * tape );
631639static void * readtup_alloc (Tuplesortstate * state ,Size tuplen );
640+ static void removeabbrev_heap (Tuplesortstate * state ,SortTuple * stups ,
641+ int count );
642+ static void removeabbrev_cluster (Tuplesortstate * state ,SortTuple * stups ,
643+ int count );
644+ static void removeabbrev_index (Tuplesortstate * state ,SortTuple * stups ,
645+ int count );
646+ static void removeabbrev_datum (Tuplesortstate * state ,SortTuple * stups ,
647+ int count );
632648static int comparetup_heap (const SortTuple * a ,const SortTuple * b ,
633649Tuplesortstate * state );
634650static void writetup_heap (Tuplesortstate * state ,LogicalTape * tape ,
@@ -1042,6 +1058,7 @@ tuplesort_begin_heap(TupleDesc tupDesc,
10421058sortopt & TUPLESORT_RANDOMACCESS ,
10431059PARALLEL_SORT (state ));
10441060
1061+ state -> removeabbrev = removeabbrev_heap ;
10451062state -> comparetup = comparetup_heap ;
10461063state -> writetup = writetup_heap ;
10471064state -> readtup = readtup_heap ;
@@ -1117,6 +1134,7 @@ tuplesort_begin_cluster(TupleDesc tupDesc,
11171134sortopt & TUPLESORT_RANDOMACCESS ,
11181135PARALLEL_SORT (state ));
11191136
1137+ state -> removeabbrev = removeabbrev_cluster ;
11201138state -> comparetup = comparetup_cluster ;
11211139state -> writetup = writetup_cluster ;
11221140state -> readtup = readtup_cluster ;
@@ -1221,6 +1239,7 @@ tuplesort_begin_index_btree(Relation heapRel,
12211239sortopt & TUPLESORT_RANDOMACCESS ,
12221240PARALLEL_SORT (state ));
12231241
1242+ state -> removeabbrev = removeabbrev_index ;
12241243state -> comparetup = comparetup_index_btree ;
12251244state -> writetup = writetup_index ;
12261245state -> readtup = readtup_index ;
@@ -1297,6 +1316,7 @@ tuplesort_begin_index_hash(Relation heapRel,
12971316
12981317state -> nKeys = 1 ;/* Only one sort column, the hash code */
12991318
1319+ state -> removeabbrev = removeabbrev_index ;
13001320state -> comparetup = comparetup_index_hash ;
13011321state -> writetup = writetup_index ;
13021322state -> readtup = readtup_index ;
@@ -1337,6 +1357,7 @@ tuplesort_begin_index_gist(Relation heapRel,
13371357
13381358state -> nKeys = IndexRelationGetNumberOfKeyAttributes (indexRel );
13391359
1360+ state -> removeabbrev = removeabbrev_index ;
13401361state -> comparetup = comparetup_index_btree ;
13411362state -> writetup = writetup_index ;
13421363state -> readtup = readtup_index ;
@@ -1400,6 +1421,7 @@ tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation,
14001421sortopt & TUPLESORT_RANDOMACCESS ,
14011422PARALLEL_SORT (state ));
14021423
1424+ state -> removeabbrev = removeabbrev_datum ;
14031425state -> comparetup = comparetup_datum ;
14041426state -> writetup = writetup_datum ;
14051427state -> readtup = readtup_datum ;
@@ -1858,8 +1880,6 @@ tuplesort_puttupleslot(Tuplesortstate *state, TupleTableSlot *slot)
18581880else
18591881{
18601882/* Abort abbreviation */
1861- int i ;
1862-
18631883stup .datum1 = original ;
18641884
18651885/*
@@ -1871,20 +1891,7 @@ tuplesort_puttupleslot(Tuplesortstate *state, TupleTableSlot *slot)
18711891 * sorted on tape, since serialized tuples lack abbreviated keys
18721892 * (TSS_BUILDRUNS state prevents control reaching here in any case).
18731893 */
1874- for (i = 0 ;i < state -> memtupcount ;i ++ )
1875- {
1876- SortTuple * mtup = & state -> memtuples [i ];
1877-
1878- htup .t_len = ((MinimalTuple )mtup -> tuple )-> t_len +
1879- MINIMAL_TUPLE_OFFSET ;
1880- htup .t_data = (HeapTupleHeader ) ((char * )mtup -> tuple -
1881- MINIMAL_TUPLE_OFFSET );
1882-
1883- mtup -> datum1 = heap_getattr (& htup ,
1884- state -> sortKeys [0 ].ssup_attno ,
1885- state -> tupDesc ,
1886- & mtup -> isnull1 );
1887- }
1894+ REMOVEABBREV (state ,state -> memtuples ,state -> memtupcount );
18881895}
18891896
18901897puttuple_common (state ,& stup );
@@ -1943,8 +1950,6 @@ tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup)
19431950else
19441951{
19451952/* Abort abbreviation */
1946- int i ;
1947-
19481953stup .datum1 = original ;
19491954
19501955/*
@@ -1957,16 +1962,7 @@ tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup)
19571962 * (TSS_BUILDRUNS state prevents control reaching here in any
19581963 * case).
19591964 */
1960- for (i = 0 ;i < state -> memtupcount ;i ++ )
1961- {
1962- SortTuple * mtup = & state -> memtuples [i ];
1963-
1964- tup = (HeapTuple )mtup -> tuple ;
1965- mtup -> datum1 = heap_getattr (tup ,
1966- state -> indexInfo -> ii_IndexAttrNumbers [0 ],
1967- state -> tupDesc ,
1968- & mtup -> isnull1 );
1969- }
1965+ REMOVEABBREV (state ,state -> memtuples ,state -> memtupcount );
19701966}
19711967}
19721968
@@ -2023,8 +2019,6 @@ tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel,
20232019else
20242020{
20252021/* Abort abbreviation */
2026- int i ;
2027-
20282022stup .datum1 = original ;
20292023
20302024/*
@@ -2036,16 +2030,7 @@ tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel,
20362030 * sorted on tape, since serialized tuples lack abbreviated keys
20372031 * (TSS_BUILDRUNS state prevents control reaching here in any case).
20382032 */
2039- for (i = 0 ;i < state -> memtupcount ;i ++ )
2040- {
2041- SortTuple * mtup = & state -> memtuples [i ];
2042-
2043- tuple = mtup -> tuple ;
2044- mtup -> datum1 = index_getattr (tuple ,
2045- 1 ,
2046- RelationGetDescr (state -> indexRel ),
2047- & mtup -> isnull1 );
2048- }
2033+ REMOVEABBREV (state ,state -> memtuples ,state -> memtupcount );
20492034}
20502035
20512036puttuple_common (state ,& stup );
@@ -2109,8 +2094,6 @@ tuplesort_putdatum(Tuplesortstate *state, Datum val, bool isNull)
21092094else
21102095{
21112096/* Abort abbreviation */
2112- int i ;
2113-
21142097stup .datum1 = original ;
21152098
21162099/*
@@ -2123,12 +2106,7 @@ tuplesort_putdatum(Tuplesortstate *state, Datum val, bool isNull)
21232106 * (TSS_BUILDRUNS state prevents control reaching here in any
21242107 * case).
21252108 */
2126- for (i = 0 ;i < state -> memtupcount ;i ++ )
2127- {
2128- SortTuple * mtup = & state -> memtuples [i ];
2129-
2130- mtup -> datum1 = PointerGetDatum (mtup -> tuple );
2131- }
2109+ REMOVEABBREV (state ,state -> memtuples ,state -> memtupcount );
21322110}
21332111}
21342112
@@ -3985,6 +3963,26 @@ readtup_alloc(Tuplesortstate *state, Size tuplen)
39853963 * Routines specialized for HeapTuple (actually MinimalTuple) case
39863964 */
39873965
3966+ static void
3967+ removeabbrev_heap (Tuplesortstate * state ,SortTuple * stups ,int count )
3968+ {
3969+ int i ;
3970+
3971+ for (i = 0 ;i < count ;i ++ )
3972+ {
3973+ HeapTupleData htup ;
3974+
3975+ htup .t_len = ((MinimalTuple )stups [i ].tuple )-> t_len +
3976+ MINIMAL_TUPLE_OFFSET ;
3977+ htup .t_data = (HeapTupleHeader ) ((char * )stups [i ].tuple -
3978+ MINIMAL_TUPLE_OFFSET );
3979+ stups [i ].datum1 = heap_getattr (& htup ,
3980+ state -> sortKeys [0 ].ssup_attno ,
3981+ state -> tupDesc ,
3982+ & stups [i ].isnull1 );
3983+ }
3984+ }
3985+
39883986static int
39893987comparetup_heap (const SortTuple * a ,const SortTuple * b ,Tuplesortstate * state )
39903988{
@@ -4103,6 +4101,23 @@ readtup_heap(Tuplesortstate *state, SortTuple *stup,
41034101 * comparisons per a btree index definition)
41044102 */
41054103
4104+ static void
4105+ removeabbrev_cluster (Tuplesortstate * state ,SortTuple * stups ,int count )
4106+ {
4107+ int i ;
4108+
4109+ for (i = 0 ;i < count ;i ++ )
4110+ {
4111+ HeapTuple tup ;
4112+
4113+ tup = (HeapTuple )stups [i ].tuple ;
4114+ stups [i ].datum1 = heap_getattr (tup ,
4115+ state -> indexInfo -> ii_IndexAttrNumbers [0 ],
4116+ state -> tupDesc ,
4117+ & stups [i ].isnull1 );
4118+ }
4119+ }
4120+
41064121static int
41074122comparetup_cluster (const SortTuple * a ,const SortTuple * b ,
41084123Tuplesortstate * state )
@@ -4272,6 +4287,23 @@ readtup_cluster(Tuplesortstate *state, SortTuple *stup,
42724287 * functions can be shared.
42734288 */
42744289
4290+ static void
4291+ removeabbrev_index (Tuplesortstate * state ,SortTuple * stups ,int count )
4292+ {
4293+ int i ;
4294+
4295+ for (i = 0 ;i < count ;i ++ )
4296+ {
4297+ IndexTuple tuple ;
4298+
4299+ tuple = stups [i ].tuple ;
4300+ stups [i ].datum1 = index_getattr (tuple ,
4301+ 1 ,
4302+ RelationGetDescr (state -> indexRel ),
4303+ & stups [i ].isnull1 );
4304+ }
4305+ }
4306+
42754307static int
42764308comparetup_index_btree (const SortTuple * a ,const SortTuple * b ,
42774309Tuplesortstate * state )
@@ -4504,6 +4536,15 @@ readtup_index(Tuplesortstate *state, SortTuple *stup,
45044536 * Routines specialized for DatumTuple case
45054537 */
45064538
4539+ static void
4540+ removeabbrev_datum (Tuplesortstate * state ,SortTuple * stups ,int count )
4541+ {
4542+ int i ;
4543+
4544+ for (i = 0 ;i < count ;i ++ )
4545+ stups [i ].datum1 = PointerGetDatum (stups [i ].tuple );
4546+ }
4547+
45074548static int
45084549comparetup_datum (const SortTuple * a ,const SortTuple * b ,Tuplesortstate * state )
45094550{