From 06cb8bea502d9e3b796d0cfd5b54d41c67f39059 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 10:44:27 +0200 Subject: [PATCH 1/2] fix: keep LIMIT/OFFSET even when merging UNION queries (#18361) Signed-off-by: Andres Taylor --- .../planbuilder/operators/SQL_builder.go | 1 + .../planbuilder/testdata/union_cases.json | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/go/vt/vtgate/planbuilder/operators/SQL_builder.go b/go/vt/vtgate/planbuilder/operators/SQL_builder.go index fc91569981d..c2999f09e97 100644 --- a/go/vt/vtgate/planbuilder/operators/SQL_builder.go +++ b/go/vt/vtgate/planbuilder/operators/SQL_builder.go @@ -418,6 +418,7 @@ func stripDownQuery(from, to sqlparser.SelectStatement) { stripDownQuery(node.Left, toNode.Left) stripDownQuery(node.Right, toNode.Right) toNode.OrderBy = node.OrderBy + toNode.Limit = node.Limit default: panic(vterrors.VT13001(fmt.Sprintf("this should not happen - we have covered all implementations of SelectStatement %T", from))) } diff --git a/go/vt/vtgate/planbuilder/testdata/union_cases.json b/go/vt/vtgate/planbuilder/testdata/union_cases.json index 7feabb0a698..aeeebb5136d 100644 --- a/go/vt/vtgate/planbuilder/testdata/union_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/union_cases.json @@ -1849,5 +1849,83 @@ "user.user_extra" ] } + }, + { + "comment": "Merged UNION with limit and offset", + "query": "(select id from user where id = 42) union (select id from user where id = 42) limit 3 offset 7", + "plan": { + "Type": "Passthrough", + "QueryType": "SELECT", + "Original": "(select id from user where id = 42) union (select id from user where id = 42) limit 3 offset 7", + "Instructions": { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1 union select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 42 union select id from `user` where id = 42 limit 7, 3", + "Values": [ + "42" + ], + "Vindex": "user_index" + }, + "TablesUsed": [ + "user.user" + ] + } + }, + { + "comment": "Un-merged UNION with limit and offset", + "query": "(select id from user where id = 42) union all (select id from user where id = 234) limit 3 offset 7", + "plan": { + "Type": "Complex", + "QueryType": "SELECT", + "Original": "(select id from user where id = 42) union all (select id from user where id = 234) limit 3 offset 7", + "Instructions": { + "OperatorType": "Limit", + "Count": "3", + "Offset": "7", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 42 limit :__upper_limit", + "Values": [ + "42" + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 234 limit :__upper_limit", + "Values": [ + "234" + ], + "Vindex": "user_index" + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } } ] From 18e0d72d040c4409761abf1e3034260336a3336d Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 16 Jun 2025 12:56:19 +0200 Subject: [PATCH 2/2] adapt to v21 Signed-off-by: Andres Taylor --- go/vt/vtgate/planbuilder/testdata/union_cases.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/go/vt/vtgate/planbuilder/testdata/union_cases.json b/go/vt/vtgate/planbuilder/testdata/union_cases.json index aeeebb5136d..2893a215063 100644 --- a/go/vt/vtgate/planbuilder/testdata/union_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/union_cases.json @@ -1854,7 +1854,6 @@ "comment": "Merged UNION with limit and offset", "query": "(select id from user where id = 42) union (select id from user where id = 42) limit 3 offset 7", "plan": { - "Type": "Passthrough", "QueryType": "SELECT", "Original": "(select id from user where id = 42) union (select id from user where id = 42) limit 3 offset 7", "Instructions": { @@ -1866,6 +1865,7 @@ }, "FieldQuery": "select id from `user` where 1 != 1 union select id from `user` where 1 != 1", "Query": "select id from `user` where id = 42 union select id from `user` where id = 42 limit 7, 3", + "Table": "`user`", "Values": [ "42" ], @@ -1880,7 +1880,6 @@ "comment": "Un-merged UNION with limit and offset", "query": "(select id from user where id = 42) union all (select id from user where id = 234) limit 3 offset 7", "plan": { - "Type": "Complex", "QueryType": "SELECT", "Original": "(select id from user where id = 42) union all (select id from user where id = 234) limit 3 offset 7", "Instructions": { @@ -1900,6 +1899,7 @@ }, "FieldQuery": "select id from `user` where 1 != 1", "Query": "select id from `user` where id = 42 limit :__upper_limit", + "Table": "`user`", "Values": [ "42" ], @@ -1914,6 +1914,7 @@ }, "FieldQuery": "select id from `user` where 1 != 1", "Query": "select id from `user` where id = 234 limit :__upper_limit", + "Table": "`user`", "Values": [ "234" ],