From 0d10d6f5e653dfcb546915578150a2a868d2f861 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Fri, 5 May 2023 16:21:08 +0200 Subject: [PATCH] gen4 planner bugfix: issue when merging subqueries (#13025) Signed-off-by: Andres Taylor --- go/vt/vtgate/planbuilder/operators/merging.go | 2 +- .../planbuilder/testdata/select_cases.json | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/go/vt/vtgate/planbuilder/operators/merging.go b/go/vt/vtgate/planbuilder/operators/merging.go index 369016e28b9..6edc2400668 100644 --- a/go/vt/vtgate/planbuilder/operators/merging.go +++ b/go/vt/vtgate/planbuilder/operators/merging.go @@ -194,7 +194,7 @@ func (jm *joinMerger) mergeTables(r1, r2 *ShardedRouting, op1, op2 *Route) (*Rou VindexPreds: append(r1.VindexPreds, r2.VindexPreds...), keyspace: r1.keyspace, RouteOpCode: r1.RouteOpCode, - SeenPredicates: r1.SeenPredicates, + SeenPredicates: append(r1.SeenPredicates, r2.SeenPredicates...), } if r1.SelectedVindex() == r2.SelectedVindex() { tr.Selected = r1.Selected diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index 1bb1f4fab58..48d11d0e816 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -7943,5 +7943,43 @@ "user.user" ] } + }, + { + "comment": "merge subquery using MAX and join into single route", + "query": "select 1 from user join music_extra on user.id = music_extra.user_id where music_extra.music_id = (select max(music_id) from music_extra where user_id = user.id)", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select 1 from user join music_extra on user.id = music_extra.user_id where music_extra.music_id = (select max(music_id) from music_extra where user_id = user.id)", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from `user` join music_extra on `user`.id = music_extra.user_id where 1 != 1", + "Query": "select 1 from `user` join music_extra on `user`.id = music_extra.user_id where music_extra.music_id = (select max(music_id) from music_extra where user_id = `user`.id)", + "Table": "`user`, music_extra" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select 1 from user join music_extra on user.id = music_extra.user_id where music_extra.music_id = (select max(music_id) from music_extra where user_id = user.id)", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from `user`, music_extra where 1 != 1", + "Query": "select 1 from `user`, music_extra where music_extra.music_id = (select max(music_id) from music_extra where user_id = `user`.id) and `user`.id = music_extra.user_id", + "Table": "`user`, music_extra" + }, + "TablesUsed": [ + "user.music_extra", + "user.user" + ] + } } ]