Skip to content

Commit c594f1a

Browse files
committed
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]
1 parent 0d2aa4d commit c594f1a

File tree

3 files changed

+12
-17
lines changed

3 files changed

+12
-17
lines changed

src/backend/executor/nodeMergejoin.c

+4-9
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ static MergeJoinClause
175175
MJExamineQuals(List *mergeclauses,
176176
Oid *mergefamilies,
177177
Oid *mergecollations,
178-
int *mergestrategies,
178+
bool *mergereversals,
179179
bool *mergenullsfirst,
180180
PlanState *parent)
181181
{
@@ -193,7 +193,7 @@ MJExamineQuals(List *mergeclauses,
193193
MergeJoinClause clause = &clauses[iClause];
194194
Oid opfamily = mergefamilies[iClause];
195195
Oid collation = mergecollations[iClause];
196-
StrategyNumber opstrategy = mergestrategies[iClause];
196+
bool reversed = mergereversals[iClause];
197197
bool nulls_first = mergenullsfirst[iClause];
198198
int op_strategy;
199199
Oid op_lefttype;
@@ -212,12 +212,7 @@ MJExamineQuals(List *mergeclauses,
212212
/* Set up sort support data */
213213
clause->ssup.ssup_cxt = CurrentMemoryContext;
214214
clause->ssup.ssup_collation = collation;
215-
if (opstrategy == BTLessStrategyNumber)
216-
clause->ssup.ssup_reverse = false;
217-
else if (opstrategy == BTGreaterStrategyNumber)
218-
clause->ssup.ssup_reverse = true;
219-
else /* planner screwed up */
220-
elog(ERROR, "unsupported mergejoin strategy %d", opstrategy);
215+
clause->ssup.ssup_reverse = reversed;
221216
clause->ssup.ssup_nulls_first = nulls_first;
222217

223218
/* Extract the operator's declared left/right datatypes */
@@ -1608,7 +1603,7 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
16081603
mergestate->mj_Clauses = MJExamineQuals(node->mergeclauses,
16091604
node->mergeFamilies,
16101605
node->mergeCollations,
1611-
node->mergeStrategies,
1606+
node->mergeReversals,
16121607
node->mergeNullsFirst,
16131608
(PlanState *) mergestate);
16141609

src/backend/optimizer/plan/createplan.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ static MergeJoin *make_mergejoin(List *tlist,
252252
List *mergeclauses,
253253
Oid *mergefamilies,
254254
Oid *mergecollations,
255-
int *mergestrategies,
255+
bool *mergereversals,
256256
bool *mergenullsfirst,
257257
Plan *lefttree, Plan *righttree,
258258
JoinType jointype, bool inner_unique,
@@ -4451,7 +4451,7 @@ create_mergejoin_plan(PlannerInfo *root,
44514451
int nClauses;
44524452
Oid *mergefamilies;
44534453
Oid *mergecollations;
4454-
int *mergestrategies;
4454+
bool *mergereversals;
44554455
bool *mergenullsfirst;
44564456
PathKey *opathkey;
44574457
EquivalenceClass *opeclass;
@@ -4625,7 +4625,7 @@ create_mergejoin_plan(PlannerInfo *root,
46254625
Assert(nClauses == list_length(best_path->path_mergeclauses));
46264626
mergefamilies = (Oid *) palloc(nClauses * sizeof(Oid));
46274627
mergecollations = (Oid *) palloc(nClauses * sizeof(Oid));
4628-
mergestrategies = (int *) palloc(nClauses * sizeof(int));
4628+
mergereversals = (bool *) palloc(nClauses * sizeof(bool));
46294629
mergenullsfirst = (bool *) palloc(nClauses * sizeof(bool));
46304630

46314631
opathkey = NULL;
@@ -4752,7 +4752,7 @@ create_mergejoin_plan(PlannerInfo *root,
47524752
/* OK, save info for executor */
47534753
mergefamilies[i] = opathkey->pk_opfamily;
47544754
mergecollations[i] = opathkey->pk_eclass->ec_collation;
4755-
mergestrategies[i] = opathkey->pk_strategy;
4755+
mergereversals[i] = (opathkey->pk_strategy == BTGreaterStrategyNumber ? true : false);
47564756
mergenullsfirst[i] = opathkey->pk_nulls_first;
47574757
i++;
47584758
}
@@ -4772,7 +4772,7 @@ create_mergejoin_plan(PlannerInfo *root,
47724772
mergeclauses,
47734773
mergefamilies,
47744774
mergecollations,
4775-
mergestrategies,
4775+
mergereversals,
47764776
mergenullsfirst,
47774777
outer_plan,
47784778
inner_plan,
@@ -6104,7 +6104,7 @@ make_mergejoin(List *tlist,
61046104
List *mergeclauses,
61056105
Oid *mergefamilies,
61066106
Oid *mergecollations,
6107-
int *mergestrategies,
6107+
bool *mergereversals,
61086108
bool *mergenullsfirst,
61096109
Plan *lefttree,
61106110
Plan *righttree,
@@ -6123,7 +6123,7 @@ make_mergejoin(List *tlist,
61236123
node->mergeclauses = mergeclauses;
61246124
node->mergeFamilies = mergefamilies;
61256125
node->mergeCollations = mergecollations;
6126-
node->mergeStrategies = mergestrategies;
6126+
node->mergeReversals = mergereversals;
61276127
node->mergeNullsFirst = mergenullsfirst;
61286128
node->join.jointype = jointype;
61296129
node->join.inner_unique = inner_unique;

src/include/nodes/plannodes.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,7 @@ typedef struct MergeJoin
850850
Oid *mergeCollations pg_node_attr(array_size(mergeclauses));
851851

852852
/* per-clause ordering (ASC or DESC) */
853-
int *mergeStrategies pg_node_attr(array_size(mergeclauses));
853+
bool *mergeReversals pg_node_attr(array_size(mergeclauses));
854854

855855
/* per-clause nulls ordering */
856856
bool *mergeNullsFirst pg_node_attr(array_size(mergeclauses));

0 commit comments

Comments
 (0)