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()