From 880e669f978a59c8699f81f9e4332b82fadaef05 Mon Sep 17 00:00:00 2001 From: Willem de Groot Date: Thu, 17 Jul 2025 20:17:23 +0200 Subject: [PATCH] Support DELETE with JOIN on subquery --- .../testdata/delete_join/mysql/db/query.sql.go | 11 +++++++++++ .../endtoend/testdata/delete_join/mysql/query.sql | 7 ++++++- internal/engine/dolphin/utils.go | 9 +++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/internal/endtoend/testdata/delete_join/mysql/db/query.sql.go b/internal/endtoend/testdata/delete_join/mysql/db/query.sql.go index b333a344e1..c1670b5443 100644 --- a/internal/endtoend/testdata/delete_join/mysql/db/query.sql.go +++ b/internal/endtoend/testdata/delete_join/mysql/db/query.sql.go @@ -30,6 +30,17 @@ func (q *Queries) DeleteJoin(ctx context.Context, arg DeleteJoinParams) error { return err } +const deleteJoinWithSubquery = `-- name: DeleteJoinWithSubquery :exec +DELETE pt +FROM primary_table pt +JOIN (SELECT 1 as id) jt ON pt.id = jt.id +` + +func (q *Queries) DeleteJoinWithSubquery(ctx context.Context) error { + _, err := q.db.ExecContext(ctx, deleteJoinWithSubquery) + return err +} + const deleteLeftJoin = `-- name: DeleteLeftJoin :exec DELETE jt.*, pt.* diff --git a/internal/endtoend/testdata/delete_join/mysql/query.sql b/internal/endtoend/testdata/delete_join/mysql/query.sql index d802ae12f1..d29062f90e 100644 --- a/internal/endtoend/testdata/delete_join/mysql/query.sql +++ b/internal/endtoend/testdata/delete_join/mysql/query.sql @@ -26,4 +26,9 @@ FROM RIGHT JOIN primary_table as pt ON jt.primary_table_id = pt.id WHERE jt.id = ? - AND pt.user_id = ?; \ No newline at end of file + AND pt.user_id = ?; + +-- name: DeleteJoinWithSubquery :exec +DELETE pt +FROM primary_table pt +JOIN (SELECT 1 as id) jt ON pt.id = jt.id; diff --git a/internal/engine/dolphin/utils.go b/internal/engine/dolphin/utils.go index cd84942700..e920489e6a 100644 --- a/internal/engine/dolphin/utils.go +++ b/internal/engine/dolphin/utils.go @@ -52,6 +52,9 @@ func convertToRangeVarList(list *ast.List, result *ast.List) { if !ok { if list, check := rel.Larg.(*ast.List); check { convertToRangeVarList(list, result) + } else if subselect, check := rel.Larg.(*ast.RangeSubselect); check { + // Handle subqueries in JOIN clauses + result.Items = append(result.Items, subselect) } else { panic("expected range var") } @@ -64,6 +67,9 @@ func convertToRangeVarList(list *ast.List, result *ast.List) { if !ok { if list, check := rel.Rarg.(*ast.List); check { convertToRangeVarList(list, result) + } else if subselect, check := rel.Rarg.(*ast.RangeSubselect); check { + // Handle subqueries in JOIN clauses + result.Items = append(result.Items, subselect) } else { panic("expected range var") } @@ -75,6 +81,9 @@ func convertToRangeVarList(list *ast.List, result *ast.List) { case *ast.RangeVar: result.Items = append(result.Items, rel) + case *ast.RangeSubselect: + result.Items = append(result.Items, rel) + default: panic("expected range var") }