BUG #2954: null is not checked against domain constraints in return clause
The following bug has been logged online:
Bug reference: 2954
Logged by: Sergiy Vyshnevetskiy
Email address: serg@vostok.net
PostgreSQL version: 8.2.1
Operating system: FreeBSD-6 stable
Description: null is not checked against domain constraints in return
clause
Details:
#psql = serg@[local]:5432 test
create domain "DInt" as int not null;
CREATE DOMAIN
#psql = serg@[local]:5432 test
create or replace function test() returns "DInt" immutable strict language
plpgsql as $F$begin return null; end$F$;
CREATE FUNCTION
#psql = serg@[local]:5432 test
select test() is null;
?column?
----------
t
(1 запись)
#psql = serg@[local]:5432 test
We should have gotten an error during execution of test().
I believe the bug to be here:
/* Normal case for scalar results */
estate->retval = exec_eval_expr(estate, stmt->expr,
&(estate->retisnull),
&(estate->rettype));
in exec_stmt_return() in pl_exec.c.
As I understand it, exec_eval_expr overwrites(!) estate->rettype instead
of casting the result to it.
What should be done is something like:
Datum value;
Oid valtype;
value = exec_eval_expr(estate, stmt->expr, &(estate->retisnull),
&valtype);
estate->retval = exec_cast_value(value, valtype, estate->rettype,
reqinput,
reqioparam,
reqtypmod,
estate->retisnull);
but where to get reqinput, reqioparam and reqtypmod? They should be
accessed through estate pointer, I think.
Sergiy Vyshnevetskiy <serg@vostok.net> writes:
I believe the bug to be here:
/* Normal case for scalar results */
estate->retval = exec_eval_expr(estate, stmt->expr,
&(estate->retisnull),
&(estate->rettype));
in exec_stmt_return() in pl_exec.c.
No, I don't think that code is wrong, the problem is that it's never
reached. See the
else if (!estate.retisnull)
line a bit further up. Probably you can fix it with a small change to
check type strictness there.
regards, tom lane