Avant PostgreSQL 9.1, INSERT/UPDATE/DELETE ne pouvait être utilisé que comme des instructions de niveau supérieur. C'est pourquoi vous obtenez une erreur de syntaxe.
À partir de la version 9.1, vous pouvez utiliser des instructions de modification de données avec des expressions de table courantes. Votre exemple de requête ressemblerait à ceci :
WITH updated AS (UPDATE test SET description = 'test' RETURNING id)
SELECT * FROM test WHERE id IN (SELECT id FROM updated);
Soyez prudent lorsque vous sélectionnez dans le tableau qui vient d'être modifié. Vous pouvez obtenir des résultats déroutants de cette façon. Parce que les requêtes sont exécutées dans le même instantané, le SELECT ne verra pas les effets de l'instruction UPDATE.