Skip to content

Instantly share code, notes, and snippets.

@bbeaudreault
Created August 4, 2017 18:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bbeaudreault/b1b1120c6e2568034cfb20b4a5a20557 to your computer and use it in GitHub Desktop.
Save bbeaudreault/b1b1120c6e2568034cfb20b4a5a20557 to your computer and use it in GitHub Desktop.
validate that if a subquery it exists, it and any further subqueries are all part of the same plan.
func validateSubquerySamePlan(node sqlparser.SQLNode, outer *engine.Route, vschema VSchema) bool {
samePlan := true
inSubQuery := false
_ = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) {
if _, ok := node.(*sqlparser.Subquery); ok {
inSubQuery = true
return true, nil
}
if !inSubQuery {
return true, nil
}
switch nodeType := node.(type) {
case *sqlparser.Select:
bldr, err := processSelect(nodeType, vschema, nil)
if err != nil {
return false, err
}
innerRoute, ok := bldr.(*route)
if !ok {
samePlan = false
return false, errors.New("dummy")
}
if innerRoute.ERoute.Keyspace.Name != outer.Keyspace.Name {
samePlan = false
return false, errors.New("dummy")
}
case *sqlparser.Union:
bldr, err := processUnion(nodeType, vschema, nil)
if err != nil {
return nil, err
}
innerRoute, ok := bldr.(*route)
if !ok {
samePlan = false
return false, errors.New("dummy")
}
if innerRoute.ERoute.Keyspace.Name != outer.Keyspace.Name {
samePlan = false
return false, errors.New("dummy")
}
}
return true, nil
}, node)
return samePlan
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment