You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: implement Returning method for UpdateBuilder and DeleteBuilder
Fixes#210
This commit adds the Returning method to both UpdateBuilder and DeleteBuilder,
following the same implementation pattern as InsertBuilder.
Changes:
- Add returning field to UpdateBuilder and DeleteBuilder structs
- Add updateMarkerAfterReturning and deleteMarkerAfterReturning markers
- Implement Returning methods for both builders
- Add RETURNING clause support for PostgreSQL and SQLite flavors
- Add comprehensive test coverage including:
- Basic functionality tests
- Flavor-specific behavior tests
- Edge cases (empty, single, multiple columns)
- Complex scenarios (ORDER BY, LIMIT, CTE)
- SQL injection compatibility
- Method chaining validation
The RETURNING clause is properly positioned after LIMIT and is ignored
for database flavors that don't support it (MySQL, SQL Server, CQL,
ClickHouse, Presto).
Example usage:
ub := Update("users").Set("name = ?", "John").Where("id = ?", 1).Returning("id", "updated_at")
db := DeleteFrom("users").Where("status = ?", "inactive").Returning("id", "deleted_at")
db7.Where("user.id IN (SELECT id FROM temp_user)")
191
+
db7.Returning("id", "deleted_at")
192
+
193
+
sql, _=db7.BuildWithFlavor(PostgreSQL)
194
+
a.Equal("WITH temp_user AS (SELECT id FROM inactive_users) DELETE FROM user, temp_user WHERE user.id IN (SELECT id FROM temp_user) RETURNING id, deleted_at", sql)
ub7.Where("user.id IN (SELECT id FROM temp_user)")
264
+
ub7.Returning("id", "status")
265
+
266
+
sql, _=ub7.BuildWithFlavor(PostgreSQL)
267
+
a.Equal("WITH temp_user AS (SELECT id FROM active_users) UPDATE user SET status = $1 FROM temp_user WHERE user.id IN (SELECT id FROM temp_user) RETURNING id, status", sql)
0 commit comments