diff options
author | Peter Eisentraut | 2024-10-14 13:36:18 +0000 |
---|---|---|
committer | Peter Eisentraut | 2024-10-14 13:36:18 +0000 |
commit | c594f1ad2ba7cbe66e8ae98da4ffed06491d1082 (patch) | |
tree | 12d7f1656a8c301219a0ec36a88d483e2f2879ca | |
parent | 0d2aa4d4937bb0500823edfc7d620f4e5fa45b9c (diff) |
Track scan reversals in MergeJoin
The MergeJoin struct was tracking "mergeStrategies", which were an
array of btree strategy numbers, purely for the purpose of comparing
it later against btree strategies to determine if the scan direction
was forward or reverse. Change that. Instead, track
"mergeReversals", an array of bool, to indicate the same without an
unfortunate assumption that a strategy number refers specifically to a
btree strategy.
Author: Mark Dilger <[email protected]>
Discussion: https://www.postgresql.org/message-id/flat/[email protected]
-rw-r--r-- | src/backend/executor/nodeMergejoin.c | 13 | ||||
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 14 | ||||
-rw-r--r-- | src/include/nodes/plannodes.h | 2 |
3 files changed, 12 insertions, 17 deletions
diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c index 29c54fcd75..b593905978 100644 --- a/src/backend/executor/nodeMergejoin.c +++ b/src/backend/executor/nodeMergejoin.c @@ -175,7 +175,7 @@ static MergeJoinClause MJExamineQuals(List *mergeclauses, Oid *mergefamilies, Oid *mergecollations, - int *mergestrategies, + bool *mergereversals, bool *mergenullsfirst, PlanState *parent) { @@ -193,7 +193,7 @@ MJExamineQuals(List *mergeclauses, MergeJoinClause clause = &clauses[iClause]; Oid opfamily = mergefamilies[iClause]; Oid collation = mergecollations[iClause]; - StrategyNumber opstrategy = mergestrategies[iClause]; + bool reversed = mergereversals[iClause]; bool nulls_first = mergenullsfirst[iClause]; int op_strategy; Oid op_lefttype; @@ -212,12 +212,7 @@ MJExamineQuals(List *mergeclauses, /* Set up sort support data */ clause->ssup.ssup_cxt = CurrentMemoryContext; clause->ssup.ssup_collation = collation; - if (opstrategy == BTLessStrategyNumber) - clause->ssup.ssup_reverse = false; - else if (opstrategy == BTGreaterStrategyNumber) - clause->ssup.ssup_reverse = true; - else /* planner screwed up */ - elog(ERROR, "unsupported mergejoin strategy %d", opstrategy); + clause->ssup.ssup_reverse = reversed; clause->ssup.ssup_nulls_first = nulls_first; /* Extract the operator's declared left/right datatypes */ @@ -1608,7 +1603,7 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags) mergestate->mj_Clauses = MJExamineQuals(node->mergeclauses, node->mergeFamilies, node->mergeCollations, - node->mergeStrategies, + node->mergeReversals, node->mergeNullsFirst, (PlanState *) mergestate); diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index bd54a0d032..f2ed0d81f6 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -252,7 +252,7 @@ static MergeJoin *make_mergejoin(List *tlist, List *mergeclauses, Oid *mergefamilies, Oid *mergecollations, - int *mergestrategies, + bool *mergereversals, bool *mergenullsfirst, Plan *lefttree, Plan *righttree, JoinType jointype, bool inner_unique, @@ -4451,7 +4451,7 @@ create_mergejoin_plan(PlannerInfo *root, int nClauses; Oid *mergefamilies; Oid *mergecollations; - int *mergestrategies; + bool *mergereversals; bool *mergenullsfirst; PathKey *opathkey; EquivalenceClass *opeclass; @@ -4625,7 +4625,7 @@ create_mergejoin_plan(PlannerInfo *root, Assert(nClauses == list_length(best_path->path_mergeclauses)); mergefamilies = (Oid *) palloc(nClauses * sizeof(Oid)); mergecollations = (Oid *) palloc(nClauses * sizeof(Oid)); - mergestrategies = (int *) palloc(nClauses * sizeof(int)); + mergereversals = (bool *) palloc(nClauses * sizeof(bool)); mergenullsfirst = (bool *) palloc(nClauses * sizeof(bool)); opathkey = NULL; @@ -4752,7 +4752,7 @@ create_mergejoin_plan(PlannerInfo *root, /* OK, save info for executor */ mergefamilies[i] = opathkey->pk_opfamily; mergecollations[i] = opathkey->pk_eclass->ec_collation; - mergestrategies[i] = opathkey->pk_strategy; + mergereversals[i] = (opathkey->pk_strategy == BTGreaterStrategyNumber ? true : false); mergenullsfirst[i] = opathkey->pk_nulls_first; i++; } @@ -4772,7 +4772,7 @@ create_mergejoin_plan(PlannerInfo *root, mergeclauses, mergefamilies, mergecollations, - mergestrategies, + mergereversals, mergenullsfirst, outer_plan, inner_plan, @@ -6104,7 +6104,7 @@ make_mergejoin(List *tlist, List *mergeclauses, Oid *mergefamilies, Oid *mergecollations, - int *mergestrategies, + bool *mergereversals, bool *mergenullsfirst, Plan *lefttree, Plan *righttree, @@ -6123,7 +6123,7 @@ make_mergejoin(List *tlist, node->mergeclauses = mergeclauses; node->mergeFamilies = mergefamilies; node->mergeCollations = mergecollations; - node->mergeStrategies = mergestrategies; + node->mergeReversals = mergereversals; node->mergeNullsFirst = mergenullsfirst; node->join.jointype = jointype; node->join.inner_unique = inner_unique; diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index 62cd6a6666..52f29bcdb6 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -850,7 +850,7 @@ typedef struct MergeJoin Oid *mergeCollations pg_node_attr(array_size(mergeclauses)); /* per-clause ordering (ASC or DESC) */ - int *mergeStrategies pg_node_attr(array_size(mergeclauses)); + bool *mergeReversals pg_node_attr(array_size(mergeclauses)); /* per-clause nulls ordering */ bool *mergeNullsFirst pg_node_attr(array_size(mergeclauses)); |