From 2ebb1f3258acdc0ad1c7916471c3883c4a8c4e69 Mon Sep 17 00:00:00 2001
From: Pietjan Oostra
Date: Mon, 21 Jul 2025 16:58:12 +0200
Subject: [PATCH] Add SubQuery to InserBuilder
---
insert.go | 10 ++++++++++
internal/tests/tests_test.go | 22 ++++++++++++++++++++++
2 files changed, 32 insertions(+)
diff --git a/insert.go b/insert.go
index f612e5a..7c165ad 100644
--- a/insert.go
+++ b/insert.go
@@ -39,6 +39,16 @@ func (q *InsertBuilder) Values(values ...interface{}) *InsertBuilder {
return q
}
+// SubQuery add values from a subquery to the insert query.
+func (q *InsertBuilder) SubQuery(v SelectQuery) *InsertBuilder {
+ if len(v.Fields()) != len(q.fields) {
+ panic(`Number of values has to match the number of fields`)
+ }
+
+ q.values = append(q.values, []Field{MakeField(v)})
+ return q
+}
+
// Upsert turns the INSERT query into an upsert query, only usable if your driver supports it
func (q *InsertBuilder) Upsert(query Query, conflict ...Field) *InsertBuilder {
if q.ignoreConflict {
diff --git a/internal/tests/tests_test.go b/internal/tests/tests_test.go
index 620b480..9a43f71 100644
--- a/internal/tests/tests_test.go
+++ b/internal/tests/tests_test.go
@@ -67,10 +67,12 @@ func runTests(t *testing.T) {
if driver == `msqb.Driver` {
testUpsertSeparate(t)
testInsert(t)
+ testInsertSubQuery(t)
testUpsertSeparate(t)
} else {
testUpsert(t)
testInsert(t)
+ testInsertSubQuery(t)
testUpsert(t)
}
if driver == `pgqb.Driver` {
@@ -179,6 +181,26 @@ func testInsert(test *testing.T) {
tx.MustCommit()
}
+func testInsertSubQuery(test *testing.T) {
+ o := model.One()
+ sq := o.Select(o.ID, qb.Value(1), qb.Value(`Test comment sq`))
+
+ t := model.Two()
+
+ tx := db.MustBegin()
+
+ q := t.Insert(t.OneID, t.Number, t.Comment).
+ SubQuery(sq).
+ Values(1, 2, `Test comment 2`)
+
+ res := tx.MustExec(q)
+
+ assert := assert.New(test)
+ assert.Eq(int64(2), res.MustRowsAffected())
+
+ tx.MustCommit()
+}
+
func testUpdate(test *testing.T) {
t := model.Two()