code: func CloneExpr(expr Expr) Expr {
  	if expr == nil {
  		return nil
  	}
  	switch expr := expr.(type) {
  	case *BinaryExpr:
  		return &BinaryExpr{Op: expr.Op, LHS: CloneExpr(expr.LHS), RHS: CloneExpr(expr.RHS)}
  	case *BooleanLiteral:
  		return &BooleanLiteral{Val: expr.Val}
  	case *Call:
  		args := make([]Expr, len(expr.Args))
  		for i, arg := range expr.Args {
  			args[i] = CloneExpr(arg)
  		}
  		return &Call{Name: expr.Name, Args: args}
  	case *Distinct:
  		return &Distinct{Val: expr.Val}
  	case *DurationLiteral:
  		return &DurationLiteral{Val: expr.Val}
  	case *IntegerLiteral:
  		return &IntegerLiteral{Val: expr.Val}
  	case *UnsignedLiteral:
  		return &UnsignedLiteral{Val: expr.Val}
  	case *NumberLiteral:
  		return &NumberLiteral{Val: expr.Val}
  	case *ParenExpr:
  		return &ParenExpr{Expr: CloneExpr(expr.Expr)}
  	case *RegexLiteral:
  		return &RegexLiteral{Val: expr.Val}
  	case *StringLiteral:
  		return &StringLiteral{Val: expr.Val}
  	case *TimeLiteral:
  		return &TimeLiteral{Val: expr.Val}
  	case *VarRef:
  		return &VarRef{Val: expr.Val, Type: expr.Type}
  	case *Wildcard:
  		return &Wildcard{Type: expr.Type}
  	}
  	panic("unreachable")
  }
docs: // CloneExpr returns a deep copy of the expression.