From: | "Kevin Grittner" <Kevin(dot)Grittner(at)wicourts(dot)gov> |
---|---|
To: | <atrigent(at)ccs(dot)neu(dot)edu>,"Greg Stark" <stark(at)mit(dot)edu> |
Cc: | <pgsql-bugs(at)postgresql(dot)org> |
Subject: | Re: BUG #6612: Functions can be called inside CHECK statements |
Date: | 2012-04-25 15:06:48 |
Message-ID: | 4F97CCB80200002500047332@gw.wicourts.gov |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
Greg Stark <stark(at)mit(dot)edu> wrote:
> Only IMMUTABLE functions can be used in CHECK constraints.
> It's a feature that expressions including subqueries are
> automatically detected as not being immutable and automatically
> barred.
It doesn't look like that to me:
test=# create function xxx() returns text volatile language plpgsql
as $$ begin return 'xxx'; end; $$;
CREATE FUNCTION
test=# create table x (id int not null primary key, val text check
(val <> xxx()));
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index
"x_pkey" for table "x"
CREATE TABLE
test=# insert into x values (1, 'aaa');
INSERT 0 1
test=# insert into x values (2, 'xxx');
ERROR: new row for relation "x" violates check constraint
"x_val_check"
DETAIL: Failing row contains (2, xxx).
Perhaps you're thinking of function usage in index definitions?
A CHECK constraint using a volatile function is potentially valid
and useful, IMO. Think about a column which is supposed to record
the moment of an event which has occurred. It could make sense to
ensure that the timestamptz value is < now(); On the other hand, an
index entry based on now() is clearly a problem.
Otherwise I agree with your response -- this is clearly *not* a bug.
-Kevin
From | Date | Subject | |
---|---|---|---|
Next Message | Kevin Grittner | 2012-04-25 15:10:05 | Re: Broken Pipe Error |
Previous Message | Greg Stark | 2012-04-25 14:57:08 | Re: BUG #6612: Functions can be called inside CHECK statements |