Commit afeb8c48 authored by Tom Lane's avatar Tom Lane

Clean up some unnecessary fragility in EXECUTE command.

parent f9d6ffc5
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* procedural language * procedural language
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.33 2000/12/01 20:43:59 tgl Exp $ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.34 2001/01/04 02:38:02 tgl Exp $
* *
* This software is copyrighted by Jan Wieck - Hamburg. * This software is copyrighted by Jan Wieck - Hamburg.
* *
...@@ -1951,6 +1951,7 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate, ...@@ -1951,6 +1951,7 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate,
HeapTuple typetup; HeapTuple typetup;
Form_pg_type typeStruct; Form_pg_type typeStruct;
FmgrInfo finfo_output; FmgrInfo finfo_output;
int exec_res;
/* ---------- /* ----------
* First we evaluate the string expression after the * First we evaluate the string expression after the
...@@ -1960,7 +1961,7 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate, ...@@ -1960,7 +1961,7 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate,
*/ */
query = exec_eval_expr(estate, stmt->query, &isnull, &restype); query = exec_eval_expr(estate, stmt->query, &isnull, &restype);
if (isnull) if (isnull)
elog(ERROR, "cannot EXECUTE NULL-query"); elog(ERROR, "cannot EXECUTE NULL query");
/* ---------- /* ----------
* Get the C-String representation. * Get the C-String representation.
...@@ -1986,26 +1987,30 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate, ...@@ -1986,26 +1987,30 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate,
/* ---------- /* ----------
* Call SPI_exec() without preparing a saved plan. * Call SPI_exec() without preparing a saved plan.
* The returncode can be any OK except for OK_SELECT. * The returncode can be any standard OK. Note that
* while a SELECT is allowed, its results will be discarded.
* ---------- * ----------
*/ */
switch(SPI_exec(querystr, 0)) exec_res = SPI_exec(querystr, 0);
switch (exec_res)
{ {
case SPI_OK_UTILITY: case SPI_OK_SELECT:
case SPI_OK_SELINTO: case SPI_OK_SELINTO:
case SPI_OK_INSERT: case SPI_OK_INSERT:
case SPI_OK_UPDATE: case SPI_OK_UPDATE:
case SPI_OK_DELETE: case SPI_OK_DELETE:
case SPI_OK_UTILITY:
break; break;
case SPI_OK_SELECT: case 0:
elog(ERROR, "unexpected SELECT operation in EXECUTE of query '%s'", /* Also allow a zero return, which implies the querystring
querystr); * contained no commands.
*/
break; break;
default: default:
elog(ERROR, "unexpected error in EXECUTE for query '%s'", elog(ERROR, "unexpected error %d in EXECUTE of query '%s'",
querystr); exec_res, querystr);
break; break;
} }
...@@ -2095,7 +2100,7 @@ exec_stmt_dynfors(PLpgSQL_execstate * estate, PLpgSQL_stmt_dynfors * stmt) ...@@ -2095,7 +2100,7 @@ exec_stmt_dynfors(PLpgSQL_execstate * estate, PLpgSQL_stmt_dynfors * stmt)
* ---------- * ----------
*/ */
if (SPI_exec(querystr, 0) != SPI_OK_SELECT) if (SPI_exec(querystr, 0) != SPI_OK_SELECT)
elog(ERROR, "FOR ... EXECUTE query '%s' was no SELECT", querystr); elog(ERROR, "FOR ... EXECUTE query '%s' was not SELECT", querystr);
pfree(querystr); pfree(querystr);
n = SPI_processed; n = SPI_processed;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment