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
{
SortSupport sortKey = sortKeys + i;
ScanKey scanKey = wstate->inskey->scankeys + i;
- int16 strategy;
+ bool reverse;
sortKey->ssup_cxt = CurrentMemoryContext;
sortKey->ssup_collation = scanKey->sk_collation;
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 (;;)
}
/*
- * 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];
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);
}
{
SortSupport sortKey = base->sortKeys + i;
ScanKey scanKey = indexScanKey->scankeys + i;
- int16 strategy;
+ bool reverse;
sortKey->ssup_cxt = CurrentMemoryContext;
sortKey->ssup_collation = scanKey->sk_collation;
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);
{
SortSupport sortKey = base->sortKeys + i;
ScanKey scanKey = indexScanKey->scankeys + i;
- int16 strategy;
+ bool reverse;
sortKey->ssup_cxt = CurrentMemoryContext;
sortKey->ssup_collation = scanKey->sk_collation;
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);
/* 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);