func WalkWithNode(v NodeVisitor, n Node, expr Expression) {
	if v = v.Visit(n, expr); v == nil {
		return
	}
	for _, child := range expr.Children() {
		WalkWithNode(v, n, child)
	}
	v.Visit(nil, nil)
}
WalkWithNode traverses the expression tree in depth-first order. It starts by calling v.Visit(node, expr); expr must
not be nil. If the visitor returned by v.Visit(node, expr) is not nil, Walk is invoked recursively with the returned
visitor for each children of the expr, followed by a call of v.Visit(nil, nil) to the returned visitor.
package sql
type Visitor interface {
	Visit(expr Expression) Visitor
}
func Walk(v Visitor, expr Expression) {
	if v = v.Visit(expr); v == nil {
		return
	}
	for _, child := range expr.Children() {
		Walk(v, child)
	}
	v.Visit(nil)
}
type NodeVisitor interface {
	Visit(node Node, expression Expression) NodeVisitor
}