Un-break exec_move_row() for case that a NULL tuple and tupdesc are

passed, which occurs when no rows are retrieved by a SELECT.
Mea maxima culpa ... I should have caught this.
This commit is contained in:
Tom Lane 2001-05-08 01:00:53 +00:00
parent f4832defa9
commit eb62f076d0
1 changed files with 11 additions and 14 deletions

View File

@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.41 2001/04/30 20:05:40 tgl Exp $
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.42 2001/05/08 01:00:53 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@ -1344,6 +1344,8 @@ exec_stmt_fors(PLpgSQL_execstate * estate, PLpgSQL_stmt_fors * stmt)
*/
exec_run_select(estate, stmt->query, 0);
n = SPI_processed;
tuptab = SPI_tuptable;
SPI_tuptable = NULL;
/*
* If the query didn't return any row, set the target to NULL and
@ -1363,9 +1365,6 @@ exec_stmt_fors(PLpgSQL_execstate * estate, PLpgSQL_stmt_fors * stmt)
/*
* Now do the loop
*/
tuptab = SPI_tuptable;
SPI_tuptable = NULL;
for (i = 0; i < n; i++)
{
@ -1445,6 +1444,8 @@ exec_stmt_select(PLpgSQL_execstate * estate, PLpgSQL_stmt_select * stmt)
*/
exec_run_select(estate, stmt->query, 1);
n = SPI_processed;
tuptab = SPI_tuptable;
SPI_tuptable = NULL;
/*
* If the query didn't return any row, set the target to NULL and
@ -1459,9 +1460,6 @@ exec_stmt_select(PLpgSQL_execstate * estate, PLpgSQL_stmt_select * stmt)
/*
* Put the result into the target and set found to true
*/
tuptab = SPI_tuptable;
SPI_tuptable = NULL;
exec_move_row(estate, rec, row, tuptab->vals[0], tuptab->tupdesc);
exec_set_found(estate, true);
@ -2053,6 +2051,8 @@ exec_stmt_dynfors(PLpgSQL_execstate * estate, PLpgSQL_stmt_dynfors * stmt)
pfree(querystr);
n = SPI_processed;
tuptab = SPI_tuptable;
SPI_tuptable = NULL;
/*
* If the query didn't return any row, set the target to NULL and
@ -2072,9 +2072,6 @@ exec_stmt_dynfors(PLpgSQL_execstate * estate, PLpgSQL_stmt_dynfors * stmt)
/*
* Now do the loop
*/
tuptab = SPI_tuptable;
SPI_tuptable = NULL;
for (i = 0; i < n; i++)
{
@ -2322,9 +2319,9 @@ exec_eval_expr(PLpgSQL_execstate * estate,
* Check that the expression returned one single Datum
*/
if (SPI_processed > 1)
elog(ERROR, "query \"%s\" didn't return a single value", expr->query);
elog(ERROR, "query \"%s\" returned more than one row", expr->query);
if (SPI_tuptable->tupdesc->natts != 1)
elog(ERROR, "query \"%s\" didn't return a single value", expr->query);
elog(ERROR, "query \"%s\" returned more than one column", expr->query);
/*
* Return the result and its type
@ -2630,14 +2627,14 @@ exec_move_row(PLpgSQL_execstate * estate,
if (i < t_natts)
{
value = SPI_getbinval(tup, tupdesc, i + 1, &isnull);
valtype = SPI_gettypeid(tupdesc, i + 1);
}
else
{
value = (Datum) 0;
isnull = true;
valtype = InvalidOid;
}
/* tupdesc should have entries for all columns I expect... */
valtype = SPI_gettypeid(tupdesc, i + 1);
exec_assign_value(estate, estate->datums[row->varnos[i]],
value, valtype, &isnull);