Skip to content

Commit

Permalink
[release-14.0] fix: union distinct between unsharded route and sharde…
Browse files Browse the repository at this point in the history
…d join (vitessio#12968) (vitessio#12983)

* fix: union distinct between unsharded route and sharded join

Signed-off-by: Harshit Gangal <harshit@planetscale.com>

* test: removed TablesUsed from the expected output

Signed-off-by: Harshit Gangal <harshit@planetscale.com>

---------

Signed-off-by: Harshit Gangal <harshit@planetscale.com>
  • Loading branch information
harshit-gangal committed May 2, 2023
1 parent 21e5b1c commit a264a27
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 16 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Expand Up @@ -88,3 +88,6 @@ venv

.scannerwork
report

# plan test output
/go/vt/vtgate/planbuilder/testdata/plan_test*
29 changes: 13 additions & 16 deletions go/vt/vtgate/planbuilder/operator_transformers.go
Expand Up @@ -363,25 +363,22 @@ func pushWeightStringForDistinct(ctx *plancontext.PlanningContext, plan logicalP
}
node.noNeedToTypeCheck = append(node.noNeedToTypeCheck, newOffset)
case *joinGen4:
lhsSolves := node.Left.ContainsTables()
rhsSolves := node.Right.ContainsTables()
expr := node.OutputColumns()[offset]
aliasedExpr, isAliased := expr.(*sqlparser.AliasedExpr)
if !isAliased {
return 0, vterrors.New(vtrpcpb.Code_UNIMPLEMENTED, "cannot convert select expression to an aliased expression")
}
deps := ctx.SemTable.RecursiveDeps(aliasedExpr.Expr)
joinOffset := node.Cols[offset]
switch {
case deps.IsSolvedBy(lhsSolves):
offset, err = pushWeightStringForDistinct(ctx, node.Left, offset)
node.Cols = append(node.Cols, -(offset + 1))
case deps.IsSolvedBy(rhsSolves):
offset, err = pushWeightStringForDistinct(ctx, node.Right, offset)
node.Cols = append(node.Cols, offset+1)
case joinOffset < 0:
offset, err = pushWeightStringForDistinct(ctx, node.Left, -(joinOffset + 1))
offset = -(offset + 1)
case joinOffset > 0:
offset, err = pushWeightStringForDistinct(ctx, node.Right, joinOffset-1)
offset = offset + 1
default:
return 0, vterrors.New(vtrpcpb.Code_UNIMPLEMENTED, "cannot push distinct weight string to both sides of the join")
return 0, vterrors.New(vtrpcpb.Code_INTERNAL, "[BUG]: wrong column offset in join plan to push DISTINCT WEIGHT_STRING")
}
newOffset = len(node.Cols) - 1
if err != nil {
return 0, err
}
newOffset = len(node.Cols)
node.Cols = append(node.Cols, offset)
default:
return 0, vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "bug: not supported pushWeightStringForDistinct on %T", plan)
}
Expand Down
120 changes: 120 additions & 0 deletions go/vt/vtgate/planbuilder/testdata/union_cases.json
Expand Up @@ -1935,5 +1935,125 @@
"Table": "unsharded"
}
}
},
{
"comment": "union of unsharded route with sharded join with involvement of weight string",
"query": "select id, foo, bar from unsharded union select user.intcol, user.textcol2, authoritative.col2 from user join authoritative",
"v3-plan": {
"QueryType": "SELECT",
"Original": "select id, foo, bar from unsharded union select user.intcol, user.textcol2, authoritative.col2 from user join authoritative",
"Instructions": {
"OperatorType": "Distinct",
"Inputs": [
{
"OperatorType": "Concatenate",
"Inputs": [
{
"OperatorType": "Route",
"Variant": "Unsharded",
"Keyspace": {
"Name": "main",
"Sharded": false
},
"FieldQuery": "select id, foo, bar from unsharded where 1 != 1",
"Query": "select id, foo, bar from unsharded",
"Table": "unsharded"
},
{
"OperatorType": "Join",
"Variant": "Join",
"JoinColumnIndexes": "L:0,L:1,R:0",
"TableName": "`user`_authoritative",
"Inputs": [
{
"OperatorType": "Route",
"Variant": "Scatter",
"Keyspace": {
"Name": "user",
"Sharded": true
},
"FieldQuery": "select `user`.intcol, `user`.textcol2 from `user` where 1 != 1",
"Query": "select `user`.intcol, `user`.textcol2 from `user`",
"Table": "`user`"
},
{
"OperatorType": "Route",
"Variant": "Scatter",
"Keyspace": {
"Name": "user",
"Sharded": true
},
"FieldQuery": "select authoritative.col2 from authoritative where 1 != 1",
"Query": "select authoritative.col2 from authoritative",
"Table": "authoritative"
}
]
}
]
}
]
}
},
"gen4-plan": {
"QueryType": "SELECT",
"Original": "select id, foo, bar from unsharded union select user.intcol, user.textcol2, authoritative.col2 from user join authoritative",
"Instructions": {
"OperatorType": "Distinct",
"Collations": [
"(0:3)",
"(1:4)",
"(2:5)"
],
"ResultColumns": 3,
"Inputs": [
{
"OperatorType": "Concatenate",
"Inputs": [
{
"OperatorType": "Route",
"Variant": "Unsharded",
"Keyspace": {
"Name": "main",
"Sharded": false
},
"FieldQuery": "select id, foo, bar, weight_string(id), weight_string(foo), weight_string(bar) from unsharded where 1 != 1",
"Query": "select distinct id, foo, bar, weight_string(id), weight_string(foo), weight_string(bar) from unsharded",
"Table": "unsharded"
},
{
"OperatorType": "Join",
"Variant": "Join",
"JoinColumnIndexes": "L:0,L:1,R:0,L:2,L:3,R:1",
"TableName": "`user`_authoritative",
"Inputs": [
{
"OperatorType": "Route",
"Variant": "Scatter",
"Keyspace": {
"Name": "user",
"Sharded": true
},
"FieldQuery": "select `user`.intcol, `user`.textcol2, weight_string(`user`.intcol), weight_string(`user`.textcol2) from `user` where 1 != 1",
"Query": "select `user`.intcol, `user`.textcol2, weight_string(`user`.intcol), weight_string(`user`.textcol2) from `user`",
"Table": "`user`"
},
{
"OperatorType": "Route",
"Variant": "Scatter",
"Keyspace": {
"Name": "user",
"Sharded": true
},
"FieldQuery": "select authoritative.col2, weight_string(authoritative.col2) from authoritative where 1 != 1",
"Query": "select authoritative.col2, weight_string(authoritative.col2) from authoritative",
"Table": "authoritative"
}
]
}
]
}
]
}
}
}
]

0 comments on commit a264a27

Please sign in to comment.