Skip to content

Commit eb77f78

Browse files
authored
Merge pull request #133 from cemremengu/insertselect
add subselect builder for insert
2 parents fd93ff9 + 9c1c183 commit eb77f78

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

insert.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const (
1313
insertMarkerAfterInsertInto
1414
insertMarkerAfterCols
1515
insertMarkerAfterValues
16+
insertMarkerAfterSelect
1617
)
1718

1819
// NewInsertBuilder creates a new INSERT builder.
@@ -40,6 +41,8 @@ type InsertBuilder struct {
4041

4142
injection *injection
4243
marker injectionMarker
44+
45+
sbHolder string
4346
}
4447

4548
var _ Builder = new(InsertBuilder)
@@ -89,6 +92,13 @@ func (ib *InsertBuilder) Cols(col ...string) *InsertBuilder {
8992
return ib
9093
}
9194

95+
// Select returns a new SelectBuilder to build a SELECT statement inside the INSERT INTO.
96+
func (isb *InsertBuilder) Select(col ...string) *SelectBuilder {
97+
sb := Select(col...)
98+
isb.sbHolder = isb.args.Add(sb)
99+
return sb
100+
}
101+
92102
// Values adds a list of values for a row in INSERT.
93103
func (ib *InsertBuilder) Values(value ...interface{}) *InsertBuilder {
94104
placeholders := make([]string, 0, len(value))
@@ -167,6 +177,14 @@ func (ib *InsertBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
167177
ib.injection.WriteTo(buf, insertMarkerAfterCols)
168178
}
169179

180+
if ib.sbHolder != "" {
181+
buf.WriteString(" ")
182+
buf.WriteString(ib.sbHolder)
183+
184+
ib.injection.WriteTo(buf, insertMarkerAfterSelect)
185+
return ib.args.CompileWithFlavor(buf.String(), flavor, initialArg...)
186+
}
187+
170188
if len(ib.values) > 0 {
171189
buf.WriteLeadingString("VALUES ")
172190
values := make([]string, 0, len(ib.values))

insert_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,35 @@ func ExampleInsertBuilder_SQL() {
179179
// /* before */ INSERT INTO demo.user PARTITION (p0) (id, name, status, created_at) /* after cols */ VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE status = ?
180180
// [3 Shawn Du 1 1234567890 1]
181181
}
182+
183+
func ExampleInsertBuilder_subSelect() {
184+
ib := NewInsertBuilder()
185+
ib.InsertInto("demo.user")
186+
ib.Cols("id", "name")
187+
sb := ib.Select("id", "name").From("demo.test")
188+
sb.Where(sb.EQ("id", 1))
189+
190+
sql, args := ib.Build()
191+
fmt.Println(sql)
192+
fmt.Println(args)
193+
194+
// Output:
195+
// INSERT INTO demo.user (id, name) SELECT id, name FROM demo.test WHERE id = ?
196+
// [1]
197+
}
198+
199+
func ExampleInsertBuilder_subSelect_oracle() {
200+
ib := Oracle.NewInsertBuilder()
201+
ib.InsertInto("demo.user")
202+
ib.Cols("id", "name")
203+
sb := ib.Select("id", "name").From("demo.test")
204+
sb.Where(sb.EQ("id", 1))
205+
206+
sql, args := ib.Build()
207+
fmt.Println(sql)
208+
fmt.Println(args)
209+
210+
// Output:
211+
// INSERT INTO demo.user (id, name) SELECT id, name FROM demo.test WHERE id = :1
212+
// [1]
213+
}

0 commit comments

Comments
 (0)