I said: > ... So I had > been thinking of pulling it out to postgres.c anyway. I will do that.
I did this and ended up with a rather long list of statement types that might need a snapshot: elog(DEBUG2, "ProcessUtility"); /* set snapshot if utility stmt needs one */ /* XXX maybe cleaner to list those that shouldn't set one? */ if (IsA(utilityStmt, AlterTableStmt) || IsA(utilityStmt, ClusterStmt) || IsA(utilityStmt, CopyStmt) || IsA(utilityStmt, ExecuteStmt) || IsA(utilityStmt, ExplainStmt) || IsA(utilityStmt, IndexStmt) || IsA(utilityStmt, PrepareStmt) || IsA(utilityStmt, ReindexStmt)) SetQuerySnapshot(); (Anything that can call the planner or might create entries in functional indexes had better set a snapshot, thus stuff like ReindexStmt has the issue.) I wonder if we should turn this around, and set a snapshot for all utility statements that can't show cause why they don't need one. Offhand, TransactionStmt, FetchStmt, and VariableSet/Show/Reset might be the only ones that need be excluded. Comments? regards, tom lane ---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ? http://www.postgresql.org/users-lounge/docs/faq.html