aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pl/plpgsql/src/pl_exec.c53
1 files changed, 39 insertions, 14 deletions
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 1ad04739a33..dc5fed5cf7a 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.43 2001/05/21 14:22:19 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.44 2001/05/28 19:33:24 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -185,7 +185,7 @@ plpgsql_exec_function(PLpgSQL_function * func, FunctionCallInfo fcinfo)
*/
if (error_info_func != NULL)
{
- elog(DEBUG, "Last error occured while executing PL/pgSQL function %s",
+ elog(NOTICE, "Error occurred while executing PL/pgSQL function %s",
error_info_func->fn_name);
if (error_info_stmt != NULL)
{
@@ -248,15 +248,15 @@ plpgsql_exec_function(PLpgSQL_function * func, FunctionCallInfo fcinfo)
stmttype = "unknown";
break;
}
- elog(DEBUG, "line %d at %s", error_info_stmt->lineno,
+ elog(NOTICE, "line %d at %s", error_info_stmt->lineno,
stmttype);
}
else
{
if (error_info_text != NULL)
- elog(DEBUG, "%s", error_info_text);
+ elog(NOTICE, "%s", error_info_text);
else
- elog(DEBUG, "no more error information available");
+ elog(NOTICE, "no more error information available");
}
error_info_func = NULL;
@@ -491,7 +491,7 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
*/
if (error_info_func != NULL)
{
- elog(DEBUG, "Last error occured while executing PL/pgSQL function %s",
+ elog(NOTICE, "Error occurred while executing PL/pgSQL function %s",
error_info_func->fn_name);
if (error_info_stmt != NULL)
{
@@ -548,15 +548,15 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
stmttype = "unknown";
break;
}
- elog(DEBUG, "line %d at %s", error_info_stmt->lineno,
+ elog(NOTICE, "line %d at %s", error_info_stmt->lineno,
stmttype);
}
else
{
if (error_info_text != NULL)
- elog(DEBUG, "%s", error_info_text);
+ elog(NOTICE, "%s", error_info_text);
else
- elog(DEBUG, "no more error information available");
+ elog(NOTICE, "no more error information available");
}
error_info_func = NULL;
@@ -1065,15 +1065,41 @@ exec_stmt(PLpgSQL_execstate * estate, PLpgSQL_stmt * stmt)
/* ----------
* exec_stmt_assign Evaluate an expression and
* put the result into a variable.
+ *
+ * For no very good reason, this is also used for PERFORM statements.
* ----------
*/
static int
exec_stmt_assign(PLpgSQL_execstate * estate, PLpgSQL_stmt_assign * stmt)
{
- if (stmt->varno < 0)
- exec_assign_expr(estate, NULL, stmt->expr);
+ PLpgSQL_expr *expr = stmt->expr;
+
+ if (stmt->varno >= 0)
+ exec_assign_expr(estate, estate->datums[stmt->varno], expr);
else
- exec_assign_expr(estate, estate->datums[stmt->varno], stmt->expr);
+ {
+ /*
+ * PERFORM: evaluate query and discard result. This cannot share
+ * code with the assignment case since we do not wish to constraint
+ * the discarded result to be only one row/column.
+ */
+ int rc;
+
+ SPI_tuptable = NULL;
+ SPI_processed = 0;
+
+ /*
+ * If not already done create a plan for this expression
+ */
+ if (expr->plan == NULL)
+ exec_prepare_plan(estate, expr);
+
+ rc = exec_run_select(estate, expr, 0, NULL);
+ if (rc != SPI_OK_SELECT)
+ elog(ERROR, "query \"%s\" didn't return data", expr->query);
+
+ SPI_freetuptable(SPI_tuptable);
+ }
return PLPGSQL_RC_OK;
}
@@ -2608,8 +2634,7 @@ exec_assign_expr(PLpgSQL_execstate * estate, PLpgSQL_datum * target,
bool isnull = false;
value = exec_eval_expr(estate, expr, &isnull, &valtype);
- if (target != NULL)
- exec_assign_value(estate, target, value, valtype, &isnull);
+ exec_assign_value(estate, target, value, valtype, &isnull);
SPI_freetuptable(SPI_tuptable);
}