44 * procedural language
55 *
66 * IDENTIFICATION
7- * $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.52 2004/03/24 23:38:49 tgl Exp $
7+ * $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.53 2004/04/15 13:01:45 tgl Exp $
88 *
99 * This software is copyrighted by Jan Wieck - Hamburg.
1010 *
@@ -1136,8 +1136,12 @@ stmt_return: K_RETURN lno
11361136new ->retrecno= -1 ;
11371137new ->retrowno= -1 ;
11381138
1139- if (plpgsql_curr_compile->fn_retistuple &&
1140- !plpgsql_curr_compile->fn_retset)
1139+ if (plpgsql_curr_compile->fn_retset)
1140+ {
1141+ if (yylex () !=' ;' )
1142+ yyerror (" RETURN cannot have a parameter in function returning set; use RETURN NEXT" );
1143+ }
1144+ else if (plpgsql_curr_compile->fn_retistuple)
11411145{
11421146switch (yylex ())
11431147{
@@ -1153,14 +1157,17 @@ stmt_return: K_RETURN lno
11531157break ;
11541158
11551159default :
1156- yyerror (" return type mismatch in function returning tuple" );
1160+ yyerror (" RETURN must specify a record or row variable in function returning tuple" );
11571161break ;
11581162}
11591163if (yylex () !=' ;' )
1160- yyerror (" expected \" ; \" " );
1164+ yyerror (" RETURN must specify a record or row variable in function returning tuple " );
11611165}
11621166else
1167+ {
1168+ /* ordinary expression case*/
11631169new ->expr = plpgsql_read_expression(' ;' ," ;" );
1170+ }
11641171
11651172new ->cmd_type = PLPGSQL_STMT_RETURN;
11661173new ->lineno =$2 ;
@@ -1173,6 +1180,9 @@ stmt_return_next: K_RETURN_NEXT lno
11731180{
11741181PLpgSQL_stmt_return_next *new ;
11751182
1183+ if (!plpgsql_curr_compile->fn_retset)
1184+ yyerror (" cannot use RETURN NEXT in a non-SETOF function" );
1185+
11761186new = malloc(sizeof (PLpgSQL_stmt_return_next));
11771187memset (new ,0 ,sizeof (PLpgSQL_stmt_return_next));
11781188
@@ -1188,10 +1198,10 @@ stmt_return_next: K_RETURN_NEXT lno
11881198else if (tok == T_ROW)
11891199new ->row = yylval.row;
11901200else
1191- yyerror (" incorrect argument to RETURN NEXT " );
1201+ yyerror (" RETURN NEXT must specify a record or row variable in function returning tuple " );
11921202
11931203if (yylex () !=' ;' )
1194- yyerror (" expected \" ; \" " );
1204+ yyerror (" RETURN NEXT must specify a record or row variable in function returning tuple " );
11951205}
11961206else
11971207new ->expr = plpgsql_read_expression(' ;' ," ;" );