Przed PostgreSQL 9.1 INSERT/UPDATE/DELETE mogły być używane tylko jako instrukcje najwyższego poziomu. Dlatego pojawia się błąd składni.
Począwszy od wersji 9.1 można używać instrukcji modyfikujących dane ze wspólnymi wyrażeniami tabelowymi. Twoje przykładowe zapytanie wyglądałoby tak:
WITH updated AS (UPDATE test SET description = 'test' RETURNING id)
SELECT * FROM test WHERE id IN (SELECT id FROM updated);
Bądź ostrożny przy wyborze z właśnie zmodyfikowanej tabeli. W ten sposób możesz uzyskać mylące wyniki. Ponieważ zapytania są wykonywane w tej samej migawce, SELECT nie zobaczy efektów instrukcji UPDATE.