Skip to content

Commit

Permalink
Support update and delete returning using output (#116)
Browse files Browse the repository at this point in the history
* add from as valid clause for update

* add support to RETURNING using OUTPUT
  • Loading branch information
FrancoLiberali committed Oct 8, 2023
1 parent 9c41053 commit b8d91cb
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 3 deletions.
36 changes: 34 additions & 2 deletions sqlserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,13 @@ func New(config Config) gorm.Dialector {
}

func (dialector Dialector) Initialize(db *gorm.DB) (err error) {

// register callbacks
callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{})
callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{
CreateClauses: []string{"INSERT", "VALUES", "ON CONFLICT"},
QueryClauses: []string{"SELECT", "FROM", "WHERE", "GROUP BY", "ORDER BY", "LIMIT", "FOR"},
UpdateClauses: []string{"UPDATE", "SET", "RETURNING", "FROM", "WHERE"},
DeleteClauses: []string{"DELETE", "FROM", "RETURNING", "WHERE"},
})
db.Callback().Create().Replace("gorm:create", Create)
db.Callback().Update().Replace("gorm:update", Update)

Expand Down Expand Up @@ -97,6 +101,34 @@ func (dialector Dialector) ClauseBuilders() map[string]clause.ClauseBuilder {
}
}
},
"RETURNING": func(c clause.Clause, builder clause.Builder) {
if returning, ok := c.Expression.(clause.Returning); ok {
if stmt, ok := builder.(*gorm.Statement); ok {
var outputTable string
if _, ok := stmt.Clauses["UPDATE"]; ok {
outputTable = "INSERTED"
} else if _, ok := stmt.Clauses["DELETE"]; ok {
outputTable = "DELETED"
}

if outputTable != "" {
stmt.WriteString("OUTPUT ")

if len(returning.Columns) > 0 {
columns := []clause.Column{}
for _, column := range returning.Columns {
column.Table = outputTable
columns = append(columns, column)
}
returning.Columns = columns
returning.Build(stmt)
} else {
stmt.WriteString(outputTable + ".*")
}
}
}
}
},
}
}

Expand Down
4 changes: 3 additions & 1 deletion update.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import (
"gorm.io/gorm/callbacks"
)

var updateFunc = callbacks.Update(&callbacks.Config{})
var updateFunc = callbacks.Update(&callbacks.Config{
UpdateClauses: []string{"UPDATE", "SET", "RETURNING", "FROM", "WHERE"},
})

func Update(db *gorm.DB) {
if db.Statement.Schema != nil && db.Statement.Schema.PrioritizedPrimaryField != nil && db.Statement.Schema.PrioritizedPrimaryField.AutoIncrement {
Expand Down

0 comments on commit b8d91cb

Please sign in to comment.