diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index bcbf6126da5ae44706349e413e0c7e8fc7b4aa0a..47808a419151f9da5db55c8c9073856a81f2dbdb 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.256 2010/02/26 02:01:34 momjian Exp $ + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.257 2010/04/14 23:52:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -4158,7 +4158,24 @@ exec_eval_expr(PLpgSQL_execstate *estate, errmsg("query \"%s\" did not return data", expr->query))); /* - * If there are no rows selected, the result is NULL. + * Check that the expression returns exactly one column... + */ + if (estate->eval_tuptable->tupdesc->natts != 1) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg_plural("query \"%s\" returned %d column", + "query \"%s\" returned %d columns", + estate->eval_tuptable->tupdesc->natts, + expr->query, + estate->eval_tuptable->tupdesc->natts))); + + /* + * ... and get the column's datatype. + */ + *rettype = SPI_gettypeid(estate->eval_tuptable->tupdesc, 1); + + /* + * If there are no rows selected, the result is a NULL of that type. */ if (estate->eval_processed == 0) { @@ -4167,26 +4184,17 @@ exec_eval_expr(PLpgSQL_execstate *estate, } /* - * Check that the expression returned one single Datum + * Check that the expression returned no more than one row. */ - if (estate->eval_processed > 1) + if (estate->eval_processed != 1) ereport(ERROR, (errcode(ERRCODE_CARDINALITY_VIOLATION), errmsg("query \"%s\" returned more than one row", expr->query))); - if (estate->eval_tuptable->tupdesc->natts != 1) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg_plural("query \"%s\" returned %d column", - "query \"%s\" returned %d columns", - estate->eval_tuptable->tupdesc->natts, - expr->query, - estate->eval_tuptable->tupdesc->natts))); /* - * Return the result and its type + * Return the single result Datum. */ - *rettype = SPI_gettypeid(estate->eval_tuptable->tupdesc, 1); return SPI_getbinval(estate->eval_tuptable->vals[0], estate->eval_tuptable->tupdesc, 1, isNull); }