1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-07 00:36:50 +03:00

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
This commit is contained in:
Peter Eisentraut
2024-10-14 15:36:18 +02:00
parent 0d2aa4d493
commit c594f1ad2b
3 changed files with 12 additions and 17 deletions

View File

@ -175,7 +175,7 @@ static MergeJoinClause
MJExamineQuals(List *mergeclauses, MJExamineQuals(List *mergeclauses,
Oid *mergefamilies, Oid *mergefamilies,
Oid *mergecollations, Oid *mergecollations,
int *mergestrategies, bool *mergereversals,
bool *mergenullsfirst, bool *mergenullsfirst,
PlanState *parent) PlanState *parent)
{ {
@ -193,7 +193,7 @@ MJExamineQuals(List *mergeclauses,
MergeJoinClause clause = &clauses[iClause]; MergeJoinClause clause = &clauses[iClause];
Oid opfamily = mergefamilies[iClause]; Oid opfamily = mergefamilies[iClause];
Oid collation = mergecollations[iClause]; Oid collation = mergecollations[iClause];
StrategyNumber opstrategy = mergestrategies[iClause]; bool reversed = mergereversals[iClause];
bool nulls_first = mergenullsfirst[iClause]; bool nulls_first = mergenullsfirst[iClause];
int op_strategy; int op_strategy;
Oid op_lefttype; Oid op_lefttype;
@ -212,12 +212,7 @@ MJExamineQuals(List *mergeclauses,
/* Set up sort support data */ /* Set up sort support data */
clause->ssup.ssup_cxt = CurrentMemoryContext; clause->ssup.ssup_cxt = CurrentMemoryContext;
clause->ssup.ssup_collation = collation; clause->ssup.ssup_collation = collation;
if (opstrategy == BTLessStrategyNumber) clause->ssup.ssup_reverse = reversed;
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_nulls_first = nulls_first; clause->ssup.ssup_nulls_first = nulls_first;
/* Extract the operator's declared left/right datatypes */ /* 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, mergestate->mj_Clauses = MJExamineQuals(node->mergeclauses,
node->mergeFamilies, node->mergeFamilies,
node->mergeCollations, node->mergeCollations,
node->mergeStrategies, node->mergeReversals,
node->mergeNullsFirst, node->mergeNullsFirst,
(PlanState *) mergestate); (PlanState *) mergestate);

View File

@ -252,7 +252,7 @@ static MergeJoin *make_mergejoin(List *tlist,
List *mergeclauses, List *mergeclauses,
Oid *mergefamilies, Oid *mergefamilies,
Oid *mergecollations, Oid *mergecollations,
int *mergestrategies, bool *mergereversals,
bool *mergenullsfirst, bool *mergenullsfirst,
Plan *lefttree, Plan *righttree, Plan *lefttree, Plan *righttree,
JoinType jointype, bool inner_unique, JoinType jointype, bool inner_unique,
@ -4451,7 +4451,7 @@ create_mergejoin_plan(PlannerInfo *root,
int nClauses; int nClauses;
Oid *mergefamilies; Oid *mergefamilies;
Oid *mergecollations; Oid *mergecollations;
int *mergestrategies; bool *mergereversals;
bool *mergenullsfirst; bool *mergenullsfirst;
PathKey *opathkey; PathKey *opathkey;
EquivalenceClass *opeclass; EquivalenceClass *opeclass;
@ -4625,7 +4625,7 @@ create_mergejoin_plan(PlannerInfo *root,
Assert(nClauses == list_length(best_path->path_mergeclauses)); Assert(nClauses == list_length(best_path->path_mergeclauses));
mergefamilies = (Oid *) palloc(nClauses * sizeof(Oid)); mergefamilies = (Oid *) palloc(nClauses * sizeof(Oid));
mergecollations = (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)); mergenullsfirst = (bool *) palloc(nClauses * sizeof(bool));
opathkey = NULL; opathkey = NULL;
@ -4752,7 +4752,7 @@ create_mergejoin_plan(PlannerInfo *root,
/* OK, save info for executor */ /* OK, save info for executor */
mergefamilies[i] = opathkey->pk_opfamily; mergefamilies[i] = opathkey->pk_opfamily;
mergecollations[i] = opathkey->pk_eclass->ec_collation; 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; mergenullsfirst[i] = opathkey->pk_nulls_first;
i++; i++;
} }
@ -4772,7 +4772,7 @@ create_mergejoin_plan(PlannerInfo *root,
mergeclauses, mergeclauses,
mergefamilies, mergefamilies,
mergecollations, mergecollations,
mergestrategies, mergereversals,
mergenullsfirst, mergenullsfirst,
outer_plan, outer_plan,
inner_plan, inner_plan,
@ -6104,7 +6104,7 @@ make_mergejoin(List *tlist,
List *mergeclauses, List *mergeclauses,
Oid *mergefamilies, Oid *mergefamilies,
Oid *mergecollations, Oid *mergecollations,
int *mergestrategies, bool *mergereversals,
bool *mergenullsfirst, bool *mergenullsfirst,
Plan *lefttree, Plan *lefttree,
Plan *righttree, Plan *righttree,
@ -6123,7 +6123,7 @@ make_mergejoin(List *tlist,
node->mergeclauses = mergeclauses; node->mergeclauses = mergeclauses;
node->mergeFamilies = mergefamilies; node->mergeFamilies = mergefamilies;
node->mergeCollations = mergecollations; node->mergeCollations = mergecollations;
node->mergeStrategies = mergestrategies; node->mergeReversals = mergereversals;
node->mergeNullsFirst = mergenullsfirst; node->mergeNullsFirst = mergenullsfirst;
node->join.jointype = jointype; node->join.jointype = jointype;
node->join.inner_unique = inner_unique; node->join.inner_unique = inner_unique;

View File

@ -850,7 +850,7 @@ typedef struct MergeJoin
Oid *mergeCollations pg_node_attr(array_size(mergeclauses)); Oid *mergeCollations pg_node_attr(array_size(mergeclauses));
/* per-clause ordering (ASC or DESC) */ /* 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 */ /* per-clause nulls ordering */
bool *mergeNullsFirst pg_node_attr(array_size(mergeclauses)); bool *mergeNullsFirst pg_node_attr(array_size(mergeclauses));