RETURN 5;
END;
$$;
-CALL test_proc2();
-ERROR: cannot return a value from a procedure
-CONTEXT: PL/pgSQL function test_proc2() while casting return value to function's return type
+ERROR: RETURN cannot have a parameter in a procedure
+LINE 5: RETURN 5;
+ ^
CREATE TABLE test1 (a int);
CREATE PROCEDURE test_proc3(x int)
LANGUAGE plpgsql
(2 rows)
DROP PROCEDURE test_proc1;
-DROP PROCEDURE test_proc2;
DROP PROCEDURE test_proc3;
DROP PROCEDURE test_proc4;
DROP TABLE test1;
}
else if (!estate.retisnull)
{
- if (func->fn_prokind == PROKIND_PROCEDURE)
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("cannot return a value from a procedure")));
-
/*
* Cast result value to function's declared result type, and copy it
* out to the upper executor memory context. We must treat tuple
parser_errposition(yylloc)));
new->retvarno = plpgsql_curr_compile->out_param_varno;
}
- else if (plpgsql_curr_compile->fn_rettype == VOIDOID &&
- plpgsql_curr_compile->fn_prokind != PROKIND_PROCEDURE)
+ else if (plpgsql_curr_compile->fn_rettype == VOIDOID)
{
if (yylex() != ';')
- ereport(ERROR,
- (errcode(ERRCODE_DATATYPE_MISMATCH),
- errmsg("RETURN cannot have a parameter in function returning void"),
- parser_errposition(yylloc)));
+ {
+ if (plpgsql_curr_compile->fn_prokind == PROKIND_PROCEDURE)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("RETURN cannot have a parameter in a procedure"),
+ parser_errposition(yylloc)));
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("RETURN cannot have a parameter in function returning void"),
+ parser_errposition(yylloc)));
+ }
}
else
{
END;
$$;
-CALL test_proc2();
-
CREATE TABLE test1 (a int);
DROP PROCEDURE test_proc1;
-DROP PROCEDURE test_proc2;
DROP PROCEDURE test_proc3;
DROP PROCEDURE test_proc4;