code: func deriveNotNullExpr(expr expression.Expression, schema *expression.Schema) expression.Expression {
  	binop, ok := expr.(*expression.ScalarFunction)
  	if !ok || len(binop.GetArgs()) != 2 {
  		return nil
  	}
  	ctx := binop.GetCtx()
  	arg0, lOK := binop.GetArgs()[0].(*expression.Column)
  	arg1, rOK := binop.GetArgs()[1].(*expression.Column)
  	if !lOK || !rOK {
  		return nil
  	}
  	childCol := schema.RetrieveColumn(arg0)
  	if childCol == nil {
  		childCol = schema.RetrieveColumn(arg1)
  	}
  	if isNullRejected(ctx, schema, expr) && !mysql.HasNotNullFlag(childCol.RetType.Flag) {
  		return expression.BuildNotNullExpr(ctx, childCol)
  	}
  	return nil
  }
docs: // deriveNotNullExpr generates a new expression `not(isnull(col))` given `col1 op col2`,
  // in which `col` is in specified schema. Caller guarantees that only one of `col1` or
  // `col2` is in schema.