]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Simplify and generalize PrepareSortSupportFromIndexRel()
authorPeter Eisentraut <peter@eisentraut.org>
Fri, 14 Mar 2025 09:34:08 +0000 (10:34 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Fri, 14 Mar 2025 09:34:08 +0000 (10:34 +0100)
PrepareSortSupportFromIndexRel() was accepting btree strategy numbers
purely for the purpose of comparing it later against btree strategies
to determine if the sort direction was forward or reverse.  Change
that.  Instead, pass a bool directly, to indicate the same without an
unfortunate assumption that a strategy number refers specifically to a
btree strategy.  (This is similar in spirit to commits 0d2aa4d4937 and
c594f1ad2ba.)

(This could arguably be simplfied further by having the callers fill
in ssup_reverse directly.  But this way, it preserves consistency by
having all PrepareSortSupport*() variants be responsible for filling
in ssup_reverse.)

Moreover, remove the hardcoded check against BTREE_AM_OID, and check
against amcanorder instead, which is the actual requirement.

Co-authored-by: Mark Dilger <mark.dilger@enterprisedb.com>
Discussion: https://www.postgresql.org/message-id/flat/E72EAA49-354D-4C2E-8EB9-255197F55330@enterprisedb.com

src/backend/access/nbtree/nbtsort.c
src/backend/utils/sort/sortsupport.c
src/backend/utils/sort/tuplesortvariants.c
src/include/utils/sortsupport.h

index fa336ba00963808e06e69ad26480d2c340bd2282..3794cc924ad467366db61e75d07fb286c86ef6cb 100644 (file)
@@ -1171,7 +1171,7 @@ _bt_load(BTWriteState *wstate, BTSpool *btspool, BTSpool *btspool2)
                {
                        SortSupport sortKey = sortKeys + i;
                        ScanKey         scanKey = wstate->inskey->scankeys + i;
-                       int16           strategy;
+                       bool            reverse;
 
                        sortKey->ssup_cxt = CurrentMemoryContext;
                        sortKey->ssup_collation = scanKey->sk_collation;
@@ -1183,10 +1183,9 @@ _bt_load(BTWriteState *wstate, BTSpool *btspool, BTSpool *btspool2)
 
                        Assert(sortKey->ssup_attno != 0);
 
-                       strategy = (scanKey->sk_flags & SK_BT_DESC) != 0 ?
-                               BTGreaterStrategyNumber : BTLessStrategyNumber;
+                       reverse = (scanKey->sk_flags & SK_BT_DESC) != 0;
 
-                       PrepareSortSupportFromIndexRel(wstate->index, strategy, sortKey);
+                       PrepareSortSupportFromIndexRel(wstate->index, reverse, sortKey);
                }
 
                for (;;)
index 6037031eaa3979543de94baa65ff8a03aca55e8c..0b4f08ed2ec50f1fd464b1bcbe23ba353aebfc08 100644 (file)
@@ -150,15 +150,15 @@ PrepareSortSupportFromOrderingOp(Oid orderingOp, SortSupport ssup)
 }
 
 /*
- * Fill in SortSupport given an index relation, attribute, and strategy.
+ * Fill in SortSupport given an index relation and attribute.
  *
  * Caller must previously have zeroed the SortSupportData structure and then
  * filled in ssup_cxt, ssup_attno, ssup_collation, and ssup_nulls_first.  This
- * will fill in ssup_reverse (based on the supplied strategy), as well as the
+ * will fill in ssup_reverse (based on the supplied argument), as well as the
  * comparator function pointer.
  */
 void
