CHECK constraint fails when it's not supposed to

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi All,

I encountered an odd issue regarding check constraints complaining when they're not really violated.

For this particular machine, I am running 8.3.7, but on a machine running 8.3.5, it seems to have succeeded. I also upgraded a third machine from 8.3.5 to 8.3.7, and the query succeeded (so I'm thinking it's not related to different postgres versions)

I have a table called "m_class" and the definition is something like this:

tii=# \d m_class
                                              Table "public.m_class"
Column | Type | Modifiers -------------------------+-------------------------- +-------------------------------------------------------------- id | integer | not null default nextval(('m_class_id_seq'::text)::regclass)
 class_type              | smallint                 | not null
 title                   | character varying(100)   | not null
...snip...
date_setup | timestamp with time zone | not null default ('now'::text)::date
 date_start              | timestamp with time zone | not null
 date_end                | timestamp with time zone | not null
term_length | interval | not null default '5 years'::interval
...snip...
 max_portfolio_file_size | integer                  |
Indexes:
    "m_class_pkey" PRIMARY KEY, btree (id)
    "m_class_account_idx" btree (account)
    "m_class_instructor_idx" btree (instructor)
Check constraints:
    "end_after_start_check" CHECK (date_end >= date_start)
"end_within_term_length" CHECK (date_end <= (date_start + term_length)) "min_password_length_check" CHECK (length(enrollment_password::text) >= 4)
    "positive_term_length" CHECK (term_length > '00:00:00'::interval)
    "start_after_setup_check" CHECK (date_start >= date_setup)
...snip...

When I run my update, it fails:
tii=# begin; update only "public"."m_class" set date_end='2009-09-03 05:38:24.030331-07',term_length='177 days 17:59:09.868431' where id='2652020';
BEGIN
ERROR: new row for relation "m_class" violates check constraint "end_within_term_length"
tii=# rollback;
ROLLBACK

The data reads:
tii=# select date_start, date_end, term_length, '2009-09-03 05:38:24.030331-07'::timestamptz - date_start AS new_term_length from m_class where id = 2652020; date_start | date_end | term_length | new_term_length -----------------------------+----------------------------- +-------------+-------------------------- 2009-03-09 11:39:14.1619-07 | 2009-04-08 11:39:14.1619-07 | 30 days | 177 days 17:59:09.868431


Based on new_term_length, the update should succeed. However, it doesn't. Would anyone have an explanation?

Thanks for your help!
--Richard

--
Sent via pgsql-performance mailing list (pgsql-performance@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance

[Postgresql General]     [Postgresql PHP]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Yosemite]

  Powered by Linux