code: func (n *SelectStmt) Accept(v Visitor) (Node, bool) {
  	newNode, skipChildren := v.Enter(n)
  	if skipChildren {
  		return v.Leave(newNode)
  	}
  
  	n = newNode.(*SelectStmt)
  	if n.From != nil {
  		node, ok := n.From.Accept(v)
  		if !ok {
  			return n, false
  		}
  		n.From = node.(*TableRefsClause)
  	}
  
  	if n.Where != nil {
  		node, ok := n.Where.Accept(v)
  		if !ok {
  			return n, false
  		}
  		n.Where = node.(ExprNode)
  	}
  
  	if n.Fields != nil {
  		node, ok := n.Fields.Accept(v)
  		if !ok {
  			return n, false
  		}
  		n.Fields = node.(*FieldList)
  	}
  
  	if n.GroupBy != nil {
  		node, ok := n.GroupBy.Accept(v)
  		if !ok {
  			return n, false
  		}
  		n.GroupBy = node.(*GroupByClause)
  	}
  
  	if n.Having != nil {
  		node, ok := n.Having.Accept(v)
  		if !ok {
  			return n, false
  		}
  		n.Having = node.(*HavingClause)
  	}
  
  	if n.OrderBy != nil {
  		node, ok := n.OrderBy.Accept(v)
  		if !ok {
  			return n, false
  		}
  		n.OrderBy = node.(*OrderByClause)
  	}
  
  	if n.Limit != nil {
  		node, ok := n.Limit.Accept(v)
  		if !ok {
  			return n, false
  		}
  		n.Limit = node.(*Limit)
  	}
  
  	return v.Leave(n)
  }
docs: // Accept implements Node Accept interface.