Skip to content

Commit

Permalink
opt: add setting for provided ordering fix
Browse files Browse the repository at this point in the history
This patch adds a new session setting, `optimizer_use_provided_ordering_fix`,
which toggles whether to use the `finalizeProvided` function introduced in
required ordering. This setting is on by default, and will be used when
backporting cockroachdb#100776.

Informs cockroachdb#113072

Release note: None
  • Loading branch information
DrewKimball committed Oct 26, 2023
1 parent 503f8a4 commit 9b408a3
Show file tree
Hide file tree
Showing 13 changed files with 52 additions and 5 deletions.
4 changes: 4 additions & 0 deletions pkg/sql/exec_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -3423,6 +3423,10 @@ func (m *sessionDataMutator) SetAllowRoleMembershipsToChangeDuringTransaction(va
m.data.AllowRoleMembershipsToChangeDuringTransaction = val
}

func (m *sessionDataMutator) SetOptimizerUseProvidedOrderingFix(val bool) {
m.data.OptimizerUseProvidedOrderingFix = val
}

// Utility functions related to scrubbing sensitive information on SQL Stats.

// quantizeCounts ensures that the Count field in the
Expand Down
1 change: 1 addition & 0 deletions pkg/sql/logictest/testdata/logic_test/information_schema
Original file line number Diff line number Diff line change
Expand Up @@ -4810,6 +4810,7 @@ optimizer_use_improved_split_disjunction_for_joins off
optimizer_use_limit_ordering_for_streaming_group_by off
optimizer_use_multicol_stats on
optimizer_use_not_visible_indexes off
optimizer_use_provided_ordering_fix on
override_multi_region_zone_config off
parallelize_multi_key_lookup_joins_enabled off
password_encryption scram-sha-256
Expand Down
3 changes: 3 additions & 0 deletions pkg/sql/logictest/testdata/logic_test/pg_catalog
Original file line number Diff line number Diff line change
Expand Up @@ -2855,6 +2855,7 @@ optimizer_use_improved_split_disjunction_for_joins off N
optimizer_use_limit_ordering_for_streaming_group_by off NULL NULL NULL string
optimizer_use_multicol_stats on NULL NULL NULL string
optimizer_use_not_visible_indexes off NULL NULL NULL string
optimizer_use_provided_ordering_fix on NULL NULL NULL string
override_multi_region_zone_config off NULL NULL NULL string
parallelize_multi_key_lookup_joins_enabled off NULL NULL NULL string
password_encryption scram-sha-256 NULL NULL NULL string
Expand Down Expand Up @@ -3003,6 +3004,7 @@ optimizer_use_improved_split_disjunction_for_joins off N
optimizer_use_limit_ordering_for_streaming_group_by off NULL user NULL off off
optimizer_use_multicol_stats on NULL user NULL on on
optimizer_use_not_visible_indexes off NULL user NULL off off
optimizer_use_provided_ordering_fix on NULL user NULL on on
override_multi_region_zone_config off NULL user NULL off off
parallelize_multi_key_lookup_joins_enabled off NULL user NULL false false
password_encryption scram-sha-256 NULL user NULL scram-sha-256 scram-sha-256
Expand Down Expand Up @@ -3149,6 +3151,7 @@ optimizer_use_improved_split_disjunction_for_joins NULL NULL NULL
optimizer_use_limit_ordering_for_streaming_group_by NULL NULL NULL NULL NULL
optimizer_use_multicol_stats NULL NULL NULL NULL NULL
optimizer_use_not_visible_indexes NULL NULL NULL NULL NULL
optimizer_use_provided_ordering_fix NULL NULL NULL NULL NULL
override_multi_region_zone_config NULL NULL NULL NULL NULL
parallelize_multi_key_lookup_joins_enabled NULL NULL NULL NULL NULL
password_encryption NULL NULL NULL NULL NULL
Expand Down
1 change: 1 addition & 0 deletions pkg/sql/logictest/testdata/logic_test/show_source
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ optimizer_use_improved_split_disjunction_for_joins off
optimizer_use_limit_ordering_for_streaming_group_by off
optimizer_use_multicol_stats on
optimizer_use_not_visible_indexes off
optimizer_use_provided_ordering_fix on
override_multi_region_zone_config off
parallelize_multi_key_lookup_joins_enabled off
password_encryption scram-sha-256
Expand Down
5 changes: 4 additions & 1 deletion pkg/sql/opt/memo/memo.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ type Memo struct {
alwaysUseHistograms bool
hoistUncorrelatedEqualitySubqueries bool
useImprovedComputedColumnFiltersDerivation bool
useProvidedOrderingFix bool

// curRank is the highest currently in-use scalar expression rank.
curRank opt.ScalarRank
Expand Down Expand Up @@ -225,6 +226,7 @@ func (m *Memo) Init(evalCtx *eval.Context) {
alwaysUseHistograms: evalCtx.SessionData().OptimizerAlwaysUseHistograms,
hoistUncorrelatedEqualitySubqueries: evalCtx.SessionData().OptimizerHoistUncorrelatedEqualitySubqueries,
useImprovedComputedColumnFiltersDerivation: evalCtx.SessionData().OptimizerUseImprovedComputedColumnFiltersDerivation,
useProvidedOrderingFix: evalCtx.SessionData().OptimizerUseProvidedOrderingFix,
}
m.metadata.Init()
m.logPropsBuilder.init(evalCtx, m)
Expand Down Expand Up @@ -368,7 +370,8 @@ func (m *Memo) IsStale(
m.useImprovedSplitDisjunctionForJoins != evalCtx.SessionData().OptimizerUseImprovedSplitDisjunctionForJoins ||
m.alwaysUseHistograms != evalCtx.SessionData().OptimizerAlwaysUseHistograms ||
m.hoistUncorrelatedEqualitySubqueries != evalCtx.SessionData().OptimizerHoistUncorrelatedEqualitySubqueries ||
m.useImprovedComputedColumnFiltersDerivation != evalCtx.SessionData().OptimizerUseImprovedComputedColumnFiltersDerivation {
m.useImprovedComputedColumnFiltersDerivation != evalCtx.SessionData().OptimizerUseImprovedComputedColumnFiltersDerivation ||
m.useProvidedOrderingFix != evalCtx.SessionData().OptimizerUseProvidedOrderingFix {
return true, nil
}

Expand Down
6 changes: 6 additions & 0 deletions pkg/sql/opt/memo/memo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,12 @@ func TestMemoIsStale(t *testing.T) {
evalCtx.SessionData().OptimizerUseImprovedComputedColumnFiltersDerivation = false
notStale()

// Stale optimizer_use_provided_ordering_fix.
evalCtx.SessionData().OptimizerUseProvidedOrderingFix = true
stale()
evalCtx.SessionData().OptimizerUseProvidedOrderingFix = false
notStale()

// User no longer has access to view.
catalog.View(tree.NewTableNameWithSchema("t", tree.PublicSchemaName, "abcview")).Revoked = true
_, err = o.Memo().IsStale(ctx, &evalCtx, catalog)
Expand Down
2 changes: 1 addition & 1 deletion pkg/sql/opt/optgen/exprgen/expr_gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -400,7 +400,7 @@ func (eg *exprGen) populateBestProps(expr opt.Expr, required *physical.Required)
provided := &physical.Provided{}
// BuildProvided relies on ProvidedPhysical() being set in the children, so
// it must run after the recursive calls on the children.
provided.Ordering = ordering.BuildProvided(rel, &required.Ordering)
provided.Ordering = ordering.BuildProvided(eg.f.EvalContext(), rel, &required.Ordering)
provided.Distribution = distribution.BuildProvided(eg.f.EvalContext(), rel, &required.Distribution)

cost += eg.coster.ComputeCost(rel, required)
Expand Down
1 change: 1 addition & 0 deletions pkg/sql/opt/ordering/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ go_library(
"//pkg/sql/opt/cat",
"//pkg/sql/opt/memo",
"//pkg/sql/opt/props",
"//pkg/sql/sem/eval",
"//pkg/sql/sem/tree",
"//pkg/util/buildutil",
"@com_github_cockroachdb_errors//:errors",
Expand Down
9 changes: 7 additions & 2 deletions pkg/sql/opt/ordering/ordering.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/sql/opt"
"github.com/cockroachdb/cockroach/pkg/sql/opt/memo"
"github.com/cockroachdb/cockroach/pkg/sql/opt/props"
"github.com/cockroachdb/cockroach/pkg/sql/sem/eval"
"github.com/cockroachdb/cockroach/pkg/util/buildutil"
"github.com/cockroachdb/errors"
"github.com/cockroachdb/redact"
Expand Down Expand Up @@ -83,12 +84,16 @@ func BuildChildRequired(
//
// This function assumes that the provided orderings have already been set in
// the children of the expression.
func BuildProvided(expr memo.RelExpr, required *props.OrderingChoice) opt.Ordering {
func BuildProvided(
evalCtx *eval.Context, expr memo.RelExpr, required *props.OrderingChoice,
) opt.Ordering {
if required.Any() {
return nil
}
provided := funcMap[expr.Op()].buildProvidedOrdering(expr, required)
provided = finalizeProvided(provided, required, expr.Relational().OutputCols)
if evalCtx.SessionData().OptimizerUseProvidedOrderingFix {
provided = finalizeProvided(provided, required, expr.Relational().OutputCols)
}

if buildutil.CrdbTestBuild {
checkProvided(expr, required, provided)
Expand Down
1 change: 1 addition & 0 deletions pkg/sql/opt/testutils/opttester/opt_tester.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ func New(catalog cat.Catalog, sql string) *OptTester {
ot.evalCtx.SessionData().OptSplitScanLimit = tabledesc.MaxBucketAllowed
ot.evalCtx.SessionData().VariableInequalityLookupJoinEnabled = true
ot.evalCtx.SessionData().OptimizerUseImprovedSplitDisjunctionForJoins = true
ot.evalCtx.SessionData().OptimizerUseProvidedOrderingFix = true

return ot
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/sql/opt/xform/optimizer.go
Original file line number Diff line number Diff line change
Expand Up @@ -775,7 +775,7 @@ func (o *Optimizer) setLowestCostTree(parent opt.Expr, parentProps *physical.Req
var provided physical.Provided
// BuildProvided relies on ProvidedPhysical() being set in the children, so
// it must run after the recursive calls on the children.
provided.Ordering = ordering.BuildProvided(relParent, &parentProps.Ordering)
provided.Ordering = ordering.BuildProvided(o.evalCtx, relParent, &parentProps.Ordering)
provided.Distribution = distribution.BuildProvided(o.evalCtx, relParent, &parentProps.Distribution)
o.mem.SetBestProps(relParent, parentProps, &provided, relCost)
}
Expand Down
5 changes: 5 additions & 0 deletions pkg/sql/sessiondatapb/local_only_session_data.proto
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,11 @@ message LocalOnlySessionData {
// column involved a single column and that column was equated with a single
// constant value in a WHERE clause filter.
bool optimizer_use_improved_computed_column_filters_derivation = 104;
// OptimizerUseProvidedOrderingFix, when true, causes the optimizer to
// reconcile provided orderings with required ordering choices. This prevents
// internal errors due to incomplete functional dependencies, and also
// fixes a bug that incorrectly truncated the provided ordering (see #113072).
bool optimizer_use_provided_ordering_fix = 115;

///////////////////////////////////////////////////////////////////////////
// WARNING: consider whether a session parameter you're adding needs to //
Expand Down
17 changes: 17 additions & 0 deletions pkg/sql/vars.go
Original file line number Diff line number Diff line change
Expand Up @@ -2526,6 +2526,23 @@ var varGen = map[string]sessionVar{
},
GlobalDefault: globalFalse,
},

// CockroachDB extension.
`optimizer_use_provided_ordering_fix`: {
GetStringVal: makePostgresBoolGetStringValFn(`optimizer_use_provided_ordering_fix`),
Set: func(_ context.Context, m sessionDataMutator, s string) error {
b, err := paramparse.ParseBoolVar("optimizer_use_provided_ordering_fix", s)
if err != nil {
return err
}
m.SetOptimizerUseProvidedOrderingFix(b)
return nil
},
Get: func(evalCtx *extendedEvalContext, _ *kv.Txn) (string, error) {
return formatBoolAsPostgresSetting(evalCtx.SessionData().OptimizerUseProvidedOrderingFix), nil
},
GlobalDefault: globalTrue,
},
}

// We want test coverage for this on and off so make it metamorphic.
Expand Down

0 comments on commit 9b408a3

Please sign in to comment.