func WalkExpr(v Visitor, expr Expr) (newExpr Expr, changed bool) {
	recurse, newExpr := v.VisitPre(expr)

	if recurse {
		newExpr = newExpr.Walk(v)
		newExpr = v.VisitPost(newExpr)
	}

	// We cannot use == because some Expr implementations are not comparable (e.g. DTuple)
	return newExpr, (reflect.ValueOf(expr) != reflect.ValueOf(newExpr))
}
// WalkExpr traverses the nodes in an expression.
//
// NOTE: Do not count on the walkStmt/WalkExpr machinery to visit all
// expressions contained in a query. Only a sub-set of all expressions are
// found by walkStmt and subsequently traversed. See the comment below on
// walkStmt for details.
WalkExpr traverses the nodes in an expression.

Do not count on the walkStmt/WalkExpr machinery to visit all
expressions contained in a query. Only a sub-set of all expressions are
found by walkStmt and subsequently traversed. See the comment below on
walkStmt for details.
// WalkExpr traverses the nodes in an expression . // // NOTE : Do not count on the walkStmt / WalkExpr machinery to visit all // expressions contained in a query . Only a sub - set of all expressions are // found by walkStmt and subsequently traversed . See the comment below on // walkStmt for details .
func WalkExpr(v Visitor, expr Expr) (newExpr Expr, changed bool) {
	recurse, newExpr := v.VisitPre(expr)
	if recurse {
		newExpr = newExpr.Walk(v)
		newExpr = v.VisitPost(newExpr)
	}
	return newExpr, (reflect.ValueOf(expr) != reflect.ValueOf(newExpr))
}
func WalkExpr ( v Visitor , expr Expr ) ( newExpr Expr , changed bool ) { recurse , newExpr := v . VisitPre ( expr ) if recurse { newExpr = newExpr . Walk ( v ) newExpr = v . VisitPost ( newExpr ) } return newExpr , ( reflect . ValueOf ( expr ) != reflect . ValueOf ( newExpr ) ) }
WalkExpr traverses the nodes in an expression.
WalkExpr traverses the nodes in an expression .
// We cannot use == because some Expr implementations are not comparable (e.g. DTuple)