summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorPeter Eisentraut2024-10-14 13:36:18 +0000
committerPeter Eisentraut2024-10-14 13:36:18 +0000
commitc594f1ad2ba7cbe66e8ae98da4ffed06491d1082 (patch)
tree12d7f1656a8c301219a0ec36a88d483e2f2879ca /src/backend
parent0d2aa4d4937bb0500823edfc7d620f4e5fa45b9c (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 <mark.dilger@enterprisedb.com> Discussion: https://www.postgresql.org/message-id/flat/E72EAA49-354D-4C2E-8EB9-255197F55330@enterprisedb.com
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/executor/nodeMergejoin.c13
-rw-r--r--src/backend/optimizer/plan/createplan.c14
2 files changed, 11 insertions, 16 deletions
diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c
index 29c54fcd753..b593905978b 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 bd54a0d032d..f2ed0d81f61 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;