{
/*
* 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 $$