Quando lo provi, ricevi l'errore:
ERROR: CREATE DATABASE cannot run inside a transaction block
Questo viene da src/backend/access/transam/xact.c (riga 3023 sui miei sorgenti, ma varia in base alla versione), in PreventTransactionChain(...) .
Il commento lì spiega che:
Per CREATE DATABASE viene chiamato da src/backend/tcop/utility.c in standard_ProcessUtility nel caso di T_CreatedbStmt , ma sfortunatamente non c'è alcun commento informativo che spieghi perché in particolare CREATE DATABASE non è sicuro da eseguire in una transazione.
Guardando le fonti, posso vedere che per prima cosa forza un checkpoint.
Nel complesso, però, non vedo nulla che urli davvero "non possiamo farlo a livello transazionale". È più "non abbiamo implementato la funzionalità per farlo in modo transazionale".