{
                    /*
                     * Initialize the magic SQLSTATE and SQLERRM variables for
-                    * the exception block. We needn't do this until we have
-                    * found a matching exception.
+                    * the exception block; this also frees values from any
+                    * prior use of the same exception. We needn't do this
+                    * until we have found a matching exception.
                     */
                    PLpgSQL_var *state_var;
                    PLpgSQL_var *errm_var;
 
                    rc = exec_stmts(estate, exception->action);
 
-                   free_var(state_var);
-                   state_var->value = (Datum) 0;
-                   state_var->isnull = true;
-                   free_var(errm_var);
-                   errm_var->value = (Datum) 0;
-                   errm_var->isnull = true;
-
                    break;
                }
            }
 
  
 (1 row)
 
+create function excpt_test4() returns text as $$
+begin
+   begin perform 1/0;
+   exception when others then return sqlerrm; end;
+end; $$ language plpgsql;
+select excpt_test4();
+   excpt_test4    
+------------------
+ division by zero
+(1 row)
+
 drop function excpt_test1();
 drop function excpt_test2();
 drop function excpt_test3();
+drop function excpt_test4();
 -- parameters of raise stmt can be expressions
 create function raise_exprs() returns void as $$
 declare
 
        raise notice '% %', sqlstate, sqlerrm;
     end;
 end; $$ language plpgsql;
-
 select excpt_test3();
+
+create function excpt_test4() returns text as $$
+begin
+   begin perform 1/0;
+   exception when others then return sqlerrm; end;
+end; $$ language plpgsql;
+select excpt_test4();
+
 drop function excpt_test1();
 drop function excpt_test2();
 drop function excpt_test3();
+drop function excpt_test4();
 
 -- parameters of raise stmt can be expressions
 create function raise_exprs() returns void as $$