@@ -462,7 +462,7 @@ func (c *indexCoster) cost(f indexFilter, stat sql.Statistic, idx sql.Index) err
462462
463463 switch f := f .(type ) {
464464 case * iScanAnd :
465- newHist , newFds , filters , prefix , err = c .costIndexScanAnd (f , stat , stat .Histogram (), ordinals , idx )
465+ newHist , newFds , filters , prefix , err = c .costIndexScanAnd (c . ctx , f , stat , stat .Histogram (), ordinals , idx )
466466 if err != nil {
467467 return err
468468 }
@@ -1199,7 +1199,7 @@ func ordinalsForStat(stat sql.Statistic) map[string]int {
11991199// updated statistic, the subset of applicable filters, the maximum prefix
12001200// key created by a subset of equality filters (from conjunction only),
12011201// or an error if applicable.
1202- func (c * indexCoster ) costIndexScanAnd (filter * iScanAnd , s sql.Statistic , buckets []sql.HistogramBucket , ordinals map [string ]int , idx sql.Index ) ([]sql.HistogramBucket , * sql.FuncDepSet , sql.FastIntSet , int , error ) {
1202+ func (c * indexCoster ) costIndexScanAnd (ctx * sql. Context , filter * iScanAnd , s sql.Statistic , buckets []sql.HistogramBucket , ordinals map [string ]int , idx sql.Index ) ([]sql.HistogramBucket , * sql.FuncDepSet , sql.FastIntSet , int , error ) {
12031203 // first step finds the conjunctions that match index prefix columns.
12041204 // we divide into eqFilters and rangeFilters
12051205
@@ -1214,7 +1214,7 @@ func (c *indexCoster) costIndexScanAnd(filter *iScanAnd, s sql.Statistic, bucket
12141214 }
12151215 // if valid, INTERSECT
12161216 if ok {
1217- ret , err = stats .Intersect (ret , childStat , s .Types ())
1217+ ret , err = stats .Intersect (c . ctx , ret , childStat , s .Types ())
12181218 if err != nil {
12191219 return nil , nil , sql.FastIntSet {}, 0 , err
12201220 }
@@ -1227,7 +1227,7 @@ func (c *indexCoster) costIndexScanAnd(filter *iScanAnd, s sql.Statistic, bucket
12271227 for _ , c := range s .Columns () {
12281228 if colFilters , ok := filter .leafChildren [c ]; ok {
12291229 for _ , f := range colFilters {
1230- conj .add (f )
1230+ conj .add (ctx , f )
12311231 }
12321232 }
12331233 }
@@ -1253,15 +1253,15 @@ func (c *indexCoster) costIndexScanOr(filter *iScanOr, s sql.Statistic, buckets
12531253 for _ , child := range filter .children {
12541254 switch child := child .(type ) {
12551255 case * iScanAnd :
1256- childBuckets , _ , ids , _ , err := c .costIndexScanAnd (child , s , buckets , ordinals , idx )
1256+ childBuckets , _ , ids , _ , err := c .costIndexScanAnd (c . ctx , child , s , buckets , ordinals , idx )
12571257 if err != nil {
12581258 return nil , nil , false , err
12591259 }
12601260 if ids .Len () != 1 || ! ids .Contains (int (child .Id ())) {
12611261 // scan option missed some filters
12621262 return nil , nil , false , nil
12631263 }
1264- ret , err = stats .Union (buckets , childBuckets , s .Types ())
1264+ ret , err = stats .Union (c . ctx , buckets , childBuckets , s .Types ())
12651265 if err != nil {
12661266 return nil , nil , false , err
12671267 }
@@ -1275,7 +1275,7 @@ func (c *indexCoster) costIndexScanOr(filter *iScanOr, s sql.Statistic, buckets
12751275 if ! ok {
12761276 return nil , nil , false , nil
12771277 }
1278- ret , err = stats .Union (ret , childBuckets , s .Types ())
1278+ ret , err = stats .Union (c . ctx , ret , childBuckets , s .Types ())
12791279 if err != nil {
12801280 return nil , nil , false , err
12811281 }
@@ -1339,7 +1339,7 @@ func (c *indexCoster) costIndexScanLeaf(filter *iScanLeaf, s sql.Statistic, buck
13391339 return buckets , stat .FuncDeps (), ok , 0 , err
13401340 default :
13411341 conj := newConjCollector (s , buckets , ordinals )
1342- conj .add (filter )
1342+ conj .add (c . ctx , filter )
13431343 var conjFDs * sql.FuncDepSet
13441344 if idx .IsUnique () {
13451345 conjFDs = conj .getFds ()
@@ -1670,19 +1670,19 @@ type conjCollector struct {
16701670 isFalse bool
16711671}
16721672
1673- func (c * conjCollector ) add (f * iScanLeaf ) error {
1673+ func (c * conjCollector ) add (ctx * sql. Context , f * iScanLeaf ) error {
16741674 c .applied .Add (int (f .Id ()))
16751675 var err error
16761676 switch f .Op () {
16771677 case IndexScanOpNullSafeEq :
1678- err = c .addEq (f .gf .Name (), f .litValue , true )
1678+ err = c .addEq (ctx , f .gf .Name (), f .litValue , true )
16791679 case IndexScanOpEq :
1680- err = c .addEq (f .gf .Name (), f .litValue , false )
1680+ err = c .addEq (ctx , f .gf .Name (), f .litValue , false )
16811681 case IndexScanOpInSet :
16821682 // TODO cost UNION of equals
1683- err = c .addEq (f .gf .Name (), f .setValues [0 ], false )
1683+ err = c .addEq (ctx , f .gf .Name (), f .setValues [0 ], false )
16841684 default :
1685- err = c .addIneq (f .Op (), f .gf .Name (), f .litValue )
1685+ err = c .addIneq (ctx , f .Op (), f .gf .Name (), f .litValue )
16861686 }
16871687 return err
16881688}
@@ -1695,7 +1695,7 @@ func (c *conjCollector) getFds() *sql.FuncDepSet {
16951695 return sql .NewLookupFDs (c .stat .FuncDeps (), c .stat .ColSet (), sql.ColSet {}, constCols , nil )
16961696}
16971697
1698- func (c * conjCollector ) addEq (col string , val interface {}, nullSafe bool ) error {
1698+ func (c * conjCollector ) addEq (ctx * sql. Context , col string , val interface {}, nullSafe bool ) error {
16991699 // make constant
17001700 ord := c .ordinals [col ]
17011701 if c .constant .Contains (ord + 1 ) {
@@ -1722,20 +1722,20 @@ func (c *conjCollector) addEq(col string, val interface{}, nullSafe bool) error
17221722
17231723 // truncate buckets
17241724 var err error
1725- c .hist , err = stats .PrefixKey (c .stat .Histogram (), c .stat .Types (), c .eqVals [:ord + 1 ])
1725+ c .hist , err = stats .PrefixKey (ctx , c .stat .Histogram (), c .stat .Types (), c .eqVals [:ord + 1 ])
17261726 if err != nil {
17271727 return err
17281728 }
17291729 }
17301730 return nil
17311731}
17321732
1733- func (c * conjCollector ) addIneq (op IndexScanOp , col string , val interface {}) error {
1733+ func (c * conjCollector ) addIneq (ctx * sql. Context , op IndexScanOp , col string , val interface {}) error {
17341734 ord := c .ordinals [col ]
17351735 if ord > 0 {
17361736 return nil
17371737 }
1738- err := c .cmpFirstCol (op , val )
1738+ err := c .cmpFirstCol (ctx , op , val )
17391739 if err != nil {
17401740 return err
17411741 }
@@ -1744,7 +1744,7 @@ func (c *conjCollector) addIneq(op IndexScanOp, col string, val interface{}) err
17441744
17451745// cmpFirstCol checks whether we should try to range truncate the first
17461746// column in the index
1747- func (c * conjCollector ) cmpFirstCol (op IndexScanOp , val interface {}) error {
1747+ func (c * conjCollector ) cmpFirstCol (ctx * sql. Context , op IndexScanOp , val interface {}) error {
17481748 // check if first col already constant
17491749 // otherwise attempt to truncate histogram
17501750 var err error
@@ -1754,15 +1754,15 @@ func (c *conjCollector) cmpFirstCol(op IndexScanOp, val interface{}) error {
17541754 switch op {
17551755 case IndexScanOpNotEq :
17561756 // todo notEq
1757- c .hist , err = stats .PrefixGt (c .hist , c .stat .Types (), val )
1757+ c .hist , err = stats .PrefixGt (ctx , c .hist , c .stat .Types (), val )
17581758 case IndexScanOpGt :
1759- c .hist , err = stats .PrefixGt (c .hist , c .stat .Types (), val )
1759+ c .hist , err = stats .PrefixGt (ctx , c .hist , c .stat .Types (), val )
17601760 case IndexScanOpGte :
1761- c .hist , err = stats .PrefixGte (c .hist , c .stat .Types (), val )
1761+ c .hist , err = stats .PrefixGte (ctx , c .hist , c .stat .Types (), val )
17621762 case IndexScanOpLt :
1763- c .hist , err = stats .PrefixLt (c .hist , c .stat .Types (), val )
1763+ c .hist , err = stats .PrefixLt (ctx , c .hist , c .stat .Types (), val )
17641764 case IndexScanOpLte :
1765- c .hist , err = stats .PrefixLte (c .hist , c .stat .Types (), val )
1765+ c .hist , err = stats .PrefixLte (ctx , c .hist , c .stat .Types (), val )
17661766 case IndexScanOpIsNull :
17671767 c .hist , err = stats .PrefixIsNull (c .hist )
17681768 case IndexScanOpIsNotNull :
0 commit comments