From 72a3164f15b7ee37476381f56cb53a3d842646d6 Mon Sep 17 00:00:00 2001 From: Florent Poinsard Date: Wed, 9 Mar 2022 19:23:01 +0100 Subject: [PATCH 1/2] fix: use HasValues argument for EXISTS subquery instead of Name Signed-off-by: Florent Poinsard --- go/vt/sqlparser/ast_funcs.go | 2 +- go/vt/vtgate/planbuilder/rewrite.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 4f51f57558b..e48e329661c 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -1653,7 +1653,7 @@ func (es *ExtractedSubquery) GetHasValuesArg() string { func (es *ExtractedSubquery) updateAlternative() { switch original := es.Original.(type) { case *ExistsExpr: - es.alternative = NewArgument(es.argName) + es.alternative = NewArgument(es.hasValuesArg) case *Subquery: es.alternative = NewArgument(es.argName) case *ComparisonExpr: diff --git a/go/vt/vtgate/planbuilder/rewrite.go b/go/vt/vtgate/planbuilder/rewrite.go index 143fcdbc644..a8661767916 100644 --- a/go/vt/vtgate/planbuilder/rewrite.go +++ b/go/vt/vtgate/planbuilder/rewrite.go @@ -147,8 +147,8 @@ func (r *rewriter) rewriteExistsSubquery(cursor *sqlparser.Cursor, node *sqlpars } r.inSubquery++ - argName := r.reservedVars.ReserveHasValuesSubQuery() - semTableSQ.SetArgName(argName) + hasValuesArg := r.reservedVars.ReserveHasValuesSubQuery() + semTableSQ.SetHasValuesArg(hasValuesArg) cursor.Replace(semTableSQ) return nil } From 122272b955847687c3fc7d1e3c39d2f6bb39db78 Mon Sep 17 00:00:00 2001 From: Florent Poinsard Date: Wed, 9 Mar 2022 19:31:12 +0100 Subject: [PATCH 2/2] test: addition of an end-to-end test for exists subquery Signed-off-by: Florent Poinsard --- .../vtgate/queries/subquery/subquery_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/go/test/endtoend/vtgate/queries/subquery/subquery_test.go b/go/test/endtoend/vtgate/queries/subquery/subquery_test.go index 320b915839d..ba8929a6eda 100644 --- a/go/test/endtoend/vtgate/queries/subquery/subquery_test.go +++ b/go/test/endtoend/vtgate/queries/subquery/subquery_test.go @@ -42,6 +42,18 @@ func TestSubqueriesHasValues(t *testing.T) { utils.AssertMatches(t, conn, `SELECT id2 FROM t1 WHERE id1 NOT IN (SELECT id1 FROM t1 WHERE id1 > 10) ORDER BY id2`, `[[INT64(1)] [INT64(2)] [INT64(3)] [INT64(4)] [INT64(5)] [INT64(6)]]`) } +func TestSubqueriesExists(t *testing.T) { + defer cluster.PanicHandler(t) + ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + defer conn.Close() + + defer utils.Exec(t, conn, `delete from t1`) + utils.Exec(t, conn, "insert into t1(id1, id2) values (0,1),(1,2),(2,3),(3,4),(4,5),(5,6)") + utils.AssertMatches(t, conn, `SELECT id2 FROM t1 WHERE EXISTS (SELECT id1 FROM t1 WHERE id1 > 0)`, `[[INT64(1)] [INT64(5)] [INT64(2)] [INT64(3)] [INT64(4)] [INT64(6)]]`) +} + func TestQueryAndSubQWithLimit(t *testing.T) { conn, err := mysql.Connect(context.Background(), &vtParams) require.NoError(t, err)