From 71de4f0774043ce36ad69cd559ad7a62c920dc52 Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Thu, 19 Jun 2025 10:37:51 -0700 Subject: [PATCH] Relax `INSERT`-`SELECT` to work with partial select statements This allows you to insert from compound selects, values, and more. --- .../Statements/Insert.swift | 14 +++-------- .../StructuredQueriesTests/InsertTests.swift | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Sources/StructuredQueriesCore/Statements/Insert.swift b/Sources/StructuredQueriesCore/Statements/Insert.swift index b6d96a5a..606c095e 100644 --- a/Sources/StructuredQueriesCore/Statements/Insert.swift +++ b/Sources/StructuredQueriesCore/Statements/Insert.swift @@ -303,13 +303,11 @@ extension Table { V1, each V2, C1: QueryExpression, - each C2: QueryExpression, - From, - Joins + each C2: QueryExpression >( or conflictResolution: ConflictResolution? = nil, _ columns: (TableColumns) -> (TableColumn, repeat TableColumn), - select selection: () -> Select<(C1, repeat each C2), From, Joins>, + select selection: () -> some PartialSelectStatement<(C1, repeat each C2)>, onConflictDoUpdate updates: ((inout Updates) -> Void)? = nil, @QueryFragmentBuilder where updateFilter: (TableColumns) -> [QueryFragment] = { _ in [] } @@ -346,14 +344,12 @@ extension Table { each V2, C1: QueryExpression, each C2: QueryExpression, - From, - Joins, T1, each T2 >( or conflictResolution: ConflictResolution? = nil, _ columns: (TableColumns) -> (TableColumn, repeat TableColumn), - select selection: () -> Select<(C1, repeat each C2), From, Joins>, + select selection: () -> some PartialSelectStatement<(C1, repeat each C2)>, onConflict conflictTargets: (TableColumns) -> ( TableColumn, repeat TableColumn ), @@ -380,13 +376,11 @@ extension Table { private static func _insert< each Value, each ResultColumn: QueryExpression, - From, - Joins, each ConflictTarget >( or conflictResolution: ConflictResolution? = nil, _ columns: (TableColumns) -> (repeat TableColumn), - select selection: () -> Select<(repeat each ResultColumn), From, Joins>, + select selection: () -> some PartialSelectStatement<(repeat each ResultColumn)>, onConflict conflictTargets: (TableColumns) -> (repeat TableColumn)?, @QueryFragmentBuilder where targetFilter: (TableColumns) -> [QueryFragment] = { _ in [] }, diff --git a/Tests/StructuredQueriesTests/InsertTests.swift b/Tests/StructuredQueriesTests/InsertTests.swift index c7406866..7ecef2e3 100644 --- a/Tests/StructuredQueriesTests/InsertTests.swift +++ b/Tests/StructuredQueriesTests/InsertTests.swift @@ -227,6 +227,31 @@ extension SnapshotTests { └─────────────────────┘ """ } + + assertQuery( + Tag.insert { + $0.title + } select: { + Values("vacation") + } + .returning(\.self) + ) { + """ + INSERT INTO "tags" + ("title") + SELECT 'vacation' + RETURNING "id", "title" + """ + } results: { + """ + ┌─────────────────────┐ + │ Tag( │ + │ id: 8, │ + │ title: "vacation" │ + │ ) │ + └─────────────────────┘ + """ + } } @Test func draft() {