Each write-statement (INSERT, UPDATE, or DELETE) supports an optional RETURNING predicate that makes the statement return a results set with the manipulated tuples. From a conceptual point of view, it is as if these INSERT, UPDATE, and DELETE commands are immediately followed by an automatic SELECT statement.
This feature is very useful. It allows us to get back the exact values of the manipulated tuples, such as an automatically generated key, a computed timestamp, or other non-predictable values. It also allows us to pipeline write statements one after another, as you will see later in this chapter.
Let's take a look at the RETURNING function in action. Imagine that we need to insert some random data into the files table, as follows:
testdb=> INSERT INTO files( f_name, f_hash, f_size )
SELECT 'file_' || v || '...