How about this patch?

Of course, it might be a rare case that such check is necessary...


Toru SHIMOGAKI wrote:
> The following bug has been logged online:
> 
> Bug reference:      2704
> Logged by:          Toru SHIMOGAKI
> Email address:      [EMAIL PROTECTED]
> PostgreSQL version: 8.1.4
> Operating system:   Red Hat Enterprise Linux AS 4
> Description:        pg_class.relchecks overflow problem
> Details: 
> 
> Hi, 
> 
> pg_class.relchecks is defined as int2. But the upper bound of this value is
> not checked and it overflows.
> 
> 
> I found it at the following case:
> 
> 1. I tried to add check constraints:
> 
> "alter table test_a add check (aaa > i);" (0 <= i <= 32767)
> 
> 
> 2. When I added the 32768th check constraint, the value of pg_class.relchecs
> became -32768.
> 
> postgres=# alter table test_a add check ( aaa > 32768 );
> ALTER TABLE
> postgres=# select relname, relchecks from pg_class where relname =
> 'test_a';
> relname | relchecks
> ---------+-----------
> test_a | -32768
> (1 row)
> 
> 
> 3. The following error message was found when I added the next one:
> 
> postgres=# alter table test_a add check ( aaa > 32769 );
> ERROR: unexpected constraint record found for rel test_a
> postgres=# select relname, relchecks from pg_class where relname =
> 'test_a';
> relname | relchecks
> ---------+-----------
> test_a | -32768
> (1 row)
> 
> 
> Best regards,
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 1: if posting/reading through Usenet, please send an appropriate
>        subscribe-nomail command to [EMAIL PROTECTED] so that your
>        message can get through to the mailing list cleanly
> 
> 

-- 
Toru SHIMOGAKI<[EMAIL PROTECTED]>
diff -cpr postgresql-8.1.5-orig/src/backend/catalog/heap.c 
postgresql-8.1.5/src/backend/catalog/heap.c
*** postgresql-8.1.5-orig/src/backend/catalog/heap.c    2006-04-24 
10:40:39.000000000 +0900
--- postgresql-8.1.5/src/backend/catalog/heap.c 2006-10-23 16:50:22.000000000 
+0900
*************** AddRelationRawConstraints(Relation rel,
*** 1525,1530 ****
--- 1525,1535 ----
                        continue;
                Assert(cdef->cooked_expr == NULL);
  
+               if (numchecks == 0x7FFF)
+                       ereport(ERROR,
+                                       
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+                         errmsg("cannot have more than 2^15-1 checks in a 
table")));
+ 
                /*
                 * Transform raw parsetree to executable expression.
                 */
---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

Reply via email to