-PrepareSortSupportFromIndexRel(Relation indexRel, int16 strategy,
+PrepareSortSupportFromIndexRel(Relation indexRel, bool reverse,
                                                           SortSupport ssup)
 {
        Oid                     opfamily = indexRel->rd_opfamily[ssup->ssup_attno - 1];
@@ -166,12 +166,9 @@ PrepareSortSupportFromIndexRel(Relation indexRel, int16 strategy,
 
        Assert(ssup->comparator == NULL);
 
-       if (indexRel->rd_rel->relam != BTREE_AM_OID)
-               elog(ERROR, "unexpected non-btree AM: %u", indexRel->rd_rel->relam);
-       if (strategy != BTGreaterStrategyNumber &&
-               strategy != BTLessStrategyNumber)
-               elog(ERROR, "unexpected sort support strategy: %d", strategy);
-       ssup->ssup_reverse = (strategy == BTGreaterStrategyNumber);
+       if (!indexRel->rd_indam->amcanorder)
+               elog(ERROR, "unexpected non-amcanorder AM: %u", indexRel->rd_rel->relam);
+       ssup->ssup_reverse = reverse;
 
        FinishSortSupportFunction(opfamily, opcintype, ssup);
 }
index eb8601e22573b009849cd09685249f4ce3959127..4059af5bb7189b7a6fd795c579b34e8b760caeef 100644 (file)
@@ -329,7 +329,7 @@ tuplesort_begin_cluster(TupleDesc tupDesc,
        {
                SortSupport sortKey = base->sortKeys + i;
                ScanKey         scanKey = indexScanKey->scankeys + i;
-               int16           strategy;
+               bool            reverse;
 
                sortKey->ssup_cxt = CurrentMemoryContext;
                sortKey->ssup_collation = scanKey->sk_collation;
@@ -341,10 +341,9 @@ tuplesort_begin_cluster(TupleDesc tupDesc,
 
                Assert(sortKey->ssup_attno != 0);
 
-               strategy = (scanKey->sk_flags & SK_BT_DESC) != 0 ?
-                       BTGreaterStrategyNumber : BTLessStrategyNumber;
+               reverse = (scanKey->sk_flags & SK_BT_DESC) != 0;
 
-               PrepareSortSupportFromIndexRel(indexRel, strategy, sortKey);
+               PrepareSortSupportFromIndexRel(indexRel, reverse, sortKey);
        }
 
        pfree(indexScanKey);
@@ -412,7 +411,7 @@ tuplesort_begin_index_btree(Relation heapRel,
        {
                SortSupport sortKey = base->sortKeys + i;
                ScanKey         scanKey = indexScanKey->scankeys + i;
-               int16           strategy;
+               bool            reverse;
 
                sortKey->ssup_cxt = CurrentMemoryContext;
                sortKey->ssup_collation = scanKey->sk_collation;
@@ -424,10 +423,9 @@ tuplesort_begin_index_btree(Relation heapRel,
 
                Assert(sortKey->ssup_attno != 0);
 
-               strategy = (scanKey->sk_flags & SK_BT_DESC) != 0 ?
-                       BTGreaterStrategyNumber : BTLessStrategyNumber;
+               reverse = (scanKey->sk_flags & SK_BT_DESC) != 0;
 
-               PrepareSortSupportFromIndexRel(indexRel, strategy, sortKey);
+               PrepareSortSupportFromIndexRel(indexRel, reverse, sortKey);
        }
 
        pfree(indexScanKey);
index 51200db8ae95fa8232b353b3c04889cf16d88c84..b7abaf7802de0c63631c422d5ec05f6dff00b268 100644 (file)
@@ -384,7 +384,7 @@ extern int  ssup_datum_int32_cmp(Datum x, Datum y, SortSupport ssup);
 /* Other functions in utils/sort/sortsupport.c */
 extern void PrepareSortSupportComparisonShim(Oid cmpFunc, SortSupport ssup);
 extern void PrepareSortSupportFromOrderingOp(Oid orderingOp, SortSupport ssup);
-extern void PrepareSortSupportFromIndexRel(Relation indexRel, int16 strategy,
+extern void PrepareSortSupportFromIndexRel(Relation indexRel, bool reverse,
                                                                                   SortSupport ssup);
 extern void PrepareSortSupportFromGistIndexRel(Relation indexRel, SortSupport ssup);