diff --git a/pkg/sql/opt/partialidx/implicator.go b/pkg/sql/opt/partialidx/implicator.go index 090721d39349..fbda9407d705 100644 --- a/pkg/sql/opt/partialidx/implicator.go +++ b/pkg/sql/opt/partialidx/implicator.go @@ -145,7 +145,6 @@ func (im *Implicator) Init(f *norm.Factory, md *opt.Metadata, evalCtx *tree.Eval im.f = f im.md = md im.evalCtx = evalCtx - im.constraintCache = make(map[opt.ScalarExpr]constraintCacheItem) } // FiltersImplyPredicate attempts to prove that a partial index predicate is @@ -647,9 +646,18 @@ func (im *Implicator) twoVarComparisonImpliesTwoVarComparison( return false, true } +// initConstraintCache initializes the constraintCache field if it has not yet +// been initialized. +func (im *Implicator) initConstraintCache() { + if im.constraintCache == nil { + im.constraintCache = make(map[opt.ScalarExpr]constraintCacheItem) + } +} + // cacheConstraint caches a constraint set and a tight boolean for the given // scalar expression. func (im *Implicator) cacheConstraint(e opt.ScalarExpr, c *constraint.Set, tight bool) { + im.initConstraintCache() if _, ok := im.constraintCache[e]; !ok { im.constraintCache[e] = constraintCacheItem{ c: c, @@ -662,6 +670,7 @@ func (im *Implicator) cacheConstraint(e opt.ScalarExpr, c *constraint.Set, tight // cache contains an entry for the given scalar expression. It returns // ok = false if the scalar expression does not exist in the cache. func (im *Implicator) fetchConstraint(e opt.ScalarExpr) (_ *constraint.Set, tight bool, ok bool) { + im.initConstraintCache() if res, ok := im.constraintCache[e]; ok { return res.c, res.tight, true } diff --git a/pkg/sql/opt/xform/optimizer.go b/pkg/sql/opt/xform/optimizer.go index 1f25de55acc7..1ce78755c03c 100644 --- a/pkg/sql/opt/xform/optimizer.go +++ b/pkg/sql/opt/xform/optimizer.go @@ -95,7 +95,7 @@ type Optimizer struct { disabledRules RuleSet // JoinOrderBuilder adds new join orderings to the memo. - jb *JoinOrderBuilder + jb JoinOrderBuilder } // Init initializes the Optimizer with a new, blank memo structure inside. This @@ -112,7 +112,7 @@ func (o *Optimizer) Init(evalCtx *tree.EvalContext, catalog cat.Catalog) { o.matchedRule = nil o.appliedRule = nil o.disabledRules = util.FastIntSet{} - o.jb = &JoinOrderBuilder{} + o.jb = JoinOrderBuilder{} if evalCtx.TestingKnobs.DisableOptimizerRuleProbability > 0 { o.disableRules(evalCtx.TestingKnobs.DisableOptimizerRuleProbability) } @@ -151,7 +151,7 @@ func (o *Optimizer) SetCoster(coster Coster) { // JoinOrderBuilder returns the JoinOrderBuilder instance that the optimizer is // currently using to reorder join trees. func (o *Optimizer) JoinOrderBuilder() *JoinOrderBuilder { - return o.jb + return &o.jb } // DisableOptimizations disables all transformation rules, including normalize