aboutsummaryrefslogtreecommitdiff
path: root/src/pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/pl')
-rw-r--r--src/pl/plperl/plperl.c16
-rw-r--r--src/pl/plpgsql/src/pl_handler.c9
-rw-r--r--src/pl/plpython/plpy_cursorobject.c4
-rw-r--r--src/pl/plpython/plpy_elog.c13
-rw-r--r--src/pl/plpython/plpy_exec.c12
-rw-r--r--src/pl/plpython/plpy_spi.c4
-rw-r--r--src/pl/plpython/plpy_typeio.c5
-rw-r--r--src/pl/tcl/pltcl.c14
8 files changed, 12 insertions, 65 deletions
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index c480999c51d..f0fb3085523 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -1862,20 +1862,15 @@ plperl_call_handler(PG_FUNCTION_ARGS)
else
retval = plperl_func_handler(fcinfo);
}
- PG_CATCH();
+ PG_FINALLY();
{
current_call_data = save_call_data;
activate_interpreter(oldinterp);
if (this_call_data.prodesc)
decrement_prodesc_refcount(this_call_data.prodesc);
- PG_RE_THROW();
}
PG_END_TRY();
- current_call_data = save_call_data;
- activate_interpreter(oldinterp);
- if (this_call_data.prodesc)
- decrement_prodesc_refcount(this_call_data.prodesc);
return retval;
}
@@ -1958,22 +1953,15 @@ plperl_inline_handler(PG_FUNCTION_ARGS)
if (SPI_finish() != SPI_OK_FINISH)
elog(ERROR, "SPI_finish() failed");
}
- PG_CATCH();
+ PG_FINALLY();
{
if (desc.reference)
SvREFCNT_dec_current(desc.reference);
current_call_data = save_call_data;
activate_interpreter(oldinterp);
- PG_RE_THROW();
}
PG_END_TRY();
- if (desc.reference)
- SvREFCNT_dec_current(desc.reference);
-
- current_call_data = save_call_data;
- activate_interpreter(oldinterp);
-
error_context_stack = pl_error_context.previous;
PG_RETURN_VOID();
diff --git a/src/pl/plpgsql/src/pl_handler.c b/src/pl/plpgsql/src/pl_handler.c
index e92deb32ca4..1b592c8a525 100644
--- a/src/pl/plpgsql/src/pl_handler.c
+++ b/src/pl/plpgsql/src/pl_handler.c
@@ -264,19 +264,14 @@ plpgsql_call_handler(PG_FUNCTION_ARGS)
else
retval = plpgsql_exec_function(func, fcinfo, NULL, !nonatomic);
}
- PG_CATCH();
+ PG_FINALLY();
{
- /* Decrement use-count, restore cur_estate, and propagate error */
+ /* Decrement use-count, restore cur_estate */
func->use_count--;
func->cur_estate = save_cur_estate;
- PG_RE_THROW();
}
PG_END_TRY();
- func->use_count--;
-
- func->cur_estate = save_cur_estate;
-
/*
* Disconnect from SPI manager
*/
diff --git a/src/pl/plpython/plpy_cursorobject.c b/src/pl/plpython/plpy_cursorobject.c
index e4d543a4d46..b44ce7e225f 100644
--- a/src/pl/plpython/plpy_cursorobject.c
+++ b/src/pl/plpython/plpy_cursorobject.c
@@ -228,13 +228,11 @@ PLy_cursor_plan(PyObject *ob, PyObject *args)
plan->values[j] = PLy_output_convert(arg, elem, &isnull);
nulls[j] = isnull ? 'n' : ' ';
}
- PG_CATCH();
+ PG_FINALLY();
{
Py_DECREF(elem);
- PG_RE_THROW();
}
PG_END_TRY();
- Py_DECREF(elem);
}
portal = SPI_cursor_open(NULL, plan->plan, plan->values, nulls,
diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c
index 25930f99d78..15cc444af8e 100644
--- a/src/pl/plpython/plpy_elog.c
+++ b/src/pl/plpython/plpy_elog.c
@@ -141,7 +141,7 @@ PLy_elog_impl(int elevel, const char *fmt,...)
(constraint_name) ? err_generic_string(PG_DIAG_CONSTRAINT_NAME,
constraint_name) : 0));
}
- PG_CATCH();
+ PG_FINALLY();
{
if (fmt)
pfree(emsg.data);
@@ -151,19 +151,8 @@ PLy_elog_impl(int elevel, const char *fmt,...)
pfree(tbmsg);
Py_XDECREF(exc);
Py_XDECREF(val);
-
- PG_RE_THROW();
}
PG_END_TRY();
-
- if (fmt)
- pfree(emsg.data);
- if (xmsg)
- pfree(xmsg);
- if (tbmsg)
- pfree(tbmsg);
- Py_XDECREF(exc);
- Py_XDECREF(val);
}
/*
diff --git a/src/pl/plpython/plpy_exec.c b/src/pl/plpython/plpy_exec.c
index 920322e912b..6994d7c10b9 100644
--- a/src/pl/plpython/plpy_exec.c
+++ b/src/pl/plpython/plpy_exec.c
@@ -403,18 +403,13 @@ PLy_exec_trigger(FunctionCallInfo fcinfo, PLyProcedure *proc)
}
}
}
- PG_CATCH();
+ PG_FINALLY();
{
Py_XDECREF(plargs);
Py_XDECREF(plrv);
-
- PG_RE_THROW();
}
PG_END_TRY();
- Py_DECREF(plargs);
- Py_DECREF(plrv);
-
return rv;
}
@@ -1052,15 +1047,12 @@ PLy_procedure_call(PLyProcedure *proc, const char *kargs, PyObject *vargs)
*/
Assert(list_length(explicit_subtransactions) >= save_subxact_level);
}
- PG_CATCH();
+ PG_FINALLY();
{
PLy_abort_open_subtransactions(save_subxact_level);
- PG_RE_THROW();
}
PG_END_TRY();
- PLy_abort_open_subtransactions(save_subxact_level);
-
/* If the Python code returned an error, propagate it */
if (rv == NULL)
PLy_elog(ERROR, NULL);
diff --git a/src/pl/plpython/plpy_spi.c b/src/pl/plpython/plpy_spi.c
index 2fe435d42b0..ed2eee0603a 100644
--- a/src/pl/plpython/plpy_spi.c
+++ b/src/pl/plpython/plpy_spi.c
@@ -249,13 +249,11 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
plan->values[j] = PLy_output_convert(arg, elem, &isnull);
nulls[j] = isnull ? 'n' : ' ';
}
- PG_CATCH();
+ PG_FINALLY();
{
Py_DECREF(elem);
- PG_RE_THROW();
}
PG_END_TRY();
- Py_DECREF(elem);
}
rv = SPI_execute_plan(plan->plan, plan->values, nulls,
diff --git a/src/pl/plpython/plpy_typeio.c b/src/pl/plpython/plpy_typeio.c
index 371e534fd22..589c76e7a76 100644
--- a/src/pl/plpython/plpy_typeio.c
+++ b/src/pl/plpython/plpy_typeio.c
@@ -925,15 +925,12 @@ PLyObject_ToBytea(PLyObToDatum *arg, PyObject *plrv,
memcpy(VARDATA(result), plrv_sc, len);
rv = PointerGetDatum(result);
}
- PG_CATCH();
+ PG_FINALLY();
{
Py_XDECREF(plrv_so);
- PG_RE_THROW();
}
PG_END_TRY();
- Py_XDECREF(plrv_so);
-
return rv;
}
diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c
index 8277d1ea857..fccd22b4f51 100644
--- a/src/pl/tcl/pltcl.c
+++ b/src/pl/tcl/pltcl.c
@@ -765,9 +765,10 @@ pltcl_handler(PG_FUNCTION_ARGS, bool pltrusted)
retval = pltcl_func_handler(fcinfo, &current_call_state, pltrusted);
}
}
- PG_CATCH();
+ PG_FINALLY();
{
/* Restore static pointer, then clean up the prodesc refcount if any */
+ /* (We're being paranoid in case an error is thrown in context deletion) */
pltcl_current_call_state = save_call_state;
if (current_call_state.prodesc != NULL)
{
@@ -775,20 +776,9 @@ pltcl_handler(PG_FUNCTION_ARGS, bool pltrusted)
if (--current_call_state.prodesc->fn_refcount == 0)
MemoryContextDelete(current_call_state.prodesc->fn_cxt);
}
- PG_RE_THROW();
}
PG_END_TRY();
- /* Restore static pointer, then clean up the prodesc refcount if any */
- /* (We're being paranoid in case an error is thrown in context deletion) */
- pltcl_current_call_state = save_call_state;
- if (current_call_state.prodesc != NULL)
- {
- Assert(current_call_state.prodesc->fn_refcount > 0);
- if (--current_call_state.prodesc->fn_refcount == 0)
- MemoryContextDelete(current_call_state.prodesc->fn_cxt);
- }
-
return retval;
}