Add support for RETURNING
to INSERT
/UPDATE
/DELETE
statements
#47161
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation / Background
This pull request adds support for
RETURNING
clauses toINSERT
/UPDATE
/DELETE
statements in Arel. This is useful to build queries that modify data and return it (or something else) in the same query.The following example builds a query that deletes all data from a counter queue table and returns the aggregated counter delta values.
Detail
To add support for
RETURNING
, this pull request adds a returning method to the sStatement and manager classes for insert, upsert, and delete. It also modifies the ToSql and Dot visitors to incorporate the returning statement (should there be one) into their output.Additional information
The
RETURNING
syntax is supported in both PostgreSQL (INSERT, UPDATE, DELETE) and Sqlite3 (INSERT, UPDATE, DELETE). MySQL does not supportRETURNING
on any of these statements at the moment.This pull request does not add
RETURNING
support to ActiveRecord itself (as discussed in #39968 and #42955). Nonetheless, I think this change to just Arel is useful in its own right to build more complex queries when needed.Checklist
Before submitting the PR make sure the following are checked:
[Fix #issue-number]