code: func (checker *cacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren bool) {
  	switch node := in.(type) {
  	case *ast.VariableExpr, *ast.ExistsSubqueryExpr, *ast.SubqueryExpr:
  		checker.cacheable = false
  		return in, true
  	case *ast.FuncCallExpr:
  		if _, found := expression.UnCacheableFunctions[node.FnName.L]; found {
  			checker.cacheable = false
  			return in, true
  		}
  	case *ast.OrderByClause:
  		for _, item := range node.Items {
  			if _, isParamMarker := item.Expr.(*driver.ParamMarkerExpr); isParamMarker {
  				checker.cacheable = false
  				return in, true
  			}
  		}
  	case *ast.GroupByClause:
  		for _, item := range node.Items {
  			if _, isParamMarker := item.Expr.(*driver.ParamMarkerExpr); isParamMarker {
  				checker.cacheable = false
  				return in, true
  			}
  		}
  	case *ast.Limit:
  		if node.Count != nil {
  			if _, isParamMarker := node.Count.(*driver.ParamMarkerExpr); isParamMarker {
  				checker.cacheable = false
  				return in, true
  			}
  		}
  		if node.Offset != nil {
  			if _, isParamMarker := node.Offset.(*driver.ParamMarkerExpr); isParamMarker {
  				checker.cacheable = false
  				return in, true
  			}
  		}
  	}
  	return in, false
  }
docs: // Enter implements Visitor interface.