diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c
index ac8d6046c3157bdb4b7297569d362bbfeb9b0a47..28e08f43d53164a2a3ad47dbe126ae4697184214 100644
--- a/src/pl/tcl/pltcl.c
+++ b/src/pl/tcl/pltcl.c
@@ -31,7 +31,7 @@
  *	  ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.68 2002/12/30 22:10:54 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.69 2003/02/06 17:02:11 tgl Exp $
  *
  **********************************************************************/
 
@@ -1255,7 +1255,7 @@ static int
 pltcl_elog(ClientData cdata, Tcl_Interp *interp,
 		   int argc, CONST84 char *argv[])
 {
-	int			level;
+	volatile int level;
 	sigjmp_buf	save_restart;
 
 	/************************************************************
@@ -1264,18 +1264,6 @@ pltcl_elog(ClientData cdata, Tcl_Interp *interp,
 	if (pltcl_restart_in_progress)
 		return TCL_ERROR;
 
-	/************************************************************
-	 * Catch the restart longjmp and begin a controlled
-	 * return though all interpreter levels if it happens
-	 ************************************************************/
-	memcpy(&save_restart, &Warn_restart, sizeof(save_restart));
-	if (sigsetjmp(Warn_restart, 1) != 0)
-	{
-		memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
-		pltcl_restart_in_progress = 1;
-		return TCL_ERROR;
-	}
-
 	if (argc != 3)
 	{
 		Tcl_SetResult(interp, "syntax error - 'elog level msg'",
@@ -1301,17 +1289,29 @@ pltcl_elog(ClientData cdata, Tcl_Interp *interp,
 	{
 		Tcl_AppendResult(interp, "Unknown elog level '", argv[1],
 						 "'", NULL);
+		return TCL_ERROR;
+	}
+
+	/************************************************************
+	 * Catch the longjmp from elog() and begin a controlled
+	 * return though all interpreter levels if it happens
+	 ************************************************************/
+	memcpy(&save_restart, &Warn_restart, sizeof(save_restart));
+	if (sigsetjmp(Warn_restart, 1) != 0)
+	{
 		memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
+		pltcl_restart_in_progress = 1;
 		return TCL_ERROR;
 	}
 
 	/************************************************************
 	 * Call elog(), restore the original restart address
-	 * and return to the caller (if not catched)
+	 * and return to the caller (if no longjmp)
 	 ************************************************************/
 	UTF_BEGIN;
 	elog(level, "%s", UTF_U2E(argv[2]));
 	UTF_END;
+
 	memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
 	return TCL_OK;
 }