Skip to content

Commit aaf0f2c

Browse files
authored
Merge pull request #220 from Bugadinho/return-sqlserver
Implement returning method on SQL Server
2 parents 044cf35 + 5669392 commit aaf0f2c

File tree

7 files changed

+40
-3
lines changed

7 files changed

+40
-3
lines changed

delete.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,15 @@ func (db *DeleteBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
223223

224224
db.injection.WriteTo(buf, deleteMarkerAfterDeleteFrom)
225225

226+
if flavor == SQLServer {
227+
if len(db.returning) > 0 {
228+
buf.WriteLeadingString("OUTPUT ")
229+
buf.WriteStringsPrefixed("DELETED.", db.returning, ", ")
230+
}
231+
232+
db.injection.WriteTo(buf, insertMarkerAfterReturning)
233+
}
234+
226235
if db.WhereClause != nil {
227236
db.whereClauseProxy.WhereClause = db.WhereClause
228237
defer func() {

delete_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func TestDeleteBuilderReturning(t *testing.T) {
129129
a.Equal("DELETE FROM user WHERE id = ? RETURNING id, deleted_at", sql)
130130

131131
sql, _ = db.BuildWithFlavor(SQLServer)
132-
a.Equal("DELETE FROM user WHERE id = @p1", sql)
132+
a.Equal("DELETE FROM user OUTPUT DELETED.id, DELETED.deleted_at WHERE id = @p1", sql)
133133

134134
sql, _ = db.BuildWithFlavor(CQL)
135135
a.Equal("DELETE FROM user WHERE id = ?", sql)

insert.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,15 @@ func (ib *InsertBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
200200
ib.injection.WriteTo(buf, insertMarkerAfterCols)
201201
}
202202

203+
if flavor == SQLServer {
204+
if len(ib.returning) > 0 {
205+
buf.WriteLeadingString("OUTPUT ")
206+
buf.WriteStringsPrefixed("INSERTED.", ib.returning, ", ")
207+
}
208+
209+
ib.injection.WriteTo(buf, insertMarkerAfterReturning)
210+
}
211+
203212
if ib.sbHolder != "" {
204213
buf.WriteString(" ")
205214
buf.WriteString(ib.sbHolder)

insert_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ func TestInsertBuilderReturning(test *testing.T) {
275275
a.Equal("INSERT INTO user (name) VALUES (?) RETURNING id", sql)
276276

277277
sql, _ = ib.BuildWithFlavor(SQLServer)
278-
a.Equal("INSERT INTO user (name) VALUES (@p1)", sql)
278+
a.Equal("INSERT INTO user (name) OUTPUT INSERTED.id VALUES (@p1)", sql)
279279

280280
sql, _ = ib.BuildWithFlavor(CQL)
281281
a.Equal("INSERT INTO user (name) VALUES (?)", sql)

stringbuilder.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ func (sb *stringBuilder) WriteStrings(ss []string, sep string) {
5656
}
5757
}
5858

59+
func (sb *stringBuilder) WriteStringsPrefixed(prefix string, ss []string, sep string) {
60+
prefixedSs := []string{}
61+
62+
for _, s := range ss {
63+
prefixedSs = append(prefixedSs, prefix+s)
64+
}
65+
66+
sb.WriteStrings(prefixedSs, sep)
67+
}
68+
5969
func (sb *stringBuilder) WriteRune(r rune) {
6070
sb.builder.WriteRune(r)
6171
}

update.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,15 @@ func (ub *UpdateBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
301301

302302
ub.injection.WriteTo(buf, updateMarkerAfterSet)
303303

304+
if flavor == SQLServer {
305+
if len(ub.returning) > 0 {
306+
buf.WriteLeadingString("OUTPUT ")
307+
buf.WriteStringsPrefixed("INSERTED.", ub.returning, ", ")
308+
}
309+
310+
ub.injection.WriteTo(buf, insertMarkerAfterReturning)
311+
}
312+
304313
if flavor != MySQL {
305314
// For ISO SQL, CTE table names should be written after FROM keyword.
306315
if ub.cteBuilder != nil {

update_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ func TestUpdateBuilderReturning(t *testing.T) {
197197
a.Equal("UPDATE user SET name = ? WHERE id = ? RETURNING id, updated_at", sql)
198198

199199
sql, _ = ub.BuildWithFlavor(SQLServer)
200-
a.Equal("UPDATE user SET name = @p1 WHERE id = @p2", sql)
200+
a.Equal("UPDATE user SET name = @p1 OUTPUT INSERTED.id, INSERTED.updated_at WHERE id = @p2", sql)
201201

202202
sql, _ = ub.BuildWithFlavor(CQL)
203203
a.Equal("UPDATE user SET name = ? WHERE id = ?", sql)

0 commit comments

Comments
 (0)