From deb79229094bb65ae49409d8b3d4b76a3b5112ed Mon Sep 17 00:00:00 2001 From: Manan Gupta Date: Fri, 21 Feb 2025 13:18:24 +0530 Subject: [PATCH] wip --- .../planbuilder/operators/expressions.go | 14 ++++--- .../vtgate/planbuilder/operators/op_to_ast.go | 37 +++++++++---------- .../planbuilder/operators/values_join.go | 1 + .../vtgate/planbuilder/testdata/onecase.json | 2 +- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/go/vt/vtgate/planbuilder/operators/expressions.go b/go/vt/vtgate/planbuilder/operators/expressions.go index 4ba04aaf1ad..caa15311ae2 100644 --- a/go/vt/vtgate/planbuilder/operators/expressions.go +++ b/go/vt/vtgate/planbuilder/operators/expressions.go @@ -134,19 +134,23 @@ func breakValuesJoinExpressionInLHS(ctx *plancontext.PlanningContext, expr sqlparser.Expr, lhs semantics.TableSet, ) (result valuesJoinColumn) { - result.Original = expr + result.Original = sqlparser.Clone(expr) result.PureLHS = true - _ = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + result.RHS = expr + _ = sqlparser.Rewrite(expr, func(cursor *sqlparser.Cursor) bool { + node := cursor.Node() col, ok := node.(*sqlparser.ColName) if !ok { - return true, nil + return true } if ctx.SemTable.RecursiveDeps(col) == lhs { result.LHS = append(result.LHS, col) + // TODO: Fine all the LHS columns, and + // rewrite the expression to use the value join name and the column. } else { result.PureLHS = false } - return true, nil - }, expr) + return true + }, nil) return } diff --git a/go/vt/vtgate/planbuilder/operators/op_to_ast.go b/go/vt/vtgate/planbuilder/operators/op_to_ast.go index 7e6f57b5954..f885141c3f2 100644 --- a/go/vt/vtgate/planbuilder/operators/op_to_ast.go +++ b/go/vt/vtgate/planbuilder/operators/op_to_ast.go @@ -18,7 +18,6 @@ package operators import ( "fmt" - "strings" "vitess.io/vitess/go/slice" "vitess.io/vitess/go/vt/sqlparser" @@ -156,28 +155,28 @@ func buildValues(op *Values, qb *queryBuilder) { apa = apa.Merge(qb.ctx.SemTable.RecursiveDeps(ae.Expr)) } - tableName := getTableName(qb.ctx, apa) + tableName := op.Name qb.addTableExpr(tableName, tableName, TableID(op), expr, nil, op.getColumnNamesFromCtx(qb.ctx)) } -func getTableName(ctx *plancontext.PlanningContext, id semantics.TableSet) string { - var names []string - for _, ts := range id.Constituents() { - ti, err := ctx.SemTable.TableInfoFor(ts) - if err != nil { - names = append(names, "X") - continue - } - name, err := ti.Name() - if err != nil { - names = append(names, "X") - continue - } - names = append(names, name.Name.String()) - } - return strings.Join(names, "_") -} +//func getTableName(ctx *plancontext.PlanningContext, id semantics.TableSet) string { +// var names []string +// for _, ts := range id.Constituents() { +// ti, err := ctx.SemTable.TableInfoFor(ts) +// if err != nil { +// names = append(names, "X") +// continue +// } +// name, err := ti.Name() +// if err != nil { +// names = append(names, "X") +// continue +// } +// names = append(names, name.Name.String()) +// } +// return strings.Join(names, "_") +//} func buildDelete(op *Delete, qb *queryBuilder) { qb.stmt = &sqlparser.Delete{ diff --git a/go/vt/vtgate/planbuilder/operators/values_join.go b/go/vt/vtgate/planbuilder/operators/values_join.go index d65502e604d..4d0a92a2f33 100644 --- a/go/vt/vtgate/planbuilder/operators/values_join.go +++ b/go/vt/vtgate/planbuilder/operators/values_join.go @@ -47,6 +47,7 @@ type ( valuesJoinColumn struct { Original sqlparser.Expr + RHS sqlparser.Expr LHS []sqlparser.Expr PureLHS bool } diff --git a/go/vt/vtgate/planbuilder/testdata/onecase.json b/go/vt/vtgate/planbuilder/testdata/onecase.json index 9d653b2f6e9..279fd68988a 100644 --- a/go/vt/vtgate/planbuilder/testdata/onecase.json +++ b/go/vt/vtgate/planbuilder/testdata/onecase.json @@ -1,7 +1,7 @@ [ { "comment": "Add your test case here for debugging and run go test -run=One.", - "query": "", + "query": "select /*vt+ ALLOW_VALUES_JOIN */ user.foo, user_extra.user_id, user_metadata.name from user, user_extra, user_metadata where user.id = user_extra.toto and user_extra.age = user_metadata.age", "plan": { } }