code: func (s *partitionProcessor) canBePruned(sctx sessionctx.Context, partCol *expression.Column, partExpr expression.Expression, filterExprs []expression.Expression) (bool, error) {
  	conds := make([]expression.Expression, 0, 1+len(filterExprs))
  	conds = append(conds, partExpr)
  	conds = append(conds, filterExprs...)
  	conds = expression.PropagateConstant(sctx, conds)
  	conds = solver.Solve(sctx, conds)
  
  	if len(conds) == 1 {
  		// Constant false.
  		if con, ok := conds[0].(*expression.Constant); ok && con.DeferredExpr == nil {
  			ret, _, err := expression.EvalBool(sctx, expression.CNFExprs{con}, chunk.Row{})
  			if err == nil && ret == false {
  				return true, nil
  			}
  		}
  		// Not a constant false, but this is the only condition, it can't be pruned.
  		return false, nil
  	}
  
  	// Calculates the column range to prune.
  	if partCol == nil {
  		// If partition column is nil, we can't calculate range, so we can't prune
  		// partition by range.
  		return false, nil
  	}
  
  	// TODO: Remove prune by calculating range. Current constraint propagate doesn't
  	// handle the null condition, while calculate range can prune something like:
  	// "select * from t where t is null"
  	accessConds := ranger.ExtractAccessConditionsForColumn(conds, partCol.UniqueID)
  	r, err := ranger.BuildColumnRange(accessConds, sctx.GetSessionVars().StmtCtx, partCol.RetType, types.UnspecifiedLength)
  	if err != nil {
  		return false, err
  	}
  	return len(r) == 0, nil
  }
docs: // canBePruned checks if partition expression will never meets the selection condition.
  // For example, partition by column a > 3, and select condition is a < 3, then canBePrune returns true.