*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/indexcmds.c,v 1.90 2002/09/23 00:42:48 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/indexcmds.c,v 1.91 2002/10/19 20:15:08 tgl Exp $
*
*-------------------------------------------------------------------------
*/
if (IsTransactionBlock())
elog(ERROR, "REINDEX DATABASE cannot run inside a BEGIN/END block");
+ /* Running this from a function would free the function context */
+ if (!MemoryContextContains(QueryContext, (void *) dbname))
+ elog(ERROR, "REINDEX DATABASE cannot be executed from a function");
+
/*
* Create a memory context that will survive forced transaction
* commits we do below. Since it is a child of QueryContext, it will
for (i = 0; i < relcnt; i++)
{
StartTransactionCommand(true);
+ SetQuerySnapshot(); /* might be needed for functional index */
if (reindex_relation(relids[i], force))
elog(NOTICE, "relation %u was reindexed", relids[i]);
CommitTransactionCommand(true);
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.241 2002/09/27 20:57:08 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.242 2002/10/19 20:15:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
* multiple tables).
*/
if (vacstmt->vacuum)
+ {
StartTransactionCommand(true);
+ SetQuerySnapshot(); /* might be needed for functional index */
+ }
else
old_context = MemoryContextSwitchTo(anl_context);
/* Begin a transaction for vacuuming this relation */
StartTransactionCommand(true);
+ SetQuerySnapshot(); /* might be needed for functional index */
/*
* Check for user-requested abort. Note we want this to be inside a
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.304 2002/10/18 22:05:35 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.305 2002/10/19 20:15:09 tgl Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
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))
+ /*
+ * Set snapshot if utility stmt needs one. Most reliable
+ * way to do this seems to be to enumerate those that do not
+ * need one; this is a short list. Transaction control,
+ * LOCK, and SET must *not* set a snapshot since they need
+ * to be executable at the start of a serializable transaction
+ * without freezing a snapshot. By extension we allow SHOW
+ * not to set a snapshot. The other stmts listed are just
+ * efficiency hacks. Beware of listing anything that can
+ * modify the database --- if, say, it has to update a
+ * functional index, then it had better have a snapshot.
+ */
+ if (! (IsA(utilityStmt, TransactionStmt) ||
+ IsA(utilityStmt, LockStmt) ||
+ IsA(utilityStmt, VariableSetStmt) ||
+ IsA(utilityStmt, VariableShowStmt) ||
+ IsA(utilityStmt, VariableResetStmt) ||
+ IsA(utilityStmt, ConstraintsSetStmt) ||
+ /* efficiency hacks from here down */
+ IsA(utilityStmt, FetchStmt) ||
+ IsA(utilityStmt, ListenStmt) ||
+ IsA(utilityStmt, NotifyStmt) ||
+ IsA(utilityStmt, UnlistenStmt) ||
+ IsA(utilityStmt, CheckPointStmt)))
SetQuerySnapshot();
/* end transaction block if transaction or variable stmt */
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface ");
- puts("$Revision: 1.304 $ $Date: 2002/10/18 22:05:35 $\n");
+ puts("$Revision: 1.305 $ $Date: 2002/10/19 20:15:09 $\n");
}
/*