code: func ExtractFiltersFromDNFs(ctx sessionctx.Context, conditions []Expression) []Expression {
  	var allExtracted []Expression
  	for i := len(conditions) - 1; i >= 0; i-- {
  		if sf, ok := conditions[i].(*ScalarFunction); ok && sf.FuncName.L == ast.LogicOr {
  			extracted, remained := extractFiltersFromDNF(ctx, sf)
  			allExtracted = append(allExtracted, extracted...)
  			if remained == nil {
  				conditions = append(conditions[:i], conditions[i+1:]...)
  			} else {
  				conditions[i] = remained
  			}
  		}
  	}
  	return append(conditions, allExtracted...)
  }
docs: // ExtractFiltersFromDNFs checks whether the cond is DNF. If so, it will get the extracted part and the remained part.
  // The original DNF will be replaced by the remained part or just be deleted if remained part is nil.
  // And the extracted part will be appended to the end of the orignal slice.