code: func VectorizedFilter(ctx sessionctx.Context, filters []Expression, iterator *chunk.Iterator4Chunk, selected []bool) ([]bool, error) {
  	selected = selected[:0]
  	for i, numRows := 0, iterator.Len(); i < numRows; i++ {
  		selected = append(selected, true)
  	}
  	for _, filter := range filters {
  		isIntType := true
  		if filter.GetType().EvalType() != types.ETInt {
  			isIntType = false
  		}
  		for row := iterator.Begin(); row != iterator.End(); row = iterator.Next() {
  			if !selected[row.Idx()] {
  				continue
  			}
  			if isIntType {
  				filterResult, isNull, err := filter.EvalInt(ctx, row)
  				if err != nil {
  					return nil, err
  				}
  				selected[row.Idx()] = selected[row.Idx()] && !isNull && (filterResult != 0)
  			} else {
  				// TODO: should rewrite the filter to `cast(expr as SIGNED) != 0` and always use `EvalInt`.
  				bVal, _, err := EvalBool(ctx, []Expression{filter}, row)
  				if err != nil {
  					return nil, err
  				}
  				selected[row.Idx()] = selected[row.Idx()] && bVal
  			}
  		}
  	}
  	return selected, nil
  }
docs: // VectorizedFilter applies a list of filters to a Chunk and
  // returns a bool slice, which indicates whether a row is passed the filters.
  // Filters is executed vectorized.