code: func detachTableScanConditions(conditions []expression.Expression, table *model.TableInfo) ([]expression.Expression, []expression.Expression) {
  	var pkName model.CIStr
  	for _, colInfo := range table.Columns {
  		if mysql.HasPriKeyFlag(colInfo.Flag) {
  			pkName = colInfo.Name
  			break
  		}
  	}
  	if pkName.L == "" {
  		return nil, conditions
  	}
  
  	var accessConditions, filterConditions []expression.Expression
  	checker := conditionChecker{
  		tableName: table.Name,
  		pkName:    pkName}
  	for _, cond := range conditions {
  		cond = pushDownNot(cond, false, nil)
  		if !checker.check(cond) {
  			filterConditions = append(filterConditions, cond)
  			continue
  		}
  		accessConditions = append(accessConditions, cond)
  		// TODO: it will lead to repeated computation cost.
  		if checker.shouldReserve {
  			filterConditions = append(filterConditions, cond)
  			checker.shouldReserve = false
  		}
  	}
  
  	return accessConditions, filterConditions
  }
docs: // detachTableScanConditions distinguishes between access conditions and filter conditions from conditions.