code: func (cwc *ColWithCmpFuncManager) BuildRangesByRow(ctx sessionctx.Context, row chunk.Row) ([]*ranger.Range, error) {
  	exprs := make([]expression.Expression, len(cwc.OpType))
  	for i, opType := range cwc.OpType {
  		constantArg, err := cwc.opArg[i].Eval(row)
  		if err != nil {
  			return nil, err
  		}
  		cwc.tmpConstant[i].Value = constantArg
  		newExpr, err := expression.NewFunction(ctx, opType, types.NewFieldType(mysql.TypeTiny), cwc.targetCol, cwc.tmpConstant[i])
  		if err != nil {
  			return nil, err
  		}
  		exprs = append(exprs, newExpr)
  	}
  	ranges, err := ranger.BuildColumnRange(exprs, ctx.GetSessionVars().StmtCtx, cwc.targetCol.RetType, cwc.colLength)
  	if err != nil {
  		return nil, err
  	}
  	return ranges, nil
  }
docs: // BuildRangesByRow will build range of the given row. It will eval each function's arg then call BuildRange.