Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions enginetest/queries/query_plans.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion sql/analyzer/apply_indexes_from_outer_scope.go
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ func tablesInScope(scope *plan.Scope) []string {
}
}
for _, table := range scope.JoinSiblings() {
for name, _ := range getTablesByName(table) {
for name, _ := range getNamedChildren(table) {
tables[name] = true
}
}
Expand Down
2 changes: 1 addition & 1 deletion sql/analyzer/assign_update_join.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func modifyUpdateExprsForJoin(ctx *sql.Context, a *Analyzer, n sql.Node, scope *
// getUpdateTargetsByTable maps a set of table names and aliases to their corresponding update target Node
func getUpdateTargetsByTable(node sql.Node, ij sql.Node, isJoin bool) (map[string]sql.Node, error) {
namesOfTableToBeUpdated := plan.GetTablesToBeUpdated(node)
resolvedTables := getTablesByName(ij)
resolvedTables := getResolvedTablesByName(ij)

updateTargets := make(map[string]sql.Node)
for tableToBeUpdated, _ := range namesOfTableToBeUpdated {
Expand Down
2 changes: 1 addition & 1 deletion sql/analyzer/resolve_subqueries.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func resolveSubqueries(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Sc
}

func addLeftTablesToScope(outerScope *plan.Scope, leftNode sql.Node) *plan.Scope {
resTbls := getTablesByName(leftNode)
resTbls := getNamedChildren(leftNode)
subScope := outerScope
for _, tbl := range resTbls {
subScope = subScope.NewScopeInJoin(tbl)
Expand Down
18 changes: 16 additions & 2 deletions sql/analyzer/tables.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,9 @@ func getResolvedTable(node sql.Node) *plan.ResolvedTable {
return table
}

// getTablesByName takes a node and returns all found resolved tables in a map.
// getResolvedTablesByName takes a node and returns all found resolved tables in a map.
// This function will not look inside sql.OpaqueNodes (like plan.SubqueryAlias).
func getTablesByName(node sql.Node) map[string]*plan.ResolvedTable {
func getResolvedTablesByName(node sql.Node) map[string]*plan.ResolvedTable {
ret := make(map[string]*plan.ResolvedTable)
// TODO: We should change transform.Inspect to not walk the children of sql.OpaqueNodes (like transform.Node)
// and add a transform.InspectWithOpaque that does.
Expand All @@ -123,3 +123,17 @@ func getTablesByName(node sql.Node) map[string]*plan.ResolvedTable {
})
return ret
}

func getNamedChildren(node sql.Node) map[string]sql.NameableNode {
ret := make(map[string]sql.NameableNode)
// TODO: We should change transform.Inspect to not walk the children of sql.OpaqueNodes (like transform.Node)
// and add a transform.InspectWithOpaque that does.
// Using transform.Node here achieves the same result without a large refactor.
transform.Node(node, func(node sql.Node) (sql.Node, transform.TreeIdentity, error) {
if nameable, ok := node.(sql.NameableNode); ok {
ret[strings.ToLower(nameable.Name())] = nameable
}
return nil, transform.SameTree, nil
})
return ret
}
4 changes: 2 additions & 2 deletions sql/planbuilder/dml.go
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,7 @@ func hasJoinNode(node sql.Node) bool {

func getResolvedTablesToUpdate(_ *sql.Context, node sql.Node, ij sql.Node) (resolvedTables []*plan.ResolvedTable, err error) {
namesOfTablesToBeUpdated := plan.GetTablesToBeUpdated(node)
resolvedTablesMap := getTablesByName(ij)
resolvedTablesMap := getResolvedTablesByName(ij)

for tableToBeUpdated, _ := range namesOfTablesToBeUpdated {
resolvedTable, ok := resolvedTablesMap[strings.ToLower(tableToBeUpdated)]
Expand All @@ -622,7 +622,7 @@ func getResolvedTablesToUpdate(_ *sql.Context, node sql.Node, ij sql.Node) (reso
}

// getTablesByName takes a node and returns all found resolved tables in a map.
func getTablesByName(node sql.Node) map[string]*plan.ResolvedTable {
func getResolvedTablesByName(node sql.Node) map[string]*plan.ResolvedTable {
ret := make(map[string]*plan.ResolvedTable)

transform.Inspect(node, func(node sql.Node) bool {
Expand Down
2 changes: 1 addition & 1 deletion sql/planbuilder/scalar.go
Original file line number Diff line number Diff line change
Expand Up @@ -1084,7 +1084,7 @@ func (b *Builder) ConvertVal(v *ast.SQLVal) sql.Expression {
// filter, since we only need to load the tables once. All steps after this
// one can assume that the expression has been fully resolved and is valid.
func (b *Builder) buildMatchAgainst(inScope *scope, v *ast.MatchExpr) *expression.MatchAgainst {
rts := getTablesByName(inScope.node)
rts := getResolvedTablesByName(inScope.node)
var rt *plan.ResolvedTable
var matchTable string
cols := make([]*expression.GetField, len(v.Columns))
Expand Down